From baldrick at free.fr Mon Apr 19 03:18:57 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Apr 2010 08:18:57 -0000 Subject: [llvm-commits] [dragonegg] r101770 - in /dragonegg/trunk/extras: buildbot_self_strap buildbot_self_strap-32 do_self_strap Message-ID: <20100419081857.E89542A6C12C@llvm.org> Author: baldrick Date: Mon Apr 19 03:18:57 2010 New Revision: 101770 URL: http://llvm.org/viewvc/llvm-project?rev=101770&view=rev Log: Run "svn cleanup" in the buildbot specific scripts, rather than doing this potentially dangerous operation in the generic self-host script that people may use directly. Modified: dragonegg/trunk/extras/buildbot_self_strap dragonegg/trunk/extras/buildbot_self_strap-32 dragonegg/trunk/extras/do_self_strap Modified: dragonegg/trunk/extras/buildbot_self_strap URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap?rev=101770&r1=101769&r2=101770&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap (original) +++ dragonegg/trunk/extras/buildbot_self_strap Mon Apr 19 03:18:57 2010 @@ -14,4 +14,5 @@ export GCC_OPTIONS="--enable-languages=c,c++,fortran,objc,obj-c++ --with-mpfr=/opt/cfarm/mpfr-2.4.1 --with-gmp=/opt/cfarm/gmp-4.2.4 --with-mpc=/opt/cfarm/mpc-0.8 --with-libelf=/opt/cfarm/libelf-0.8.12" cd $BUILD_DIR +svn cleanup gcc # In case a previous run was interrupted while checking out gcc $DRAGONEGG_SOURCE/extras/do_self_strap Modified: dragonegg/trunk/extras/buildbot_self_strap-32 URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap-32?rev=101770&r1=101769&r2=101770&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap-32 (original) +++ dragonegg/trunk/extras/buildbot_self_strap-32 Mon Apr 19 03:18:57 2010 @@ -18,4 +18,5 @@ export LLVM_OPTIONS="--build=i686-pc-linux-gnu" cd $BUILD_DIR +svn cleanup gcc # In case a previous run was interrupted while checking out gcc $DRAGONEGG_SOURCE/extras/do_self_strap Modified: dragonegg/trunk/extras/do_self_strap URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/do_self_strap?rev=101770&r1=101769&r2=101770&view=diff ============================================================================== --- dragonegg/trunk/extras/do_self_strap (original) +++ dragonegg/trunk/extras/do_self_strap Mon Apr 19 03:18:57 2010 @@ -98,8 +98,6 @@ svn co -r $GCC_REVISION svn://gcc.gnu.org/svn/gcc/trunk $GCC_SOURCE elif [ ! -L $GCC_SOURCE ] ; then # Do not update symbolic links. This is # for the benefit of the buildbots. - echo "Running svn cleanup" - svn cleanup $GCC_SOURCE echo "Reverting any applied patches" svn revert -R $GCC_SOURCE/gcc echo "Updating GCC" From baldrick at free.fr Mon Apr 19 08:44:32 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Apr 2010 13:44:32 -0000 Subject: [llvm-commits] [dragonegg] r101773 - /dragonegg/trunk/extras/buildbot_self_strap-32 Message-ID: <20100419134432.8D0FF2A6C12C@llvm.org> Author: baldrick Date: Mon Apr 19 08:44:32 2010 New Revision: 101773 URL: http://llvm.org/viewvc/llvm-project?rev=101773&view=rev Log: Try to have the 32 bit buildbot build some more languages. Modified: dragonegg/trunk/extras/buildbot_self_strap-32 Modified: dragonegg/trunk/extras/buildbot_self_strap-32 URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap-32?rev=101773&r1=101772&r2=101773&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap-32 (original) +++ dragonegg/trunk/extras/buildbot_self_strap-32 Mon Apr 19 08:44:32 2010 @@ -14,7 +14,7 @@ export CXX="g++ -m32" export LD_LIBRARY_PATH=$HOME/cfarm-32/lib:$LD_LIBRARY_PATH export CPPFLAGS="-I/$HOME/cfarm-32/include" -export GCC_OPTIONS="--build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" +export GCC_OPTIONS="--enable-languages=c,c++,fortran,objc,obj-c++ --build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" export LLVM_OPTIONS="--build=i686-pc-linux-gnu" cd $BUILD_DIR From baldrick at free.fr Mon Apr 19 10:24:24 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Apr 2010 15:24:24 -0000 Subject: [llvm-commits] [zorg] r101775 - /zorg/trunk/buildbot/osuosl/master/config/builders.py Message-ID: <20100419152424.8E6732A6C12C@llvm.org> Author: baldrick Date: Mon Apr 19 10:24:24 2010 New Revision: 101775 URL: http://llvm.org/viewvc/llvm-project?rev=101775&view=rev Log: Replace baldrick15 with baldrick13 because baldrick15 does not work reliably. Modified: zorg/trunk/buildbot/osuosl/master/config/builders.py Modified: zorg/trunk/buildbot/osuosl/master/config/builders.py URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/buildbot/osuosl/master/config/builders.py?rev=101775&r1=101774&r2=101775&view=diff ============================================================================== --- zorg/trunk/buildbot/osuosl/master/config/builders.py (original) +++ zorg/trunk/buildbot/osuosl/master/config/builders.py Mon Apr 19 10:24:24 2010 @@ -213,7 +213,7 @@ build_script='buildbot_self_strap-32') }, {'name' : 'dragonegg-x86_64-linux', - 'slavenames' : ['baldrick15', 'baldrick17'], + 'slavenames' : ['baldrick13', 'baldrick17'], 'builddir' : 'dragonegg-x86_64-linux', 'factory' : DragonEggBuilder.getBuildFactory(triple='x86_64-pc-linux-gnu'), }, ] From gohman at apple.com Mon Apr 19 10:26:57 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 08:26:57 -0700 Subject: [llvm-commits] [llvm] r101463 - in /llvm/trunk: include/llvm/Analysis/InlineCost.h lib/Analysis/InlineCost.cpp In-Reply-To: <47580F9E-B5E3-4224-AF7D-EB9ECA6F0D89@apple.com> References: <20100416151450.E3D8C2A6C12C@llvm.org> <47580F9E-B5E3-4224-AF7D-EB9ECA6F0D89@apple.com> Message-ID: <5E53B3A0-0E82-49BD-BF0B-F6F0D51A14B8@apple.com> On Apr 16, 2010, at 11:21 AM, Chris Lattner wrote: > > On Apr 16, 2010, at 8:14 AM, Dan Gohman wrote: > >> Author: djg >> Date: Fri Apr 16 10:14:50 2010 >> New Revision: 101463 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=101463&view=rev >> Log: >> Make callIsSmall accessible as a utility function. > > Should this become a method on CallInst? I don't think that it's any more a "VMCore" concept than an "Analysis" concept. Dan From gohman at apple.com Mon Apr 19 10:38:38 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:38:38 -0000 Subject: [llvm-commits] [llvm] r101776 - /llvm/trunk/include/llvm/ADT/StringRef.h Message-ID: <20100419153838.E19972A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:38:38 2010 New Revision: 101776 URL: http://llvm.org/viewvc/llvm-project?rev=101776&view=rev Log: These functions don't need to access this. Modified: llvm/trunk/include/llvm/ADT/StringRef.h Modified: llvm/trunk/include/llvm/ADT/StringRef.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=101776&r1=101775&r2=101776&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/StringRef.h (original) +++ llvm/trunk/include/llvm/ADT/StringRef.h Mon Apr 19 10:38:38 2010 @@ -44,8 +44,8 @@ // Workaround PR5482: nearly all gcc 4.x miscompile StringRef and std::min() // Changing the arg of min to be an integer, instead of a reference to an // integer works around this bug. - size_t min(size_t a, size_t b) const { return a < b ? a : b; } - size_t max(size_t a, size_t b) const { return a > b ? a : b; } + static size_t min(size_t a, size_t b) { return a < b ? a : b; } + static size_t max(size_t a, size_t b) { return a > b ? a : b; } public: /// @name Constructors From gohman at apple.com Mon Apr 19 10:39:27 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:39:27 -0000 Subject: [llvm-commits] [llvm] r101777 - /llvm/trunk/include/llvm/MC/MCObjectWriter.h Message-ID: <20100419153927.886422A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:39:27 2010 New Revision: 101777 URL: http://llvm.org/viewvc/llvm-project?rev=101777&view=rev Log: Add a const. Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=101777&r1=101776&r2=101777&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original) +++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Mon Apr 19 10:39:27 2010 @@ -49,7 +49,7 @@ public: virtual ~MCObjectWriter(); - bool isLittleEndian() { return IsLittleEndian; } + bool isLittleEndian() const { return IsLittleEndian; } raw_ostream &getStream() { return OS; } From gohman at apple.com Mon Apr 19 10:40:15 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:40:15 -0000 Subject: [llvm-commits] [llvm] r101778 - /llvm/trunk/include/llvm/Support/ELF.h Message-ID: <20100419154015.72C572A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:40:15 2010 New Revision: 101778 URL: http://llvm.org/viewvc/llvm-project?rev=101778&view=rev Log: Add a few more ELF bits. Modified: llvm/trunk/include/llvm/Support/ELF.h Modified: llvm/trunk/include/llvm/Support/ELF.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ELF.h?rev=101778&r1=101777&r2=101778&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/ELF.h (original) +++ llvm/trunk/include/llvm/Support/ELF.h Mon Apr 19 10:40:15 2010 @@ -99,6 +99,12 @@ ET_HIPROC = 0xffff // Processor-specific }; +// Versioning +enum { + EV_NONE = 0, + EV_CURRENT = 1 +}; + // Machine architectures enum { EM_NONE = 0, // No machine @@ -129,6 +135,11 @@ ELFDATA2MSB = 2 // Big-endian object file }; +// OS ABI identification -- unused. +enum { + ELFOSABI_NONE = 0 +}; + // Section header. struct Elf32_Shdr { Elf32_Word sh_name; // Section name (index into string table) From gohman at apple.com Mon Apr 19 10:42:05 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:42:05 -0000 Subject: [llvm-commits] [llvm] r101779 - in /llvm/trunk/lib: Archive/Archive.cpp Archive/ArchiveReader.cpp VMCore/TypeSymbolTable.cpp Message-ID: <20100419154205.8C14E2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:42:05 2010 New Revision: 101779 URL: http://llvm.org/viewvc/llvm-project?rev=101779&view=rev Log: Fix -Wcast-qual warnings. Modified: llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveReader.cpp llvm/trunk/lib/VMCore/TypeSymbolTable.cpp Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=101779&r1=101778&r2=101779&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Apr 19 10:42:05 2010 @@ -241,7 +241,7 @@ // Get the module. std::auto_ptr Buffer( MemoryBuffer::getNewMemBuffer(Length, ModuleID.c_str())); - memcpy((char*)Buffer->getBufferStart(), BufPtr, Length); + memcpy(const_cast(Buffer->getBufferStart()), BufPtr, Length); Module *M = ParseBitcodeFile(Buffer.get(), Context, ErrMsg); if (!M) Modified: llvm/trunk/lib/Archive/ArchiveReader.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveReader.cpp?rev=101779&r1=101778&r2=101779&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveReader.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveReader.cpp Mon Apr 19 10:42:05 2010 @@ -349,7 +349,8 @@ "(" + I->getPath().str() + ")"; MemoryBuffer *Buffer = MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); - memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize()); + memcpy(const_cast(Buffer->getBufferStart()), + I->getData(), I->getSize()); Module *M = ParseBitcodeFile(Buffer, Context, ErrMessage); delete Buffer; @@ -489,7 +490,8 @@ mbr->getPath().str() + ")"; MemoryBuffer *Buffer =MemoryBuffer::getNewMemBuffer(mbr->getSize(), FullMemberName.c_str()); - memcpy((char*)Buffer->getBufferStart(), mbr->getData(), mbr->getSize()); + memcpy(const_cast(Buffer->getBufferStart()), + mbr->getData(), mbr->getSize()); Module *m = getLazyBitcodeModule(Buffer, Context, ErrMsg); if (!m) @@ -617,7 +619,8 @@ MemoryBuffer *Buffer = MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); - memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize()); + memcpy(const_cast(Buffer->getBufferStart()), + I->getData(), I->getSize()); Module *M = ParseBitcodeFile(Buffer, Context); delete Buffer; if (!M) Modified: llvm/trunk/lib/VMCore/TypeSymbolTable.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/TypeSymbolTable.cpp?rev=101779&r1=101778&r2=101779&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/TypeSymbolTable.cpp (original) +++ llvm/trunk/lib/VMCore/TypeSymbolTable.cpp Mon Apr 19 10:42:05 2010 @@ -126,13 +126,15 @@ // faster to remove them all in one pass. // for (iterator I = begin(), E = end(); I != E; ++I) { - if (I->second == (Type*)OldType) { // FIXME when Types aren't const. + // FIXME when Types aren't const. + if (I->second == const_cast(OldType)) { #if DEBUG_ABSTYPE dbgs() << "Removing type " << OldType->getDescription() << "\n"; #endif OldType->removeAbstractTypeUser(this); - I->second = (Type*)NewType; // TODO FIXME when types aren't const + // TODO FIXME when types aren't const + I->second = const_cast(NewType); if (NewType->isAbstract()) { #if DEBUG_ABSTYPE dbgs() << "Added type " << NewType->getDescription() << "\n"; From baldrick at free.fr Mon Apr 19 10:48:09 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 19 Apr 2010 15:48:09 -0000 Subject: [llvm-commits] [dragonegg] r101780 - in /dragonegg/trunk/extras: buildbot_self_strap buildbot_self_strap-32 Message-ID: <20100419154809.71A7C2A6C12C@llvm.org> Author: baldrick Date: Mon Apr 19 10:48:09 2010 New Revision: 101780 URL: http://llvm.org/viewvc/llvm-project?rev=101780&view=rev Log: Only cleanup gcc if it exists. Modified: dragonegg/trunk/extras/buildbot_self_strap dragonegg/trunk/extras/buildbot_self_strap-32 Modified: dragonegg/trunk/extras/buildbot_self_strap URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap?rev=101780&r1=101779&r2=101780&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap (original) +++ dragonegg/trunk/extras/buildbot_self_strap Mon Apr 19 10:48:09 2010 @@ -14,5 +14,7 @@ export GCC_OPTIONS="--enable-languages=c,c++,fortran,objc,obj-c++ --with-mpfr=/opt/cfarm/mpfr-2.4.1 --with-gmp=/opt/cfarm/gmp-4.2.4 --with-mpc=/opt/cfarm/mpc-0.8 --with-libelf=/opt/cfarm/libelf-0.8.12" cd $BUILD_DIR -svn cleanup gcc # In case a previous run was interrupted while checking out gcc +if [ -e gcc ] ; then + svn cleanup gcc # In case a previous run was interrupted while checking out gcc +fi $DRAGONEGG_SOURCE/extras/do_self_strap Modified: dragonegg/trunk/extras/buildbot_self_strap-32 URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap-32?rev=101780&r1=101779&r2=101780&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap-32 (original) +++ dragonegg/trunk/extras/buildbot_self_strap-32 Mon Apr 19 10:48:09 2010 @@ -18,5 +18,7 @@ export LLVM_OPTIONS="--build=i686-pc-linux-gnu" cd $BUILD_DIR -svn cleanup gcc # In case a previous run was interrupted while checking out gcc +if [ -e gcc ] ; then + svn cleanup gcc # In case a previous run was interrupted while checking out gcc +fi $DRAGONEGG_SOURCE/extras/do_self_strap From gohman at apple.com Mon Apr 19 10:54:44 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:54:44 -0000 Subject: [llvm-commits] [llvm] r101781 - /llvm/trunk/lib/System/Unix/Path.inc Message-ID: <20100419155444.750A02A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:54:44 2010 New Revision: 101781 URL: http://llvm.org/viewvc/llvm-project?rev=101781&view=rev Log: Revert 91528 and use a std::vector instead, fixing an abuse of std::string. Modified: llvm/trunk/lib/System/Unix/Path.inc Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=101781&r1=101780&r2=101781&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Mon Apr 19 10:54:44 2010 @@ -16,6 +16,7 @@ //=== is guaranteed to work on *all* UNIX variants. //===----------------------------------------------------------------------===// +#include "llvm/ADT/SmallVector.h" #include "Unix.h" #if HAVE_SYS_STAT_H #include @@ -858,15 +859,20 @@ // Append an XXXXXX pattern to the end of the file for use with mkstemp, // mktemp or our own implementation. - std::string Buf(path); + // This uses std::vector instead of SmallVector to avoid a dependence on + // libSupport. And performance isn't critical here. + std::vector Buf; + Buf.resize(path.size()+8); + char *FNBuffer = Buf.data(); + path.copy(FNBuffer,path.size()); if (isDirectory()) - Buf += "/XXXXXX"; + strcpy(FNBuffer+path.size(), "/XXXXXX"); else - Buf += "-XXXXXX"; + strcpy(FNBuffer+path.size(), "-XXXXXX"); #if defined(HAVE_MKSTEMP) int TempFD; - if ((TempFD = mkstemp((char*)Buf.c_str())) == -1) + if ((TempFD = mkstemp(FNBuffer)) == -1) return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); // We don't need to hold the temp file descriptor... we will trust that no one @@ -874,21 +880,21 @@ close(TempFD); // Save the name - path = Buf; + path = FNBuffer; #elif defined(HAVE_MKTEMP) // If we don't have mkstemp, use the old and obsolete mktemp function. - if (mktemp(Buf.c_str()) == 0) + if (mktemp(FNBuffer) == 0) return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); // Save the name - path = Buf; + path = FNBuffer; #else // Okay, looks like we have to do it all by our lonesome. static unsigned FCounter = 0; unsigned offset = path.size() + 1; - while (FCounter < 999999 && exists()) { - sprintf(Buf.data()+offset, "%06u", ++FCounter); - path = Buf; + while ( FCounter < 999999 && exists()) { + sprintf(FNBuffer+offset,"%06u",++FCounter); + path = FNBuffer; } if (FCounter > 999999) return MakeErrMsg(ErrMsg, From gohman at apple.com Mon Apr 19 10:55:10 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 15:55:10 -0000 Subject: [llvm-commits] [llvm] r101782 - /llvm/trunk/lib/System/Unix/Program.inc Message-ID: <20100419155510.9CF212A6C12C@llvm.org> Author: djg Date: Mon Apr 19 10:55:10 2010 New Revision: 101782 URL: http://llvm.org/viewvc/llvm-project?rev=101782&view=rev Log: Fix -Wcast-qual warnings. Modified: llvm/trunk/lib/System/Unix/Program.inc Modified: llvm/trunk/lib/System/Unix/Program.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Program.inc?rev=101782&r1=101781&r2=101782&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Program.inc (original) +++ llvm/trunk/lib/System/Unix/Program.inc Mon Apr 19 10:55:10 2010 @@ -206,14 +206,15 @@ if (!envp) #if !defined(__APPLE__) - envp = (const char**)environ; + envp = const_cast(environ); #else - envp = (const char**)*_NSGetEnviron(); // environ is missing in dylibs. + // environ is missing in dylibs. + envp = const_cast(*_NSGetEnviron()); #endif pid_t PID; - int Err = posix_spawn(&PID, path.c_str(), &FileActions, - /*attrp*/0, (char**)args, (char**)envp); + int Err = posix_spawn(&PID, path.c_str(), &FileActions, /*attrp*/0, + const_cast(args), const_cast(envp)); posix_spawn_file_actions_destroy(&FileActions); @@ -268,9 +269,12 @@ // Execute! if (envp != 0) - execve(path.c_str(), (char**)args, (char**)envp); + execve(path.c_str(), + const_cast(args), + const_cast(envp)); else - execv(path.c_str(), (char**)args); + execv(path.c_str(), + const_cast(args)); // If the execve() failed, we should exit. Follow Unix protocol and // return 127 if the executable was not found, and 126 otherwise. // Use _exit rather than exit so that atexit functions and static From benny.kra at googlemail.com Mon Apr 19 11:15:31 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Mon, 19 Apr 2010 16:15:31 -0000 Subject: [llvm-commits] [llvm] r101783 - in /llvm/trunk: include/llvm/Bitcode/Archive.h lib/Archive/Archive.cpp lib/Archive/ArchiveInternals.h lib/Archive/ArchiveReader.cpp lib/Archive/ArchiveWriter.cpp Message-ID: <20100419161531.733A82A6C12C@llvm.org> Author: d0k Date: Mon Apr 19 11:15:31 2010 New Revision: 101783 URL: http://llvm.org/viewvc/llvm-project?rev=101783&view=rev Log: Don't write into MemoryBuffers. Modified: llvm/trunk/include/llvm/Bitcode/Archive.h llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveInternals.h llvm/trunk/lib/Archive/ArchiveReader.cpp llvm/trunk/lib/Archive/ArchiveWriter.cpp Modified: llvm/trunk/include/llvm/Bitcode/Archive.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/Archive.h?rev=101783&r1=101782&r2=101783&view=diff ============================================================================== --- llvm/trunk/include/llvm/Bitcode/Archive.h (original) +++ llvm/trunk/include/llvm/Bitcode/Archive.h Mon Apr 19 11:15:31 2010 @@ -107,7 +107,7 @@ /// into memory, the return value will be null. /// @returns a pointer to the member's data. /// @brief Get the data content of the archive member - const void* getData() const { return data; } + const char* getData() const { return data; } /// This method determines if the member is a regular compressed file. /// @returns true iff the archive member is a compressed regular file. @@ -172,7 +172,7 @@ sys::PathWithStatus path; ///< Path of file containing the member sys::FileStatus info; ///< Status info (size,mode,date) unsigned flags; ///< Flags about the archive member - const void* data; ///< Data for the member + const char* data; ///< Data for the member /// @} /// @name Constructors Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=101783&r1=101782&r2=101783&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Apr 19 11:15:31 2010 @@ -233,15 +233,14 @@ } Module* -llvm::GetBitcodeSymbols(const unsigned char *BufPtr, unsigned Length, +llvm::GetBitcodeSymbols(const char *BufPtr, unsigned Length, const std::string& ModuleID, LLVMContext& Context, std::vector& symbols, std::string* ErrMsg) { // Get the module. std::auto_ptr Buffer( - MemoryBuffer::getNewMemBuffer(Length, ModuleID.c_str())); - memcpy(const_cast(Buffer->getBufferStart()), BufPtr, Length); + MemoryBuffer::getMemBufferCopy(StringRef(BufPtr, Length),ModuleID.c_str())); Module *M = ParseBitcodeFile(Buffer.get(), Context, ErrMsg); if (!M) Modified: llvm/trunk/lib/Archive/ArchiveInternals.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveInternals.h?rev=101783&r1=101782&r2=101783&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveInternals.h (original) +++ llvm/trunk/lib/Archive/ArchiveInternals.h Mon Apr 19 11:15:31 2010 @@ -77,7 +77,7 @@ std::vector& symbols, std::string* ErrMsg); - Module* GetBitcodeSymbols(const unsigned char*Buffer,unsigned Length, + Module* GetBitcodeSymbols(const char *Buffer, unsigned Length, const std::string& ModuleID, LLVMContext& Context, std::vector& symbols, Modified: llvm/trunk/lib/Archive/ArchiveReader.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveReader.cpp?rev=101783&r1=101782&r2=101783&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveReader.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveReader.cpp Mon Apr 19 11:15:31 2010 @@ -348,9 +348,8 @@ std::string FullMemberName = archPath.str() + "(" + I->getPath().str() + ")"; MemoryBuffer *Buffer = - MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); - memcpy(const_cast(Buffer->getBufferStart()), - I->getData(), I->getSize()); + MemoryBuffer::getMemBufferCopy(StringRef(I->getData(), I->getSize()), + FullMemberName.c_str()); Module *M = ParseBitcodeFile(Buffer, Context, ErrMessage); delete Buffer; @@ -488,10 +487,9 @@ // Now, load the bitcode module to get the Module. std::string FullMemberName = archPath.str() + "(" + mbr->getPath().str() + ")"; - MemoryBuffer *Buffer =MemoryBuffer::getNewMemBuffer(mbr->getSize(), - FullMemberName.c_str()); - memcpy(const_cast(Buffer->getBufferStart()), - mbr->getData(), mbr->getSize()); + MemoryBuffer *Buffer = + MemoryBuffer::getMemBufferCopy(StringRef(mbr->getData(), mbr->getSize()), + FullMemberName.c_str()); Module *m = getLazyBitcodeModule(Buffer, Context, ErrMsg); if (!m) @@ -540,8 +538,8 @@ std::string FullMemberName = archPath.str() + "(" + mbr->getPath().str() + ")"; Module* M = - GetBitcodeSymbols((const unsigned char*)At, mbr->getSize(), - FullMemberName, Context, symbols, error); + GetBitcodeSymbols(At, mbr->getSize(), FullMemberName, Context, + symbols, error); if (M) { // Insert the module's symbols into the symbol table @@ -618,9 +616,8 @@ archPath.str() + "(" + I->getPath().str() + ")"; MemoryBuffer *Buffer = - MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); - memcpy(const_cast(Buffer->getBufferStart()), - I->getData(), I->getSize()); + MemoryBuffer::getMemBufferCopy(StringRef(I->getData(), I->getSize()), + FullMemberName.c_str()); Module *M = ParseBitcodeFile(Buffer, Context); delete Buffer; if (!M) Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=101783&r1=101782&r2=101783&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Mon Apr 19 11:15:31 2010 @@ -226,8 +226,7 @@ std::string FullMemberName = archPath.str() + "(" + member.getPath().str() + ")"; Module* M = - GetBitcodeSymbols((const unsigned char*)data,fSize, - FullMemberName, Context, symbols, ErrMsg); + GetBitcodeSymbols(data, fSize, FullMemberName, Context, symbols, ErrMsg); // If the bitcode parsed successfully if ( M ) { From johnny.chen at apple.com Mon Apr 19 11:20:34 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 19 Apr 2010 16:20:34 -0000 Subject: [llvm-commits] [llvm] r101784 - in /llvm/trunk: lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp test/MC/Disassembler/neon-tests.txt Message-ID: <20100419162035.0A6112A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 11:20:34 2010 New Revision: 101784 URL: http://llvm.org/viewvc/llvm-project?rev=101784&view=rev Log: ARM disassembler did not react to recent changes to the NEON instruction table. VLD1q*_UPD and VST1q*_UPD have the ${dst:dregpair} operand now. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp llvm/trunk/test/MC/Disassembler/neon-tests.txt Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=101784&r1=101783&r2=101784&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Mon Apr 19 11:20:34 2010 @@ -2232,6 +2232,22 @@ return (insn >> 8) & 0xF; } +static bool UseDRegPair(unsigned Opcode) { + switch (Opcode) { + default: + return false; + case ARM::VLD1q8_UPD: + case ARM::VLD1q16_UPD: + case ARM::VLD1q32_UPD: + case ARM::VLD1q64_UPD: + case ARM::VST1q8_UPD: + case ARM::VST1q16_UPD: + case ARM::VST1q32_UPD: + case ARM::VST1q64_UPD: + return true; + } +} + // VLD* // D[d] D[d2] ... Rn [TIED_TO Rn] align [Rm] // VLD*LN* @@ -2305,11 +2321,9 @@ RegClass = OpInfo[OpIdx].RegClass; while (OpIdx < NumOps && OpInfo[OpIdx].RegClass == RegClass) { - if (Opcode >= ARM::VST1q16 && Opcode <= ARM::VST1q8) - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClass, Rd, - true))); - else - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClass,Rd))); + MI.addOperand(MCOperand::CreateReg( + getRegisterEnum(B, RegClass, Rd, + UseDRegPair(Opcode)))); Rd += Inc; ++OpIdx; } @@ -2327,11 +2341,9 @@ RegClass = OpInfo[0].RegClass; while (OpIdx < NumOps && OpInfo[OpIdx].RegClass == RegClass) { - if (Opcode >= ARM::VLD1q16 && Opcode <= ARM::VLD1q8) - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClass, Rd, - true))); - else - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClass, Rd))); + MI.addOperand(MCOperand::CreateReg( + getRegisterEnum(B, RegClass, Rd, + UseDRegPair(Opcode)))); Rd += Inc; ++OpIdx; } Modified: llvm/trunk/test/MC/Disassembler/neon-tests.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/neon-tests.txt?rev=101784&r1=101783&r2=101784&view=diff ============================================================================== --- llvm/trunk/test/MC/Disassembler/neon-tests.txt (original) +++ llvm/trunk/test/MC/Disassembler/neon-tests.txt Mon Apr 19 11:20:34 2010 @@ -9,6 +9,10 @@ # CHECK: vdup.32 q3, d1[0] 0x41 0x6c 0xb4 0xf3 +# VLD1q8_UPD (with ${dst:dregpair} operand) +# CHECK: vld1.8 {d17, d18}, [r6], r5 +0x05 0x1a 0x66 0xf4 + # CHECK: vld4.8 {d0, d1, d2, d3}, [r2], r7 0x07 0x00 0x22 0xf4 From gohman at apple.com Mon Apr 19 11:33:29 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 16:33:29 -0000 Subject: [llvm-commits] [llvm] r101785 - /llvm/trunk/lib/System/Unix/Path.inc Message-ID: <20100419163329.19E872A6C12C@llvm.org> Author: djg Date: Mon Apr 19 11:33:28 2010 New Revision: 101785 URL: http://llvm.org/viewvc/llvm-project?rev=101785&view=rev Log: Fix this for std::vectors which don't have .data(). Modified: llvm/trunk/lib/System/Unix/Path.inc Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=101785&r1=101784&r2=101785&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Mon Apr 19 11:33:28 2010 @@ -863,7 +863,7 @@ // libSupport. And performance isn't critical here. std::vector Buf; Buf.resize(path.size()+8); - char *FNBuffer = Buf.data(); + char *FNBuffer = &Buf[0]; path.copy(FNBuffer,path.size()); if (isDirectory()) strcpy(FNBuffer+path.size(), "/XXXXXX"); From johnny.chen at apple.com Mon Apr 19 12:16:40 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 19 Apr 2010 17:16:40 -0000 Subject: [llvm-commits] [llvm] r101788 - /llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Message-ID: <20100419171640.842FA2A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 12:16:40 2010 New Revision: 101788 URL: http://llvm.org/viewvc/llvm-project?rev=101788&view=rev Log: Better error-handling for DisassembleThumb2DPSoReg() where the 3-reg operand instructions should have Rd (Inst{11-8}) != 0b1111. Ref: A6.3 32-bit Thumb instruction encoding A6.3.11 Data-processing (shifted register) Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=101788&r1=101787&r2=101788&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Mon Apr 19 12:16:40 2010 @@ -1340,12 +1340,15 @@ if ((Idx = TID.getOperandConstraint(OpIdx, TOI::TIED_TO)) != -1) { // Process tied_to operand constraint. MI.addOperand(MI.getOperand(Idx)); - } else { - assert(!NoDstReg && "Internal error"); + ++OpIdx; + } else if (!NoDstReg) { MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, decodeRn(insn)))); + ++OpIdx; + } else { + DEBUG(errs() << "Thumb encoding error: d==15 for three-reg operands.\n"); + return false; } - ++OpIdx; } MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, From foldr at codedgers.com Mon Apr 19 12:25:38 2010 From: foldr at codedgers.com (Mikhail Glushenkov) Date: Mon, 19 Apr 2010 17:25:38 -0000 Subject: [llvm-commits] [llvm] r101789 - /llvm/trunk/tools/llvmc/plugins/Base/Base.td.in Message-ID: <20100419172539.007DE2A6C12C@llvm.org> Author: foldr Date: Mon Apr 19 12:25:38 2010 New Revision: 101789 URL: http://llvm.org/viewvc/llvm-project?rev=101789&view=rev Log: Support .a files directly (without -l). Modified: llvm/trunk/tools/llvmc/plugins/Base/Base.td.in Modified: llvm/trunk/tools/llvmc/plugins/Base/Base.td.in URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/plugins/Base/Base.td.in?rev=101789&r1=101788&r2=101789&view=diff ============================================================================== --- llvm/trunk/tools/llvmc/plugins/Base/Base.td.in (original) +++ llvm/trunk/tools/llvmc/plugins/Base/Base.td.in Mon Apr 19 12:25:38 2010 @@ -263,7 +263,7 @@ // Base class for linkers class llvm_gcc_based_linker : Tool< -[(in_language "object-code"), +[(in_language ["object-code", "static-library"]), (out_language "executable"), (output_suffix "out"), (command cmd_prefix), @@ -317,6 +317,7 @@ LangToSuffixes<"llvm-assembler", ["ll"]>, LangToSuffixes<"llvm-bitcode", ["bc"]>, LangToSuffixes<"object-code", ["o", "*empty*"]>, + LangToSuffixes<"static-library", ["a", "lib"]>, LangToSuffixes<"executable", ["out"]> ]>; From gohman at apple.com Mon Apr 19 12:51:31 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 17:51:31 -0000 Subject: [llvm-commits] [llvm] r101790 - /llvm/trunk/lib/System/Unix/Path.inc Message-ID: <20100419175131.383342A6C12C@llvm.org> Author: djg Date: Mon Apr 19 12:51:31 2010 New Revision: 101790 URL: http://llvm.org/viewvc/llvm-project?rev=101790&view=rev Log: This doesn't need SmallVector.h anymore. Modified: llvm/trunk/lib/System/Unix/Path.inc Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=101790&r1=101789&r2=101790&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Mon Apr 19 12:51:31 2010 @@ -16,7 +16,6 @@ //=== is guaranteed to work on *all* UNIX variants. //===----------------------------------------------------------------------===// -#include "llvm/ADT/SmallVector.h" #include "Unix.h" #if HAVE_SYS_STAT_H #include From gohman at apple.com Mon Apr 19 13:11:02 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 18:11:02 -0000 Subject: [llvm-commits] [llvm] r101793 - /llvm/trunk/Makefile.rules Message-ID: <20100419181102.56B5D2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 13:11:02 2010 New Revision: 101793 URL: http://llvm.org/viewvc/llvm-project?rev=101793&view=rev Log: Remove -module, which appears to be a leftover from prior libtool usage. Modified: llvm/trunk/Makefile.rules Modified: llvm/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=101793&r1=101792&r2=101793&view=diff ============================================================================== --- llvm/trunk/Makefile.rules (original) +++ llvm/trunk/Makefile.rules Mon Apr 19 13:11:02 2010 @@ -581,13 +581,6 @@ endif endif -# Adjust LD.Flags depending on the kind of library that is to be built. Note -# that if LOADABLE_MODULE is specified then the resulting shared library can -# be opened with dlopen. -ifdef LOADABLE_MODULE - LD.Flags += -module -endif - ifdef SHARED_LIBRARY ifneq ($(DARWIN_MAJVERS),4) LD.Flags += $(RPATH) -Wl,$(LibDir) From clattner at apple.com Mon Apr 19 13:21:23 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Apr 2010 11:21:23 -0700 Subject: [llvm-commits] [llvm] r101463 - in /llvm/trunk: include/llvm/Analysis/InlineCost.h lib/Analysis/InlineCost.cpp In-Reply-To: <5E53B3A0-0E82-49BD-BF0B-F6F0D51A14B8@apple.com> References: <20100416151450.E3D8C2A6C12C@llvm.org> <47580F9E-B5E3-4224-AF7D-EB9ECA6F0D89@apple.com> <5E53B3A0-0E82-49BD-BF0B-F6F0D51A14B8@apple.com> Message-ID: <431A127C-71F1-45BB-AA9D-05FC4ED3D75E@apple.com> ok On Apr 19, 2010, at 8:26 AM, Dan Gohman wrote: > > On Apr 16, 2010, at 11:21 AM, Chris Lattner wrote: > >> >> On Apr 16, 2010, at 8:14 AM, Dan Gohman wrote: >> >>> Author: djg >>> Date: Fri Apr 16 10:14:50 2010 >>> New Revision: 101463 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=101463&view=rev >>> Log: >>> Make callIsSmall accessible as a utility function. >> >> Should this become a method on CallInst? > > > I don't think that it's any more a "VMCore" concept than an "Analysis" concept. > > Dan > From clattner at apple.com Mon Apr 19 13:22:51 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Apr 2010 11:22:51 -0700 Subject: [llvm-commits] [llvm] r101781 - /llvm/trunk/lib/System/Unix/Path.inc In-Reply-To: <20100419155444.750A02A6C12C@llvm.org> References: <20100419155444.750A02A6C12C@llvm.org> Message-ID: <14A79009-E4D5-40CD-896C-3A59F84D69F1@apple.com> On Apr 19, 2010, at 8:54 AM, Dan Gohman wrote: > Author: djg > Date: Mon Apr 19 10:54:44 2010 > New Revision: 101781 > > URL: http://llvm.org/viewvc/llvm-project?rev=101781&view=rev > Log: > Revert 91528 and use a std::vector instead, fixing an abuse of std::string. How is std::vector better than std::string here? -Chris > > Modified: > llvm/trunk/lib/System/Unix/Path.inc > > Modified: llvm/trunk/lib/System/Unix/Path.inc > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=101781&r1=101780&r2=101781&view=diff > ============================================================================== > --- llvm/trunk/lib/System/Unix/Path.inc (original) > +++ llvm/trunk/lib/System/Unix/Path.inc Mon Apr 19 10:54:44 2010 > @@ -16,6 +16,7 @@ > //=== is guaranteed to work on *all* UNIX variants. > //===----------------------------------------------------------------------===// > > +#include "llvm/ADT/SmallVector.h" > #include "Unix.h" > #if HAVE_SYS_STAT_H > #include > @@ -858,15 +859,20 @@ > > // Append an XXXXXX pattern to the end of the file for use with mkstemp, > // mktemp or our own implementation. > - std::string Buf(path); > + // This uses std::vector instead of SmallVector to avoid a dependence on > + // libSupport. And performance isn't critical here. > + std::vector Buf; > + Buf.resize(path.size()+8); > + char *FNBuffer = Buf.data(); > + path.copy(FNBuffer,path.size()); > if (isDirectory()) > - Buf += "/XXXXXX"; > + strcpy(FNBuffer+path.size(), "/XXXXXX"); > else > - Buf += "-XXXXXX"; > + strcpy(FNBuffer+path.size(), "-XXXXXX"); > > #if defined(HAVE_MKSTEMP) > int TempFD; > - if ((TempFD = mkstemp((char*)Buf.c_str())) == -1) > + if ((TempFD = mkstemp(FNBuffer)) == -1) > return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); > > // We don't need to hold the temp file descriptor... we will trust that no one > @@ -874,21 +880,21 @@ > close(TempFD); > > // Save the name > - path = Buf; > + path = FNBuffer; > #elif defined(HAVE_MKTEMP) > // If we don't have mkstemp, use the old and obsolete mktemp function. > - if (mktemp(Buf.c_str()) == 0) > + if (mktemp(FNBuffer) == 0) > return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); > > // Save the name > - path = Buf; > + path = FNBuffer; > #else > // Okay, looks like we have to do it all by our lonesome. > static unsigned FCounter = 0; > unsigned offset = path.size() + 1; > - while (FCounter < 999999 && exists()) { > - sprintf(Buf.data()+offset, "%06u", ++FCounter); > - path = Buf; > + while ( FCounter < 999999 && exists()) { > + sprintf(FNBuffer+offset,"%06u",++FCounter); > + path = FNBuffer; > } > if (FCounter > 999999) > return MakeErrMsg(ErrMsg, > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From gohman at apple.com Mon Apr 19 13:31:27 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 11:31:27 -0700 Subject: [llvm-commits] [llvm] r101781 - /llvm/trunk/lib/System/Unix/Path.inc In-Reply-To: <14A79009-E4D5-40CD-896C-3A59F84D69F1@apple.com> References: <20100419155444.750A02A6C12C@llvm.org> <14A79009-E4D5-40CD-896C-3A59F84D69F1@apple.com> Message-ID: On Apr 19, 2010, at 11:22 AM, Chris Lattner wrote: > > On Apr 19, 2010, at 8:54 AM, Dan Gohman wrote: > >> Author: djg >> Date: Mon Apr 19 10:54:44 2010 >> New Revision: 101781 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=101781&view=rev >> Log: >> Revert 91528 and use a std::vector instead, fixing an abuse of std::string. > > How is std::vector better than std::string here? libstdc++'s doxygen comment on basic_string's c_str() expresses the situation effectively: "This is a handle to internal data. Do not modify or dire things may happen." Dan From gohman at apple.com Mon Apr 19 13:33:28 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 18:33:28 -0000 Subject: [llvm-commits] [llvm] r101798 - /llvm/trunk/Makefile.rules Message-ID: <20100419183328.A96572A6C12C@llvm.org> Author: djg Date: Mon Apr 19 13:33:28 2010 New Revision: 101798 URL: http://llvm.org/viewvc/llvm-project?rev=101798&view=rev Log: Enable -Wcast-qual for C++ files, where intentional qualifier-stripping can be done with const_cast. Modified: llvm/trunk/Makefile.rules Modified: llvm/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=101798&r1=101797&r2=101798&view=diff ============================================================================== --- llvm/trunk/Makefile.rules (original) +++ llvm/trunk/Makefile.rules Mon Apr 19 13:33:28 2010 @@ -633,6 +633,8 @@ endif CompileCommonOpts += -Wall -W -Wno-unused-parameter -Wwrite-strings \ $(EXTRA_OPTIONS) +# Enable cast-qual for C++; the workaround is to use const_cast. +CXX.Flags += -Wcast-qual ifeq ($(HOST_OS),HP-UX) CompileCommonOpts := -D_REENTRANT -D_HPUX_SOURCE From gohman at apple.com Mon Apr 19 13:41:46 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 18:41:46 -0000 Subject: [llvm-commits] [llvm] r101801 - in /llvm/trunk/lib/CodeGen/SelectionDAG: FunctionLoweringInfo.cpp FunctionLoweringInfo.h SelectionDAGBuilder.cpp Message-ID: <20100419184146.8DE3A2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 13:41:46 2010 New Revision: 101801 URL: http://llvm.org/viewvc/llvm-project?rev=101801&view=rev Log: Move isInTailCallPosition out of SelectionDAGBuilder, as it isn't SelectionDAG-specific. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp?rev=101801&r1=101800&r2=101801&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Mon Apr 19 13:41:46 2010 @@ -448,3 +448,88 @@ return ISD::SETNE; } } + +/// Test if the given instruction is in a position to be optimized +/// with a tail-call. This roughly means that it's in a block with +/// a return and there's nothing that needs to be scheduled +/// between it and the return. +/// +/// This function only tests target-independent requirements. +bool llvm::isInTailCallPosition(ImmutableCallSite CS, Attributes CalleeRetAttr, + const TargetLowering &TLI) { + const Instruction *I = CS.getInstruction(); + const BasicBlock *ExitBB = I->getParent(); + const TerminatorInst *Term = ExitBB->getTerminator(); + const ReturnInst *Ret = dyn_cast(Term); + const Function *F = ExitBB->getParent(); + + // The block must end in a return statement or unreachable. + // + // FIXME: Decline tailcall if it's not guaranteed and if the block ends in + // an unreachable, for now. The way tailcall optimization is currently + // implemented means it will add an epilogue followed by a jump. That is + // not profitable. Also, if the callee is a special function (e.g. + // longjmp on x86), it can end up causing miscompilation that has not + // been fully understood. + if (!Ret && + (!GuaranteedTailCallOpt || !isa(Term))) return false; + + // If I will have a chain, make sure no other instruction that will have a + // chain interposes between I and the return. + if (I->mayHaveSideEffects() || I->mayReadFromMemory() || + !I->isSafeToSpeculativelyExecute()) + for (BasicBlock::const_iterator BBI = prior(prior(ExitBB->end())); ; + --BBI) { + if (&*BBI == I) + break; + // Debug info intrinsics do not get in the way of tail call optimization. + if (isa(BBI)) + continue; + if (BBI->mayHaveSideEffects() || BBI->mayReadFromMemory() || + !BBI->isSafeToSpeculativelyExecute()) + return false; + } + + // If the block ends with a void return or unreachable, it doesn't matter + // what the call's return type is. + if (!Ret || Ret->getNumOperands() == 0) return true; + + // If the return value is undef, it doesn't matter what the call's + // return type is. + if (isa(Ret->getOperand(0))) return true; + + // Conservatively require the attributes of the call to match those of + // the return. Ignore noalias because it doesn't affect the call sequence. + unsigned CallerRetAttr = F->getAttributes().getRetAttributes(); + if ((CalleeRetAttr ^ CallerRetAttr) & ~Attribute::NoAlias) + return false; + + // It's not safe to eliminate the sign / zero extension of the return value. + if ((CallerRetAttr & Attribute::ZExt) || (CallerRetAttr & Attribute::SExt)) + return false; + + // Otherwise, make sure the unmodified return value of I is the return value. + for (const Instruction *U = dyn_cast(Ret->getOperand(0)); ; + U = dyn_cast(U->getOperand(0))) { + if (!U) + return false; + if (!U->hasOneUse()) + return false; + if (U == I) + break; + // Check for a truly no-op truncate. + if (isa(U) && + TLI.isTruncateFree(U->getOperand(0)->getType(), U->getType())) + continue; + // Check for a truly no-op bitcast. + if (isa(U) && + (U->getOperand(0)->getType() == U->getType() || + (U->getOperand(0)->getType()->isPointerTy() && + U->getType()->isPointerTy()))) + continue; + // Otherwise it's not a true no-op. + return false; + } + + return true; +} Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.h?rev=101801&r1=101800&r2=101801&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.h Mon Apr 19 13:41:46 2010 @@ -24,6 +24,7 @@ #endif #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/ISDOpcodes.h" +#include "llvm/Support/CallSite.h" #include namespace llvm { @@ -166,6 +167,15 @@ /// ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred); +/// Test if the given instruction is in a position to be optimized +/// with a tail-call. This roughly means that it's in a block with +/// a return and there's nothing that needs to be scheduled +/// between it and the return. +/// +/// This function only tests target-independent requirements. +bool isInTailCallPosition(ImmutableCallSite CS, Attributes CalleeRetAttr, + const TargetLowering &TLI); + } // end namespace llvm #endif Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101801&r1=101800&r2=101801&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Apr 19 13:41:46 2010 @@ -4190,92 +4190,6 @@ } } -/// Test if the given instruction is in a position to be optimized -/// with a tail-call. This roughly means that it's in a block with -/// a return and there's nothing that needs to be scheduled -/// between it and the return. -/// -/// This function only tests target-independent requirements. -static bool -isInTailCallPosition(ImmutableCallSite CS, Attributes CalleeRetAttr, - const TargetLowering &TLI) { - const Instruction *I = CS.getInstruction(); - const BasicBlock *ExitBB = I->getParent(); - const TerminatorInst *Term = ExitBB->getTerminator(); - const ReturnInst *Ret = dyn_cast(Term); - const Function *F = ExitBB->getParent(); - - // The block must end in a return statement or unreachable. - // - // FIXME: Decline tailcall if it's not guaranteed and if the block ends in - // an unreachable, for now. The way tailcall optimization is currently - // implemented means it will add an epilogue followed by a jump. That is - // not profitable. Also, if the callee is a special function (e.g. - // longjmp on x86), it can end up causing miscompilation that has not - // been fully understood. - if (!Ret && - (!GuaranteedTailCallOpt || !isa(Term))) return false; - - // If I will have a chain, make sure no other instruction that will have a - // chain interposes between I and the return. - if (I->mayHaveSideEffects() || I->mayReadFromMemory() || - !I->isSafeToSpeculativelyExecute()) - for (BasicBlock::const_iterator BBI = prior(prior(ExitBB->end())); ; - --BBI) { - if (&*BBI == I) - break; - // Debug info intrinsics do not get in the way of tail call optimization. - if (isa(BBI)) - continue; - if (BBI->mayHaveSideEffects() || BBI->mayReadFromMemory() || - !BBI->isSafeToSpeculativelyExecute()) - return false; - } - - // If the block ends with a void return or unreachable, it doesn't matter - // what the call's return type is. - if (!Ret || Ret->getNumOperands() == 0) return true; - - // If the return value is undef, it doesn't matter what the call's - // return type is. - if (isa(Ret->getOperand(0))) return true; - - // Conservatively require the attributes of the call to match those of - // the return. Ignore noalias because it doesn't affect the call sequence. - unsigned CallerRetAttr = F->getAttributes().getRetAttributes(); - if ((CalleeRetAttr ^ CallerRetAttr) & ~Attribute::NoAlias) - return false; - - // It's not safe to eliminate the sign / zero extension of the return value. - if ((CallerRetAttr & Attribute::ZExt) || (CallerRetAttr & Attribute::SExt)) - return false; - - // Otherwise, make sure the unmodified return value of I is the return value. - for (const Instruction *U = dyn_cast(Ret->getOperand(0)); ; - U = dyn_cast(U->getOperand(0))) { - if (!U) - return false; - if (!U->hasOneUse()) - return false; - if (U == I) - break; - // Check for a truly no-op truncate. - if (isa(U) && - TLI.isTruncateFree(U->getOperand(0)->getType(), U->getType())) - continue; - // Check for a truly no-op bitcast. - if (isa(U) && - (U->getOperand(0)->getType() == U->getType() || - (U->getOperand(0)->getType()->isPointerTy() && - U->getType()->isPointerTy()))) - continue; - // Otherwise it's not a true no-op. - return false; - } - - return true; -} - void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee, bool isTailCall, MachineBasicBlock *LandingPad) { From gohman at apple.com Mon Apr 19 14:05:59 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 19:05:59 -0000 Subject: [llvm-commits] [llvm] r101802 - in /llvm/trunk: include/llvm/CodeGen/Passes.h lib/CodeGen/DwarfEHPrepare.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100419190559.5E03D2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 14:05:59 2010 New Revision: 101802 URL: http://llvm.org/viewvc/llvm-project?rev=101802&view=rev Log: Code that needs a TargetMachine should have access to one directly, rather than just getting one through a TargetLowering. Modified: llvm/trunk/include/llvm/CodeGen/Passes.h llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/Passes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/Passes.h (original) +++ llvm/trunk/include/llvm/CodeGen/Passes.h Mon Apr 19 14:05:59 2010 @@ -199,7 +199,7 @@ /// createDwarfEHPass - This pass mulches exception handling code into a form /// adapted to code generation. Required if using dwarf exception handling. - FunctionPass *createDwarfEHPass(const TargetLowering *tli, bool fast); + FunctionPass *createDwarfEHPass(const TargetMachine *tm, bool fast); /// createSjLjEHPass - This pass adapts exception handling code to use /// the GCC-style builtin setjmp/longjmp (sjlj) to handling EH control flow. Modified: llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp (original) +++ llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp Mon Apr 19 14:05:59 2010 @@ -34,6 +34,7 @@ namespace { class DwarfEHPrepare : public FunctionPass { + const TargetMachine *TM; const TargetLowering *TLI; bool CompileFast; @@ -154,8 +155,9 @@ public: static char ID; // Pass identification, replacement for typeid. - DwarfEHPrepare(const TargetLowering *tli, bool fast) : - FunctionPass(&ID), TLI(tli), CompileFast(fast), + DwarfEHPrepare(const TargetMachine *tm, bool fast) : + FunctionPass(&ID), TM(tm), TLI(TM->getTargetLowering()), + CompileFast(fast), ExceptionValueIntrinsic(0), SelectorIntrinsic(0), URoR(0), EHCatchAllValue(0), RewindFunction(0) {} @@ -180,8 +182,8 @@ char DwarfEHPrepare::ID = 0; -FunctionPass *llvm::createDwarfEHPass(const TargetLowering *tli, bool fast) { - return new DwarfEHPrepare(tli, fast); +FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm, bool fast) { + return new DwarfEHPrepare(tm, fast); } /// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups. @@ -421,7 +423,7 @@ bool DwarfEHPrepare::NormalizeLandingPads() { bool Changed = false; - const MCAsmInfo *MAI = TLI->getTargetMachine().getMCAsmInfo(); + const MCAsmInfo *MAI = TM->getMCAsmInfo(); bool usingSjLjEH = MAI->getExceptionHandlingType() == ExceptionHandling::SjLj; for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) { Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original) +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Mon Apr 19 14:05:59 2010 @@ -248,10 +248,10 @@ // pad is shared by multiple invokes and is also a target of a normal // edge from elsewhere. PM.add(createSjLjEHPass(getTargetLowering())); - PM.add(createDwarfEHPass(getTargetLowering(), OptLevel==CodeGenOpt::None)); + PM.add(createDwarfEHPass(this, OptLevel==CodeGenOpt::None)); break; case ExceptionHandling::Dwarf: - PM.add(createDwarfEHPass(getTargetLowering(), OptLevel==CodeGenOpt::None)); + PM.add(createDwarfEHPass(this, OptLevel==CodeGenOpt::None)); break; case ExceptionHandling::None: PM.add(createLowerInvokePass(getTargetLowering())); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Apr 19 14:05:59 2010 @@ -53,6 +53,7 @@ /// namespace { class SelectionDAGLegalize { + const TargetMachine &TM; const TargetLowering &TLI; SelectionDAG &DAG; CodeGenOpt::Level OptLevel; @@ -211,7 +212,8 @@ SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag, CodeGenOpt::Level ol) - : TLI(dag.getTargetLoweringInfo()), DAG(dag), OptLevel(ol), + : TM(dag.getTarget()), TLI(dag.getTargetLoweringInfo()), + DAG(dag), OptLevel(ol), ValueTypeActions(TLI.getValueTypeActions()) { assert(MVT::LAST_VALUETYPE <= MVT::MAX_ALLOWED_VALUETYPE && "Too many value types for ValueTypeActions to hold!"); @@ -1661,8 +1663,7 @@ SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT); Chain = SP.getValue(1); unsigned Align = cast(Tmp3)->getZExtValue(); - unsigned StackAlign = - TLI.getTargetMachine().getFrameInfo()->getStackAlignment(); + unsigned StackAlign = TM.getFrameInfo()->getStackAlignment(); if (Align > StackAlign) SP = DAG.getNode(ISD::AND, dl, VT, SP, DAG.getConstant(-(uint64_t)Align, VT)); @@ -2920,7 +2921,7 @@ PseudoSourceValue::getJumpTable(), 0, MemVT, false, false, 0); Addr = LD; - if (TLI.getTargetMachine().getRelocationModel() == Reloc::PIC_) { + if (TM.getRelocationModel() == Reloc::PIC_) { // For PIC, the sequence is: // BRIND(load(Jumptable + index) + RelocBase) // RelocBase can be JumpTable, GOT or some sort of global base. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Apr 19 14:05:59 2010 @@ -2619,8 +2619,7 @@ // Handle alignment. If the requested alignment is less than or equal to // the stack alignment, ignore it. If the size is greater than or equal to // the stack alignment, we note this in the DYNAMIC_STACKALLOC node. - unsigned StackAlign = - TLI.getTargetMachine().getFrameInfo()->getStackAlignment(); + unsigned StackAlign = TM.getFrameInfo()->getStackAlignment(); if (Align <= StackAlign) Align = 0; @@ -4510,7 +4509,7 @@ const char *RenameFn = 0; if (Function *F = I.getCalledFunction()) { if (F->isDeclaration()) { - const TargetIntrinsicInfo *II = TLI.getTargetMachine().getIntrinsicInfo(); + const TargetIntrinsicInfo *II = TM.getIntrinsicInfo(); if (II) { if (unsigned IID = II->getIntrinsicID(F)) { RenameFn = visitIntrinsicCall(I, IID); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Mon Apr 19 14:05:59 2010 @@ -257,6 +257,7 @@ // TLI - This is information that describes the available target features we // need for lowering. This indicates when operations are unavailable, // implemented with a libcall, etc. + const TargetMachine &TM; const TargetLowering &TLI; SelectionDAG &DAG; const TargetData *TD; @@ -303,10 +304,10 @@ LLVMContext *Context; - SelectionDAGBuilder(SelectionDAG &dag, const TargetLowering &tli, - FunctionLoweringInfo &funcinfo, + SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo, CodeGenOpt::Level ol) - : SDNodeOrder(0), TLI(tli), DAG(dag), FuncInfo(funcinfo), OptLevel(ol), + : SDNodeOrder(0), TM(dag.getTarget()), TLI(dag.getTargetLoweringInfo()), + DAG(dag), FuncInfo(funcinfo), OptLevel(ol), HasTailCall(false), Context(dag.getContext()) { } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101802&r1=101801&r2=101802&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 14:05:59 2010 @@ -168,7 +168,7 @@ MachineFunctionPass(&ID), TM(tm), TLI(*tm.getTargetLowering()), FuncInfo(new FunctionLoweringInfo(TLI)), CurDAG(new SelectionDAG(TLI, *FuncInfo)), - SDB(new SelectionDAGBuilder(*CurDAG, TLI, *FuncInfo, OL)), + SDB(new SelectionDAGBuilder(*CurDAG, *FuncInfo, OL)), GFI(), OptLevel(OL), DAGSize(0) @@ -705,8 +705,7 @@ // landing pad can thus be detected via the MachineModuleInfo. MCSymbol *Label = MF->getMMI().addLandingPad(BB); - const TargetInstrDesc &II = - TLI.getTargetMachine().getInstrInfo()->get(TargetOpcode::EH_LABEL); + const TargetInstrDesc &II = TM.getInstrInfo()->get(TargetOpcode::EH_LABEL); BuildMI(BB, SDB->getCurDebugLoc(), II).addSym(Label); // Mark exception register as live in. From stuart at apple.com Mon Apr 19 14:13:10 2010 From: stuart at apple.com (Stuart Hastings) Date: Mon, 19 Apr 2010 19:13:10 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r101804 - in /llvm-gcc-4.2/trunk/gcc: objc/objc-act.c testsuite/objc.dg/weak_import_class.m Message-ID: <20100419191310.738002A6C12C@llvm.org> Author: stuart Date: Mon Apr 19 14:13:10 2010 New Revision: 101804 URL: http://llvm.org/viewvc/llvm-project?rev=101804&view=rev Log: Support weak_import for Objective-C classes. Radar 7865106. Patch by Fariborz Jahanian! Added: llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m Modified: llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Modified: llvm-gcc-4.2/trunk/gcc/objc/objc-act.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/objc/objc-act.c?rev=101804&r1=101803&r2=101804&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original) +++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Mon Apr 19 14:13:10 2010 @@ -924,6 +924,28 @@ return 0; } +/* APPLE LOCAL begin radar 7865106 */ +static bool objc_class_weak_import(tree class) +{ + tree chain; + gcc_assert (class && TREE_CODE (class) == CLASS_INTERFACE_TYPE); + for (chain = CLASS_ATTRIBUTES (class); chain; chain = TREE_CHAIN (chain)) + if (is_attribute_p ("weak_import", TREE_PURPOSE (chain))) + return true; + return false; +} + +static char* +objc_build_weak_reference_internal_classname (tree ident, bool metaclass) +{ + static char string[BUFSIZE]; + sprintf (string, ".weak_reference %s_%s", !metaclass ? "_OBJC_CLASS_$" + : "_OBJC_METACLASS_$", + IDENTIFIER_POINTER (ident)); + return string; +} +/* APPLE LOCAL end radar 7865106 */ + void /* APPLE LOCAL radar 4548636 */ objc_start_class_interface (tree class, tree super_class, tree protos, tree attributes) @@ -935,6 +957,17 @@ CLASS_ATTRIBUTES (objc_interface_context) = attributes; objc_warn_on_class_attributes (objc_interface_context, false); /* APPLE LOCAL end radar 4548636 */ + /* APPLE LOCAL begin radar 7865106 */ + if (flag_objc_abi == 2 && objc_class_weak_import(objc_interface_context)) { + const char * name = + objc_build_weak_reference_internal_classname(CLASS_NAME(objc_interface_context) , 0); + tree asm_str = build_string(strlen(name), name); + cgraph_add_asm_node(asm_str); + name = objc_build_weak_reference_internal_classname(CLASS_NAME(objc_interface_context) , 1); + asm_str = build_string(strlen(name), name); + cgraph_add_asm_node(asm_str); + } + /* APPLE LOCAL end radar 7865106 */ objc_public_flag = 0; } @@ -15175,6 +15208,10 @@ else if (is_attribute_p ("objc_exception", TREE_PURPOSE (chain))) ; /* APPLE LOCAL end radar 5008110 */ + /* APPLE LOCAL begin radar 7865106 */ + else if (is_attribute_p ("weak_import", TREE_PURPOSE (chain))) + ; + /* APPLE LOCAL end radar 7865106 */ else if (!use) warning (0, "attribute %s is unknown - ignored", IDENTIFIER_POINTER (TREE_PURPOSE (chain))); Added: llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m?rev=101804&view=auto ============================================================================== --- llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m (added) +++ llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m Mon Apr 19 14:13:10 2010 @@ -0,0 +1,29 @@ +/* APPLE LOCAL file radar 7865106 */ +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mmacosx-version-min=10.6 -fobjc-abi-version=2" { target i?86*-*-darwin* } } */ + +__attribute__((weak_import)) @interface WeakRootClass @end + at implementation WeakRootClass @end + + +__attribute__((weak_import)) @interface WeakClass : WeakRootClass @end + at implementation WeakClass @end + + at interface MySubclass : WeakClass @end + at implementation MySubclass @end + +__attribute__((weak_import)) @interface CategoryImplementsThis @end + at implementation CategoryImplementsThis(MyCategory) @end + at implementation CategoryImplementsThis(YourCategory) @end + + at interface Super : WeakRootClass @end + at implementation Super @end + + at interface Sub : Super @end + at implementation Sub @end +/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_WeakClass" } } */ +/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_WeakRootClass" } } */ +/* { dg-final { scan-assembler ".weak_reference _OBJC_CLASS_\\\$_WeakRootClass" } } */ +/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_WeakRootClass" } } */ +/* { dg-final { scan-assembler ".weak_reference _OBJC_CLASS_\\\$_CategoryImplementsThis" } } */ +/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_CategoryImplementsThis" } } */ From dpatel at apple.com Mon Apr 19 14:14:02 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Apr 2010 19:14:02 -0000 Subject: [llvm-commits] [llvm] r101805 - in /llvm/trunk: include/llvm/Support/Dwarf.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/Support/Dwarf.cpp Message-ID: <20100419191402.3D0D92A6C12C@llvm.org> Author: dpatel Date: Mon Apr 19 14:14:02 2010 New Revision: 101805 URL: http://llvm.org/viewvc/llvm-project?rev=101805&view=rev Log: Add DW_AT_APPLE_omit_frame_ptr to encode -fomit-frame-pointer flag. Modified: llvm/trunk/include/llvm/Support/Dwarf.h llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp llvm/trunk/lib/Support/Dwarf.cpp Modified: llvm/trunk/include/llvm/Support/Dwarf.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Dwarf.h?rev=101805&r1=101804&r2=101805&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Dwarf.h (original) +++ llvm/trunk/include/llvm/Support/Dwarf.h Mon Apr 19 14:14:02 2010 @@ -230,6 +230,7 @@ DW_AT_APPLE_block = 0x3fe4, DW_AT_APPLE_major_runtime_vers = 0x3fe5, DW_AT_APPLE_runtime_class = 0x3fe6, + DW_AT_APPLE_omit_frame_ptr = 0x3fe7, // Attribute form encodings DW_FORM_addr = 0x01, Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=101805&r1=101804&r2=101805&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Apr 19 14:14:02 2010 @@ -28,6 +28,7 @@ #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetRegisterInfo.h" +#include "llvm/Target/TargetOptions.h" #include "llvm/Analysis/DebugInfo.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" @@ -1249,6 +1250,10 @@ // DW_TAG_inlined_subroutine may refer to this DIE. ModuleCU->insertDIE(SP.getNode(), SPDie); + + if (NoFramePointerElim == false) + addUInt(SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr, dwarf::DW_FORM_flag, 1); + return SPDie; } Modified: llvm/trunk/lib/Support/Dwarf.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Dwarf.cpp?rev=101805&r1=101804&r2=101805&view=diff ============================================================================== --- llvm/trunk/lib/Support/Dwarf.cpp (original) +++ llvm/trunk/lib/Support/Dwarf.cpp Mon Apr 19 14:14:02 2010 @@ -196,8 +196,9 @@ case DW_AT_APPLE_flags: return "DW_AT_APPLE_flags"; case DW_AT_APPLE_isa: return "DW_AT_APPLE_isa"; case DW_AT_APPLE_block: return "DW_AT_APPLE_block"; - case DW_AT_APPLE_major_runtime_vers: return "DW_AT_APPLE_major_runtime_vers"; + case DW_AT_APPLE_major_runtime_vers: return "DW_AT_APPLE_major_runtime_vers"; case DW_AT_APPLE_runtime_class: return "DW_AT_APPLE_runtime_class"; + case DW_AT_APPLE_omit_frame_ptr: return "DW_APPLE_omit_frame_ptr"; } return 0; } From evan.cheng at apple.com Mon Apr 19 14:17:44 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Apr 2010 19:17:44 -0000 Subject: [llvm-commits] [llvm] r101806 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Message-ID: <20100419191744.EB7082A6C12C@llvm.org> Author: evancheng Date: Mon Apr 19 14:17:44 2010 New Revision: 101806 URL: http://llvm.org/viewvc/llvm-project?rev=101806&view=rev Log: More 80 col violation. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp?rev=101806&r1=101805&r2=101806&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Mon Apr 19 14:17:44 2010 @@ -1406,7 +1406,8 @@ if (NVTBits < EVTBits) { Hi = DAG.getNode(ISD::AssertZext, dl, NVT, Hi, - DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), EVTBits - NVTBits))); + DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), + EVTBits - NVTBits))); } else { Lo = DAG.getNode(ISD::AssertZext, dl, NVT, Lo, DAG.getValueType(EVT)); // The high part must be zero, make it explicit. @@ -1849,7 +1850,8 @@ unsigned ExcessBits = Op.getValueType().getSizeInBits() - NVT.getSizeInBits(); Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi, - DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), ExcessBits))); + DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), + ExcessBits))); } } From gohman at apple.com Mon Apr 19 14:22:07 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 19:22:07 -0000 Subject: [llvm-commits] [llvm] r101807 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAG.h lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100419192207.C54342A6C12C@llvm.org> Author: djg Date: Mon Apr 19 14:22:07 2010 New Revision: 101807 URL: http://llvm.org/viewvc/llvm-project?rev=101807&view=rev Log: Give SelectionDAG a TargetMachine too, rather than having it fetch one from the MachineFunction. Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAG.h?rev=101807&r1=101806&r2=101807&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAG.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAG.h Mon Apr 19 14:22:07 2010 @@ -117,6 +117,7 @@ /// linear form. /// class SelectionDAG { + const TargetMachine &TM; const TargetLowering &TLI; MachineFunction *MF; FunctionLoweringInfo &FLI; @@ -172,7 +173,7 @@ SelectionDAG(const SelectionDAG&); // Do not implement. public: - SelectionDAG(const TargetLowering &tli, FunctionLoweringInfo &fli); + SelectionDAG(const TargetMachine &TM, FunctionLoweringInfo &fli); ~SelectionDAG(); /// init - Prepare this SelectionDAG to process code in the given @@ -186,7 +187,7 @@ void clear(); MachineFunction &getMachineFunction() const { return *MF; } - const TargetMachine &getTarget() const; + const TargetMachine &getTarget() const { return TM; } const TargetLowering &getTargetLoweringInfo() const { return TLI; } FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; } LLVMContext *getContext() const {return Context; } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=101807&r1=101806&r2=101807&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Apr 19 14:22:07 2010 @@ -304,10 +304,6 @@ return Result; } -const TargetMachine &SelectionDAG::getTarget() const { - return MF->getTarget(); -} - //===----------------------------------------------------------------------===// // SDNode Profile Support //===----------------------------------------------------------------------===// @@ -792,8 +788,8 @@ } // EntryNode could meaningfully have debug info if we can find it... -SelectionDAG::SelectionDAG(const TargetLowering &tli, FunctionLoweringInfo &fli) - : TLI(tli), FLI(fli), +SelectionDAG::SelectionDAG(const TargetMachine &tm, FunctionLoweringInfo &fli) + : TM(tm), TLI(*tm.getTargetLowering()), FLI(fli), EntryNode(ISD::EntryToken, DebugLoc(), getVTList(MVT::Other)), Root(getEntryNode()), Ordering(0) { AllNodes.push_back(&EntryNode); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101807&r1=101806&r2=101807&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 14:22:07 2010 @@ -167,7 +167,7 @@ SelectionDAGISel::SelectionDAGISel(TargetMachine &tm, CodeGenOpt::Level OL) : MachineFunctionPass(&ID), TM(tm), TLI(*tm.getTargetLowering()), FuncInfo(new FunctionLoweringInfo(TLI)), - CurDAG(new SelectionDAG(TLI, *FuncInfo)), + CurDAG(new SelectionDAG(tm, *FuncInfo)), SDB(new SelectionDAGBuilder(*CurDAG, *FuncInfo, OL)), GFI(), OptLevel(OL), From gohman at apple.com Mon Apr 19 14:30:09 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 12:30:09 -0700 Subject: [llvm-commits] [llvm] r101805 - in /llvm/trunk: include/llvm/Support/Dwarf.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/Support/Dwarf.cpp In-Reply-To: <20100419191402.3D0D92A6C12C@llvm.org> References: <20100419191402.3D0D92A6C12C@llvm.org> Message-ID: <0A07A8DB-F8CC-480A-9FA1-55DC99391990@apple.com> On Apr 19, 2010, at 12:14 PM, Devang Patel wrote: > Author: dpatel > Date: Mon Apr 19 14:14:02 2010 > New Revision: 101805 > > URL: http://llvm.org/viewvc/llvm-project?rev=101805&view=rev > Log: > Add DW_AT_APPLE_omit_frame_ptr to encode -fomit-frame-pointer flag. Hi Devang, What is this for? Dwarf has fairly flexible mechanisms to describe the locations of stack objects. Dan From evan.cheng at apple.com Mon Apr 19 14:29:22 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Apr 2010 19:29:22 -0000 Subject: [llvm-commits] [llvm] r101808 - in /llvm/trunk/lib: CodeGen/SelectionDAG/DAGCombiner.cpp Target/X86/X86ISelLowering.cpp Message-ID: <20100419192923.0EF732A6C12C@llvm.org> Author: evancheng Date: Mon Apr 19 14:29:22 2010 New Revision: 101808 URL: http://llvm.org/viewvc/llvm-project?rev=101808&view=rev Log: More progress on promoting i16 operations to i32 for x86. Work in progress. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=101808&r1=101807&r2=101808&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr 19 14:29:22 2010 @@ -130,6 +130,8 @@ bool CombineToPostIndexedLoadStore(SDNode *N); SDValue PromoteIntBinOp(SDValue Op); + SDValue PromoteExtend(SDValue Op); + bool PromoteLoad(SDValue Op); /// combine - call the node-specific routine that knows how to fold each /// particular type of node. If that doesn't do anything, try the @@ -167,6 +169,8 @@ SDValue visitSHL(SDNode *N); SDValue visitSRA(SDNode *N); SDValue visitSRL(SDNode *N); + SDValue visitROTL(SDNode *N); + SDValue visitROTR(SDNode *N); SDValue visitCTLZ(SDNode *N); SDValue visitCTTZ(SDNode *N); SDValue visitCTPOP(SDNode *N); @@ -633,25 +637,44 @@ return true; } +static SDValue SExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, + const TargetLowering &TLI); +static SDValue ZExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, + const TargetLowering &TLI); + static SDValue PromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, const TargetLowering &TLI) { + DebugLoc dl = Op.getDebugLoc(); if (LoadSDNode *LD = dyn_cast(Op)) { - return DAG.getExtLoad(ISD::EXTLOAD, Op.getDebugLoc(), PVT, + ISD::LoadExtType ExtType = + ISD::isNON_EXTLoad(LD) ? ISD::EXTLOAD : LD->getExtensionType(); + return DAG.getExtLoad(ExtType, dl, PVT, LD->getChain(), LD->getBasePtr(), LD->getSrcValue(), LD->getSrcValueOffset(), LD->getMemoryVT(), LD->isVolatile(), LD->isNonTemporal(), LD->getAlignment()); } - unsigned Opc = ISD::ANY_EXTEND; - if (Op.getOpcode() == ISD::Constant) + unsigned Opc = Op.getOpcode(); + if (Opc == ISD::AssertSext) + return DAG.getNode(ISD::AssertSext, dl, PVT, + SExtPromoteOperand(Op.getOperand(0), PVT, DAG, TLI), + Op.getOperand(1)); + else if (Opc == ISD::AssertZext) + return DAG.getNode(ISD::AssertZext, dl, PVT, + ZExtPromoteOperand(Op.getOperand(0), PVT, DAG, TLI), + Op.getOperand(1)); + + unsigned ExtOpc = ISD::ANY_EXTEND; + if (Opc == ISD::Constant) // Zero extend things like i1, sign extend everything else. It shouldn't // matter in theory which one we pick, but this tends to give better code? // See DAGTypeLegalizer::PromoteIntRes_Constant. - Opc = Op.getValueType().isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; - if (!TLI.isOperationLegal(Opc, PVT)) + ExtOpc = + Op.getValueType().isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; + if (!TLI.isOperationLegal(ExtOpc, PVT)) return SDValue(); - return DAG.getNode(Opc, Op.getDebugLoc(), PVT, Op); + return DAG.getNode(ExtOpc, dl, PVT, Op); } static SDValue SExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, @@ -727,6 +750,80 @@ return SDValue(); } +SDValue DAGCombiner::PromoteExtend(SDValue Op) { + if (!LegalOperations) + return SDValue(); + + EVT VT = Op.getValueType(); + if (VT.isVector() || !VT.isInteger()) + return SDValue(); + + // If operation type is 'undesirable', e.g. i16 on x86, consider + // promoting it. + unsigned Opc = Op.getOpcode(); + if (TLI.isTypeDesirableForOp(Opc, VT)) + return SDValue(); + + EVT PVT = VT; + // Consult target whether it is a good idea to promote this operation and + // what's the right type to promote it to. + if (TLI.IsDesirableToPromoteOp(Op, PVT)) { + assert(PVT != VT && "Don't know what type to promote to!"); + // fold (aext (aext x)) -> (aext x) + // fold (aext (zext x)) -> (zext x) + // fold (aext (sext x)) -> (sext x) + return DAG.getNode(Op.getOpcode(), Op.getDebugLoc(), VT, Op.getOperand(0)); + } + return SDValue(); +} + +bool DAGCombiner::PromoteLoad(SDValue Op) { + if (!LegalOperations) + return false; + + EVT VT = Op.getValueType(); + if (VT.isVector() || !VT.isInteger()) + return false; + + // If operation type is 'undesirable', e.g. i16 on x86, consider + // promoting it. + unsigned Opc = Op.getOpcode(); + if (TLI.isTypeDesirableForOp(Opc, VT)) + return false; + + EVT PVT = VT; + // Consult target whether it is a good idea to promote this operation and + // what's the right type to promote it to. + if (TLI.IsDesirableToPromoteOp(Op, PVT)) { + assert(PVT != VT && "Don't know what type to promote to!"); + + DebugLoc dl = Op.getDebugLoc(); + SDNode *N = Op.getNode(); + LoadSDNode *LD = cast(N); + ISD::LoadExtType ExtType = + ISD::isNON_EXTLoad(LD) ? ISD::EXTLOAD : LD->getExtensionType(); + SDValue NewLD = DAG.getExtLoad(ExtType, dl, PVT, + LD->getChain(), LD->getBasePtr(), + LD->getSrcValue(), LD->getSrcValueOffset(), + LD->getMemoryVT(), LD->isVolatile(), + LD->isNonTemporal(), LD->getAlignment()); + SDValue Result = DAG.getNode(ISD::TRUNCATE, dl, VT, NewLD); + + DEBUG(dbgs() << "\nReplacing.x "; + N->dump(&DAG); + dbgs() << "\nWith: "; + Result.getNode()->dump(&DAG); + dbgs() << '\n'); + WorkListRemover DeadNodes(*this); + DAG.ReplaceAllUsesOfValueWith(SDValue(N, 0), Result, &DeadNodes); + DAG.ReplaceAllUsesOfValueWith(SDValue(N, 1), NewLD.getValue(1), &DeadNodes); + removeFromWorkList(N); + DAG.DeleteNode(N); + return true; + } + return false; +} + //===----------------------------------------------------------------------===// // Main DAG Combiner implementation @@ -856,6 +953,8 @@ case ISD::SHL: return visitSHL(N); case ISD::SRA: return visitSRA(N); case ISD::SRL: return visitSRL(N); + case ISD::ROTL: return visitROTL(N); + case ISD::ROTR: return visitROTR(N); case ISD::CTLZ: return visitCTLZ(N); case ISD::CTTZ: return visitCTTZ(N); case ISD::CTPOP: return visitCTPOP(N); @@ -2975,6 +3074,14 @@ return PromoteIntBinOp(SDValue(N, 0)); } +SDValue DAGCombiner::visitROTL(SDNode *N) { + return PromoteIntBinOp(SDValue(N, 0)); +} + +SDValue DAGCombiner::visitROTR(SDNode *N) { + return PromoteIntBinOp(SDValue(N, 0)); +} + SDValue DAGCombiner::visitCTLZ(SDNode *N) { SDValue N0 = N->getOperand(0); EVT VT = N->getValueType(0); @@ -3369,7 +3476,7 @@ DAG.SignBitIsZero(N0)) return DAG.getNode(ISD::ZERO_EXTEND, N->getDebugLoc(), VT, N0); - return SDValue(); + return PromoteExtend(SDValue(N, 0)); } SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) { @@ -3532,7 +3639,7 @@ N0.getOperand(1))); } - return SDValue(); + return PromoteExtend(SDValue(N, 0)); } SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) { @@ -3668,7 +3775,7 @@ return SCC; } - return SDValue(); + return PromoteExtend(SDValue(N, 0)); } /// GetDemandedBits - See if the specified operand can be simplified with the @@ -5270,6 +5377,8 @@ if (CombineToPreIndexedLoadStore(N) || CombineToPostIndexedLoadStore(N)) return SDValue(N, 0); + if (PromoteLoad(SDValue(N, 0))) + return SDValue(N, 0); return SDValue(); } Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=101808&r1=101807&r2=101808&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Apr 19 14:29:22 2010 @@ -9966,9 +9966,15 @@ switch (Opc) { default: return true; + case ISD::LOAD: + case ISD::SIGN_EXTEND: + case ISD::ZERO_EXTEND: + case ISD::ANY_EXTEND: case ISD::SHL: case ISD::SRA: case ISD::SRL: + case ISD::ROTL: + case ISD::ROTR: case ISD::SUB: case ISD::ADD: case ISD::MUL: @@ -9990,27 +9996,47 @@ if (VT != MVT::i16) return false; - bool Commute = true; + bool Promote = false; + bool Commute = false; switch (Op.getOpcode()) { - default: return false; + default: break; + case ISD::LOAD: { + LoadSDNode *LD = cast(Op); + // If the non-extending load has a single use and it's not live out, then it + // might be folded. + if (LD->getExtensionType() == ISD::NON_EXTLOAD && + Op.hasOneUse() && + Op.getNode()->use_begin()->getOpcode() != ISD::CopyToReg) + return false; + Promote = true; + break; + } + case ISD::SIGN_EXTEND: + case ISD::ZERO_EXTEND: + case ISD::ANY_EXTEND: + Promote = true; + break; case ISD::SHL: case ISD::SRA: - case ISD::SRL: { + case ISD::SRL: + case ISD::ROTL: + case ISD::ROTR: { SDValue N0 = Op.getOperand(0); // Look out for (store (shl (load), x)). if (isa(N0) && N0.hasOneUse() && Op.hasOneUse() && Op.getNode()->use_begin()->getOpcode() == ISD::STORE) return false; + Promote = true; break; } - case ISD::SUB: - Commute = false; - // fallthrough case ISD::ADD: case ISD::MUL: case ISD::AND: case ISD::OR: - case ISD::XOR: { + case ISD::XOR: + Commute = true; + // fallthrough + case ISD::SUB: { SDValue N0 = Op.getOperand(0); SDValue N1 = Op.getOperand(1); if (!Commute && isa(N1)) @@ -10020,11 +10046,12 @@ return false; if ((isa(N1) && N1.hasOneUse()) && !isa(N0)) return false; + Promote = true; } } PVT = MVT::i32; - return true; + return Promote; } //===----------------------------------------------------------------------===// From dpatel at apple.com Mon Apr 19 14:50:11 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Apr 2010 12:50:11 -0700 Subject: [llvm-commits] [llvm] r101805 - in /llvm/trunk: include/llvm/Support/Dwarf.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/Support/Dwarf.cpp In-Reply-To: <0A07A8DB-F8CC-480A-9FA1-55DC99391990@apple.com> References: <20100419191402.3D0D92A6C12C@llvm.org> <0A07A8DB-F8CC-480A-9FA1-55DC99391990@apple.com> Message-ID: On Apr 19, 2010, at 12:30 PM, Dan Gohman wrote: > > On Apr 19, 2010, at 12:14 PM, Devang Patel wrote: > >> Author: dpatel >> Date: Mon Apr 19 14:14:02 2010 >> New Revision: 101805 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=101805&view=rev >> Log: >> Add DW_AT_APPLE_omit_frame_ptr to encode -fomit-frame-pointer flag. > > Hi Devang, > > What is this for? Dwarf has fairly flexible mechanisms to describe the > locations of stack objects. > This flag is requested by debug info consumers (e.g. gdb tools, performance tools). - Devang -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20100419/e6f45c0a/attachment.html From stuart at apple.com Mon Apr 19 14:52:58 2010 From: stuart at apple.com (Stuart Hastings) Date: Mon, 19 Apr 2010 19:52:58 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r101809 - /llvm-gcc-4.2/trunk/config.guess Message-ID: <20100419195258.BBA332A6C12C@llvm.org> Author: stuart Date: Mon Apr 19 14:52:58 2010 New Revision: 101809 URL: http://llvm.org/viewvc/llvm-project?rev=101809&view=rev Log: On Darwin, clip the decimals from the version, teaching config.guess to guess Darwin triples correctly. Modified: llvm-gcc-4.2/trunk/config.guess Modified: llvm-gcc-4.2/trunk/config.guess URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/config.guess?rev=101809&r1=101808&r2=101809&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/config.guess (original) +++ llvm-gcc-4.2/trunk/config.guess Mon Apr 19 14:52:58 2010 @@ -1211,6 +1211,8 @@ fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac + # LLVM LOCAL "10.5.0" => "10" + UNAME_RELEASE=`echo $UNAME_RELEASE | sed -E 's/([0-9]+).*/\1/'` echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) From dpatel at apple.com Mon Apr 19 15:31:39 2010 From: dpatel at apple.com (Devang Patel) Date: Mon, 19 Apr 2010 20:31:39 -0000 Subject: [llvm-commits] [llvm] r101812 - in /llvm/trunk: lib/Support/Dwarf.cpp test/DebugInfo/2010-04-19-FramePtr.ll Message-ID: <20100419203139.315AC2A6C12C@llvm.org> Author: dpatel Date: Mon Apr 19 15:31:39 2010 New Revision: 101812 URL: http://llvm.org/viewvc/llvm-project?rev=101812&view=rev Log: Fix typo. add a test case. Added: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Modified: llvm/trunk/lib/Support/Dwarf.cpp Modified: llvm/trunk/lib/Support/Dwarf.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Dwarf.cpp?rev=101812&r1=101811&r2=101812&view=diff ============================================================================== --- llvm/trunk/lib/Support/Dwarf.cpp (original) +++ llvm/trunk/lib/Support/Dwarf.cpp Mon Apr 19 15:31:39 2010 @@ -198,7 +198,7 @@ case DW_AT_APPLE_block: return "DW_AT_APPLE_block"; case DW_AT_APPLE_major_runtime_vers: return "DW_AT_APPLE_major_runtime_vers"; case DW_AT_APPLE_runtime_class: return "DW_AT_APPLE_runtime_class"; - case DW_AT_APPLE_omit_frame_ptr: return "DW_APPLE_omit_frame_ptr"; + case DW_AT_APPLE_omit_frame_ptr: return "DW_AT_APPLE_omit_frame_ptr"; } return 0; } Added: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll?rev=101812&view=auto ============================================================================== --- llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll (added) +++ llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Mon Apr 19 15:31:39 2010 @@ -0,0 +1,30 @@ +; RUN: llc -asm-verbose -O0 -o %t < %s +; grep DW_AT_APPLE_omit_frame_ptr %t +; RUN: llc -disable-fp-elim -asm-verbose -O0 -o %t < %s +; grep -v DW_AT_APPLE_omit_frame_ptr %t + + +define i32 @foo() nounwind ssp { +entry: + %retval = alloca i32 ; [#uses=2] + %0 = alloca i32 ; [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] + store i32 42, i32* %0, align 4, !dbg !0 + %1 = load i32* %0, align 4, !dbg !0 ; [#uses=1] + store i32 %1, i32* %retval, align 4, !dbg !0 + br label %return, !dbg !0 + +return: ; preds = %entry + %retval1 = load i32* %retval, !dbg !0 ; [#uses=1] + ret i32 %retval1, !dbg !7 +} + +!0 = metadata !{i32 2, i32 0, metadata !1, null} +!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!7 = metadata !{i32 2, i32 0, metadata !8, null} +!8 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] From clattner at apple.com Mon Apr 19 15:35:27 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Apr 2010 13:35:27 -0700 Subject: [llvm-commits] [llvm] r101781 - /llvm/trunk/lib/System/Unix/Path.inc In-Reply-To: References: <20100419155444.750A02A6C12C@llvm.org> <14A79009-E4D5-40CD-896C-3A59F84D69F1@apple.com> Message-ID: <59574BE6-F086-438B-ABC5-B4806714C8BC@apple.com> On Apr 19, 2010, at 11:31 AM, Dan Gohman wrote: > > On Apr 19, 2010, at 11:22 AM, Chris Lattner wrote: > >> >> On Apr 19, 2010, at 8:54 AM, Dan Gohman wrote: >> >>> Author: djg >>> Date: Mon Apr 19 10:54:44 2010 >>> New Revision: 101781 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=101781&view=rev >>> Log: >>> Revert 91528 and use a std::vector instead, fixing an abuse of std::string. >> >> How is std::vector better than std::string here? > > libstdc++'s doxygen comment on basic_string's c_str() expresses the situation > effectively: > > "This is a handle to internal data. Do not modify or dire things may happen." ok From eli.friedman at gmail.com Mon Apr 19 15:55:23 2010 From: eli.friedman at gmail.com (Eli Friedman) Date: Mon, 19 Apr 2010 13:55:23 -0700 Subject: [llvm-commits] [llvm] r101808 - in /llvm/trunk/lib: CodeGen/SelectionDAG/DAGCombiner.cpp Target/X86/X86ISelLowering.cpp In-Reply-To: <20100419192923.0EF732A6C12C@llvm.org> References: <20100419192923.0EF732A6C12C@llvm.org> Message-ID: On Mon, Apr 19, 2010 at 12:29 PM, Evan Cheng wrote: > Author: evancheng > Date: Mon Apr 19 14:29:22 2010 > New Revision: 101808 > > URL: http://llvm.org/viewvc/llvm-project?rev=101808&view=rev > Log: > More progress on promoting i16 operations to i32 for x86. Work in progress. Is it really correct to try and promote a rotate? Won't that change the result? -Eli > Modified: > ? ?llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp > ? ?llvm/trunk/lib/Target/X86/X86ISelLowering.cpp > > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=101808&r1=101807&r2=101808&view=diff > ============================================================================== > --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) > +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr 19 14:29:22 2010 > @@ -130,6 +130,8 @@ > ? ? bool CombineToPostIndexedLoadStore(SDNode *N); > > ? ? SDValue PromoteIntBinOp(SDValue Op); > + ? ?SDValue PromoteExtend(SDValue Op); > + ? ?bool PromoteLoad(SDValue Op); > > ? ? /// combine - call the node-specific routine that knows how to fold each > ? ? /// particular type of node. If that doesn't do anything, try the > @@ -167,6 +169,8 @@ > ? ? SDValue visitSHL(SDNode *N); > ? ? SDValue visitSRA(SDNode *N); > ? ? SDValue visitSRL(SDNode *N); > + ? ?SDValue visitROTL(SDNode *N); > + ? ?SDValue visitROTR(SDNode *N); > ? ? SDValue visitCTLZ(SDNode *N); > ? ? SDValue visitCTTZ(SDNode *N); > ? ? SDValue visitCTPOP(SDNode *N); > @@ -633,25 +637,44 @@ > ? return true; > ?} > > +static SDValue SExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const TargetLowering &TLI); > +static SDValue ZExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const TargetLowering &TLI); > + > ?static SDValue PromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const TargetLowering &TLI) { > + ?DebugLoc dl = Op.getDebugLoc(); > ? if (LoadSDNode *LD = dyn_cast(Op)) { > - ? ?return DAG.getExtLoad(ISD::EXTLOAD, Op.getDebugLoc(), PVT, > + ? ?ISD::LoadExtType ExtType = > + ? ? ?ISD::isNON_EXTLoad(LD) ? ISD::EXTLOAD : LD->getExtensionType(); > + ? ?return DAG.getExtLoad(ExtType, dl, PVT, > ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getChain(), LD->getBasePtr(), > ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getSrcValue(), LD->getSrcValueOffset(), > ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getMemoryVT(), LD->isVolatile(), > ? ? ? ? ? ? ? ? ? ? ? ? ? LD->isNonTemporal(), LD->getAlignment()); > ? } > > - ?unsigned Opc = ISD::ANY_EXTEND; > - ?if (Op.getOpcode() == ISD::Constant) > + ?unsigned Opc = Op.getOpcode(); > + ?if (Opc == ISD::AssertSext) > + ? ?return DAG.getNode(ISD::AssertSext, dl, PVT, > + ? ? ? ? ? ? ? ? ? ? ? SExtPromoteOperand(Op.getOperand(0), PVT, DAG, TLI), > + ? ? ? ? ? ? ? ? ? ? ? Op.getOperand(1)); > + ?else if (Opc == ISD::AssertZext) > + ? ?return DAG.getNode(ISD::AssertZext, dl, PVT, > + ? ? ? ? ? ? ? ? ? ? ? ZExtPromoteOperand(Op.getOperand(0), PVT, DAG, TLI), > + ? ? ? ? ? ? ? ? ? ? ? Op.getOperand(1)); > + > + ?unsigned ExtOpc = ISD::ANY_EXTEND; > + ?if (Opc == ISD::Constant) > ? ? // Zero extend things like i1, sign extend everything else. ?It shouldn't > ? ? // matter in theory which one we pick, but this tends to give better code? > ? ? // See DAGTypeLegalizer::PromoteIntRes_Constant. > - ? ?Opc = Op.getValueType().isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; > - ?if (!TLI.isOperationLegal(Opc, PVT)) > + ? ?ExtOpc = > + ? ? ?Op.getValueType().isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; > + ?if (!TLI.isOperationLegal(ExtOpc, PVT)) > ? ? return SDValue(); > - ?return DAG.getNode(Opc, Op.getDebugLoc(), PVT, Op); > + ?return DAG.getNode(ExtOpc, dl, PVT, Op); > ?} > > ?static SDValue SExtPromoteOperand(SDValue Op, EVT PVT, SelectionDAG &DAG, > @@ -727,6 +750,80 @@ > ? return SDValue(); > ?} > > +SDValue DAGCombiner::PromoteExtend(SDValue Op) { > + ?if (!LegalOperations) > + ? ?return SDValue(); > + > + ?EVT VT = Op.getValueType(); > + ?if (VT.isVector() || !VT.isInteger()) > + ? ?return SDValue(); > + > + ?// If operation type is 'undesirable', e.g. i16 on x86, consider > + ?// promoting it. > + ?unsigned Opc = Op.getOpcode(); > + ?if (TLI.isTypeDesirableForOp(Opc, VT)) > + ? ?return SDValue(); > + > + ?EVT PVT = VT; > + ?// Consult target whether it is a good idea to promote this operation and > + ?// what's the right type to promote it to. > + ?if (TLI.IsDesirableToPromoteOp(Op, PVT)) { > + ? ?assert(PVT != VT && "Don't know what type to promote to!"); > + ? ?// fold (aext (aext x)) -> (aext x) > + ? ?// fold (aext (zext x)) -> (zext x) > + ? ?// fold (aext (sext x)) -> (sext x) > + ? ?return DAG.getNode(Op.getOpcode(), Op.getDebugLoc(), VT, Op.getOperand(0)); > + ?} > + ?return SDValue(); > +} > + > +bool DAGCombiner::PromoteLoad(SDValue Op) { > + ?if (!LegalOperations) > + ? ?return false; > + > + ?EVT VT = Op.getValueType(); > + ?if (VT.isVector() || !VT.isInteger()) > + ? ?return false; > + > + ?// If operation type is 'undesirable', e.g. i16 on x86, consider > + ?// promoting it. > + ?unsigned Opc = Op.getOpcode(); > + ?if (TLI.isTypeDesirableForOp(Opc, VT)) > + ? ?return false; > + > + ?EVT PVT = VT; > + ?// Consult target whether it is a good idea to promote this operation and > + ?// what's the right type to promote it to. > + ?if (TLI.IsDesirableToPromoteOp(Op, PVT)) { > + ? ?assert(PVT != VT && "Don't know what type to promote to!"); > + > + ? ?DebugLoc dl = Op.getDebugLoc(); > + ? ?SDNode *N = Op.getNode(); > + ? ?LoadSDNode *LD = cast(N); > + ? ?ISD::LoadExtType ExtType = > + ? ? ?ISD::isNON_EXTLoad(LD) ? ISD::EXTLOAD : LD->getExtensionType(); > + ? ?SDValue NewLD = DAG.getExtLoad(ExtType, dl, PVT, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getChain(), LD->getBasePtr(), > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getSrcValue(), LD->getSrcValueOffset(), > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LD->getMemoryVT(), LD->isVolatile(), > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LD->isNonTemporal(), LD->getAlignment()); > + ? ?SDValue Result = DAG.getNode(ISD::TRUNCATE, dl, VT, NewLD); > + > + ? ?DEBUG(dbgs() << "\nReplacing.x "; > + ? ? ? ? ?N->dump(&DAG); > + ? ? ? ? ?dbgs() << "\nWith: "; > + ? ? ? ? ?Result.getNode()->dump(&DAG); > + ? ? ? ? ?dbgs() << '\n'); > + ? ?WorkListRemover DeadNodes(*this); > + ? ?DAG.ReplaceAllUsesOfValueWith(SDValue(N, 0), Result, &DeadNodes); > + ? ?DAG.ReplaceAllUsesOfValueWith(SDValue(N, 1), NewLD.getValue(1), &DeadNodes); > + ? ?removeFromWorkList(N); > + ? ?DAG.DeleteNode(N); > + ? ?return true; > + ?} > + ?return false; > +} > + > > ?//===----------------------------------------------------------------------===// > ?// ?Main DAG Combiner implementation > @@ -856,6 +953,8 @@ > ? case ISD::SHL: ? ? ? ? ? ? ? ?return visitSHL(N); > ? case ISD::SRA: ? ? ? ? ? ? ? ?return visitSRA(N); > ? case ISD::SRL: ? ? ? ? ? ? ? ?return visitSRL(N); > + ?case ISD::ROTL: ? ? ? ? ? ? ? return visitROTL(N); > + ?case ISD::ROTR: ? ? ? ? ? ? ? return visitROTR(N); > ? case ISD::CTLZ: ? ? ? ? ? ? ? return visitCTLZ(N); > ? case ISD::CTTZ: ? ? ? ? ? ? ? return visitCTTZ(N); > ? case ISD::CTPOP: ? ? ? ? ? ? ?return visitCTPOP(N); > @@ -2975,6 +3074,14 @@ > ? return PromoteIntBinOp(SDValue(N, 0)); > ?} > > +SDValue DAGCombiner::visitROTL(SDNode *N) { > + ?return PromoteIntBinOp(SDValue(N, 0)); > +} > + > +SDValue DAGCombiner::visitROTR(SDNode *N) { > + ?return PromoteIntBinOp(SDValue(N, 0)); > +} > + > ?SDValue DAGCombiner::visitCTLZ(SDNode *N) { > ? SDValue N0 = N->getOperand(0); > ? EVT VT = N->getValueType(0); > @@ -3369,7 +3476,7 @@ > ? ? ? DAG.SignBitIsZero(N0)) > ? ? return DAG.getNode(ISD::ZERO_EXTEND, N->getDebugLoc(), VT, N0); > > - ?return SDValue(); > + ?return PromoteExtend(SDValue(N, 0)); > ?} > > ?SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) { > @@ -3532,7 +3639,7 @@ > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N0.getOperand(1))); > ? } > > - ?return SDValue(); > + ?return PromoteExtend(SDValue(N, 0)); > ?} > > ?SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) { > @@ -3668,7 +3775,7 @@ > ? ? ? return SCC; > ? } > > - ?return SDValue(); > + ?return PromoteExtend(SDValue(N, 0)); > ?} > > ?/// GetDemandedBits - See if the specified operand can be simplified with the > @@ -5270,6 +5377,8 @@ > ? if (CombineToPreIndexedLoadStore(N) || CombineToPostIndexedLoadStore(N)) > ? ? return SDValue(N, 0); > > + ?if (PromoteLoad(SDValue(N, 0))) > + ? ?return SDValue(N, 0); > ? return SDValue(); > ?} > > > Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=101808&r1=101807&r2=101808&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) > +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Apr 19 14:29:22 2010 > @@ -9966,9 +9966,15 @@ > ? switch (Opc) { > ? default: > ? ? return true; > + ?case ISD::LOAD: > + ?case ISD::SIGN_EXTEND: > + ?case ISD::ZERO_EXTEND: > + ?case ISD::ANY_EXTEND: > ? case ISD::SHL: > ? case ISD::SRA: > ? case ISD::SRL: > + ?case ISD::ROTL: > + ?case ISD::ROTR: > ? case ISD::SUB: > ? case ISD::ADD: > ? case ISD::MUL: > @@ -9990,27 +9996,47 @@ > ? if (VT != MVT::i16) > ? ? return false; > > - ?bool Commute = true; > + ?bool Promote = false; > + ?bool Commute = false; > ? switch (Op.getOpcode()) { > - ?default: return false; > + ?default: break; > + ?case ISD::LOAD: { > + ? ?LoadSDNode *LD = cast(Op); > + ? ?// If the non-extending load has a single use and it's not live out, then it > + ? ?// might be folded. > + ? ?if (LD->getExtensionType() == ISD::NON_EXTLOAD && > + ? ? ? ?Op.hasOneUse() && > + ? ? ? ?Op.getNode()->use_begin()->getOpcode() != ISD::CopyToReg) > + ? ? ?return false; > + ? ?Promote = true; > + ? ?break; > + ?} > + ?case ISD::SIGN_EXTEND: > + ?case ISD::ZERO_EXTEND: > + ?case ISD::ANY_EXTEND: > + ? ?Promote = true; > + ? ?break; > ? case ISD::SHL: > ? case ISD::SRA: > - ?case ISD::SRL: { > + ?case ISD::SRL: > + ?case ISD::ROTL: > + ?case ISD::ROTR: { > ? ? SDValue N0 = Op.getOperand(0); > ? ? // Look out for (store (shl (load), x)). > ? ? if (isa(N0) && N0.hasOneUse() && > ? ? ? ? Op.hasOneUse() && Op.getNode()->use_begin()->getOpcode() == ISD::STORE) > ? ? ? return false; > + ? ?Promote = true; > ? ? break; > ? } > - ?case ISD::SUB: > - ? ?Commute = false; > - ? ?// fallthrough > ? case ISD::ADD: > ? case ISD::MUL: > ? case ISD::AND: > ? case ISD::OR: > - ?case ISD::XOR: { > + ?case ISD::XOR: > + ? ?Commute = true; > + ? ?// fallthrough > + ?case ISD::SUB: { > ? ? SDValue N0 = Op.getOperand(0); > ? ? SDValue N1 = Op.getOperand(1); > ? ? if (!Commute && isa(N1)) > @@ -10020,11 +10046,12 @@ > ? ? ? return false; > ? ? if ((isa(N1) && N1.hasOneUse()) && !isa(N0)) > ? ? ? return false; > + ? ?Promote = true; > ? } > ? } > > ? PVT = MVT::i32; > - ?return true; > + ?return Promote; > ?} > > ?//===----------------------------------------------------------------------===// > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From johnny.chen at apple.com Mon Apr 19 16:19:52 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 19 Apr 2010 21:19:52 -0000 Subject: [llvm-commits] [llvm] r101817 - in /llvm/trunk: lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp test/MC/Disassembler/thumb-tests.txt Message-ID: <20100419211952.5D4A32A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 16:19:52 2010 New Revision: 101817 URL: http://llvm.org/viewvc/llvm-project?rev=101817&view=rev Log: According to A8.6.16 B (Encoding T3) and A8.3 Conditional execution -- A8.3.1 Pseudocode details of conditional, Condition bits '111x' indicate the instruction is always executed. That is, '1111' is a leagl condition field value, which is now mapped to ARMCC::AL. Also add a test case for condition field '1111'. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp llvm/trunk/test/MC/Disassembler/thumb-tests.txt Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=101817&r1=101816&r2=101817&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Mon Apr 19 16:19:52 2010 @@ -3209,6 +3209,15 @@ return TryPredicateAndSBitModifier(MI, Opcode, insn, NumOps - NumOpsAdded); } +// A8.3 Conditional execution +// A8.3.1 Pseudocode details of conditional execution +// Condition bits '111x' indicate the instruction is always executed. +static uint32_t CondCode(uint32_t CondField) { + if (CondField == 0xF) + return ARMCC::AL; + return CondField; +} + bool ARMBasicMCBuilder::TryPredicateAndSBitModifier(MCInst& MI, unsigned Opcode, uint32_t insn, unsigned short NumOpsRemaining) { @@ -3236,18 +3245,14 @@ // // A8.6.16 B if (Name == "t2Bcc") - MI.addOperand(MCOperand::CreateImm(slice(insn, 25, 22))); + MI.addOperand(MCOperand::CreateImm(CondCode(slice(insn, 25, 22)))); else if (Name == "tBcc") - MI.addOperand(MCOperand::CreateImm(slice(insn, 11, 8))); + MI.addOperand(MCOperand::CreateImm(CondCode(slice(insn, 11, 8)))); else MI.addOperand(MCOperand::CreateImm(ARMCC::AL)); } else { - // ARM Instructions. Check condition field. - int64_t CondVal = getCondField(insn); - if (CondVal == 0xF) - MI.addOperand(MCOperand::CreateImm(ARMCC::AL)); - else - MI.addOperand(MCOperand::CreateImm(CondVal)); + // ARM instructions get their condition field from Inst{31-28}. + MI.addOperand(MCOperand::CreateImm(CondCode(getCondField(insn)))); } } MI.addOperand(MCOperand::CreateReg(ARM::CPSR)); Modified: llvm/trunk/test/MC/Disassembler/thumb-tests.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/thumb-tests.txt?rev=101817&r1=101816&r2=101817&view=diff ============================================================================== --- llvm/trunk/test/MC/Disassembler/thumb-tests.txt (original) +++ llvm/trunk/test/MC/Disassembler/thumb-tests.txt Mon Apr 19 16:19:52 2010 @@ -9,6 +9,9 @@ # CHECK: b #34 0x0f 0xe0 +# CHECK: b.w #-12 +0xff 0xf7 0xf8 0xaf + # CHECK: bfi r2, r10, #0, #1 0x6a 0xf3 0x00 0x02 From gohman at apple.com Mon Apr 19 16:48:58 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 21:48:58 -0000 Subject: [llvm-commits] [llvm] r101819 - in /llvm/trunk: include/llvm/Analysis/IVUsers.h lib/Analysis/IVUsers.cpp lib/Transforms/Scalar/LoopStrengthReduce.cpp test/Transforms/IndVarSimplify/eliminate-comparison.ll Message-ID: <20100419214858.A66592A6C12C@llvm.org> Author: djg Date: Mon Apr 19 16:48:58 2010 New Revision: 101819 URL: http://llvm.org/viewvc/llvm-project?rev=101819&view=rev Log: Remove the Expr member from IVUsers. Instead of remembering the expression, just ask ScalarEvolution for it on demand. This helps IVUsers be more robust in the case of expressions changing underneath it. This fixes PR6862. Modified: llvm/trunk/include/llvm/Analysis/IVUsers.h llvm/trunk/lib/Analysis/IVUsers.cpp llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll Modified: llvm/trunk/include/llvm/Analysis/IVUsers.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/IVUsers.h?rev=101819&r1=101818&r2=101819&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/IVUsers.h (original) +++ llvm/trunk/include/llvm/Analysis/IVUsers.h Mon Apr 19 16:48:58 2010 @@ -36,9 +36,8 @@ class IVStrideUse : public CallbackVH, public ilist_node { friend class IVUsers; public: - IVStrideUse(IVUsers *P, const SCEV *E, - Instruction* U, Value *O) - : CallbackVH(U), Parent(P), Expr(E), OperandValToReplace(O) { + IVStrideUse(IVUsers *P, Instruction* U, Value *O) + : CallbackVH(U), Parent(P), OperandValToReplace(O) { } /// getUser - Return the user instruction for this use. @@ -51,20 +50,6 @@ setValPtr(NewUser); } - /// getParent - Return a pointer to the IVUsers that owns - /// this IVStrideUse. - IVUsers *getParent() const { return Parent; } - - /// getExpr - Return the expression for the use. - const SCEV *getExpr() const { return Expr; } - - /// setExpr - Assign a new expression to this use. - void setExpr(const SCEV *Val) { - Expr = Val; - } - - const SCEV *getStride(const Loop *L) const; - /// getOperandValToReplace - Return the Value of the operand in the user /// instruction that this IVStrideUse is representing. Value *getOperandValToReplace() const { @@ -91,9 +76,6 @@ /// Parent - a pointer to the IVUsers that owns this IVStrideUse. IVUsers *Parent; - /// Expr - The expression for this use. - const SCEV *Expr; - /// OperandValToReplace - The Value of the operand in the user instruction /// that this IVStrideUse is representing. WeakVH OperandValToReplace; @@ -161,12 +143,16 @@ /// return true. Otherwise, return false. bool AddUsersIfInteresting(Instruction *I); - IVStrideUse &AddUser(const SCEV *Expr, - Instruction *User, Value *Operand); + IVStrideUse &AddUser(Instruction *User, Value *Operand); /// getReplacementExpr - Return a SCEV expression which computes the /// value of the OperandValToReplace of the given IVStrideUse. - const SCEV *getReplacementExpr(const IVStrideUse &U) const; + const SCEV *getReplacementExpr(const IVStrideUse &IU) const; + + /// getExpr - Return the expression for the use. + const SCEV *getExpr(const IVStrideUse &IU) const; + + const SCEV *getStride(const IVStrideUse &IU, const Loop *L) const; typedef ilist::iterator iterator; typedef ilist::const_iterator const_iterator; Modified: llvm/trunk/lib/Analysis/IVUsers.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IVUsers.cpp?rev=101819&r1=101818&r2=101819&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IVUsers.cpp (original) +++ llvm/trunk/lib/Analysis/IVUsers.cpp Mon Apr 19 16:48:58 2010 @@ -122,23 +122,21 @@ if (AddUserToIVUsers) { // Okay, we found a user that we cannot reduce. - IVUses.push_back(new IVStrideUse(this, ISE, User, I)); + IVUses.push_back(new IVStrideUse(this, User, I)); IVStrideUse &NewUse = IVUses.back(); // Transform the expression into a normalized form. - NewUse.Expr = - TransformForPostIncUse(NormalizeAutodetect, NewUse.Expr, - User, I, - NewUse.PostIncLoops, - *SE, *DT); - DEBUG(dbgs() << " NORMALIZED TO: " << *NewUse.Expr << '\n'); + ISE = TransformForPostIncUse(NormalizeAutodetect, + ISE, User, I, + NewUse.PostIncLoops, + *SE, *DT); + DEBUG(dbgs() << " NORMALIZED TO: " << *ISE << '\n'); } } return true; } -IVStrideUse &IVUsers::AddUser(const SCEV *Expr, - Instruction *User, Value *Operand) { - IVUses.push_back(new IVStrideUse(this, Expr, User, Operand)); +IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand) { + IVUses.push_back(new IVStrideUse(this, User, Operand)); return IVUses.back(); } @@ -169,15 +167,6 @@ return false; } -/// getReplacementExpr - Return a SCEV expression which computes the -/// value of the OperandValToReplace of the given IVStrideUse. -const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &U) const { - PostIncLoopSet &Loops = const_cast(U.PostIncLoops); - return TransformForPostIncUse(Denormalize, U.getExpr(), - U.getUser(), U.getOperandValToReplace(), - Loops, *SE, *DT); -} - void IVUsers::print(raw_ostream &OS, const Module *M) const { OS << "IV Users for loop "; WriteAsOperand(OS, L->getHeader(), false); @@ -194,8 +183,7 @@ E = IVUses.end(); UI != E; ++UI) { OS << " "; WriteAsOperand(OS, UI->getOperandValToReplace(), false); - OS << " = " - << *getReplacementExpr(*UI); + OS << " = " << *getReplacementExpr(*UI); for (PostIncLoopSet::const_iterator I = UI->PostIncLoops.begin(), E = UI->PostIncLoops.end(); I != E; ++I) { @@ -218,6 +206,21 @@ IVUses.clear(); } +/// getReplacementExpr - Return a SCEV expression which computes the +/// value of the OperandValToReplace. +const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &IU) const { + return SE->getSCEV(IU.getOperandValToReplace()); +} + +/// getExpr - Return the expression for the use. +const SCEV *IVUsers::getExpr(const IVStrideUse &IU) const { + return + TransformForPostIncUse(Normalize, getReplacementExpr(IU), + IU.getUser(), IU.getOperandValToReplace(), + const_cast(IU.getPostIncLoops()), + *SE, *DT); +} + static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) { if (const SCEVAddRecExpr *AR = dyn_cast(S)) { if (AR->getLoop() == L) @@ -236,18 +239,13 @@ return 0; } -const SCEV *IVStrideUse::getStride(const Loop *L) const { - if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(), L)) - return AR->getStepRecurrence(*Parent->SE); +const SCEV *IVUsers::getStride(const IVStrideUse &IU, const Loop *L) const { + if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(IU), L)) + return AR->getStepRecurrence(*SE); return 0; } void IVStrideUse::transformToPostInc(const Loop *L) { - PostIncLoopSet Loops; - Loops.insert(L); - Expr = TransformForPostIncUse(Normalize, Expr, - getUser(), getOperandValToReplace(), - Loops, *Parent->SE, *Parent->DT); PostIncLoops.insert(L); } Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=101819&r1=101818&r2=101819&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Apr 19 16:48:58 2010 @@ -1575,8 +1575,8 @@ !DT.properlyDominates(UI->getUser()->getParent(), ExitingBlock)) { // Conservatively assume there may be reuse if the quotient of their // strides could be a legal scale. - const SCEV *A = CondUse->getStride(L); - const SCEV *B = UI->getStride(L); + const SCEV *A = IU.getStride(*CondUse, L); + const SCEV *B = IU.getStride(*UI, L); if (!A || !B) continue; if (SE.getTypeSizeInBits(A->getType()) != SE.getTypeSizeInBits(B->getType())) { @@ -1629,8 +1629,7 @@ ExitingBlock->getInstList().insert(TermBr, Cond); // Clone the IVUse, as the old use still exists! - CondUse = &IU.AddUser(CondUse->getExpr(), - Cond, CondUse->getOperandValToReplace()); + CondUse = &IU.AddUser(Cond, CondUse->getOperandValToReplace()); TermBr->replaceUsesOfWith(OldCond, Cond); } } @@ -1748,7 +1747,7 @@ // Collect interesting types and strides. SmallVector Worklist; for (IVUsers::const_iterator UI = IU.begin(), E = IU.end(); UI != E; ++UI) { - const SCEV *Expr = UI->getExpr(); + const SCEV *Expr = IU.getExpr(*UI); // Collect interesting types. Types.insert(SE.getEffectiveSCEVType(Expr->getType())); @@ -1819,7 +1818,7 @@ AccessTy = getAccessType(LF.UserInst); } - const SCEV *S = UI->getExpr(); + const SCEV *S = IU.getExpr(*UI); // Equality (== and !=) ICmps are special. We can rewrite (i == N) as // (N - i == 0), and this allows (N - i) to be the expression that we work Modified: llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll?rev=101819&r1=101818&r2=101819&view=diff ============================================================================== --- llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll (original) +++ llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll Mon Apr 19 16:48:58 2010 @@ -82,3 +82,27 @@ %tmp.0.ph = phi i32 [ 0, %bb18 ], [ 1, %bb15 ], [ 0, %bb13 ] ret i32 %tmp.0.ph } + +; Indvars should eliminate the icmp here. + +; CHECK: @func_10 +; CHECK-NOT: icmp +; CHECK: ret void + +define void @func_10() nounwind { +entry: + br label %loop + +loop: + %i = phi i32 [ %i.next, %loop ], [ 0, %entry ] + %t0 = icmp slt i32 %i, 0 + %t1 = zext i1 %t0 to i32 + %t2 = add i32 %t1, %i + %u3 = zext i32 %t2 to i64 + store i64 %u3, i64* null + %i.next = add i32 %i, 1 + br i1 undef, label %loop, label %return + +return: + ret void +} From gohman at apple.com Mon Apr 19 17:41:48 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 22:41:48 -0000 Subject: [llvm-commits] [llvm] r101822 - in /llvm/trunk/lib/CodeGen/SelectionDAG: SelectionDAGBuilder.cpp SelectionDAGBuilder.h SelectionDAGISel.cpp Message-ID: <20100419224148.38B202A6C12C@llvm.org> Author: djg Date: Mon Apr 19 17:41:47 2010 New Revision: 101822 URL: http://llvm.org/viewvc/llvm-project?rev=101822&view=rev Log: Eliminate the CurMBB member from SelectionDAGBuilder. For places that need it, just pass around the parent block of the current instruction explicitly. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101822&r1=101821&r2=101822&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Apr 19 17:41:47 2010 @@ -980,7 +980,8 @@ SelectionDAGBuilder::EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, - MachineBasicBlock *CurBB) { + MachineBasicBlock *CurBB, + MachineBasicBlock *SwitchBB) { const BasicBlock *BB = CurBB->getBasicBlock(); // If the leaf of the tree is a comparison, merge the condition into @@ -989,7 +990,7 @@ // The operands of the cmp have to be in this block. We don't know // how to export them from some other block. If this is the first block // of the sequence, no exporting is needed. - if (CurBB == CurMBB || + if (CurBB == SwitchBB || (isExportableFromCurrentBlock(BOp->getOperand(0), BB) && isExportableFromCurrentBlock(BOp->getOperand(1), BB))) { ISD::CondCode Condition; @@ -1020,6 +1021,7 @@ MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, + MachineBasicBlock *SwitchBB, unsigned Opc) { // If this node is not part of the or/and tree, emit it as a branch. const Instruction *BOp = dyn_cast(Cond); @@ -1028,7 +1030,7 @@ BOp->getParent() != CurBB->getBasicBlock() || !InBlock(BOp->getOperand(0), CurBB->getBasicBlock()) || !InBlock(BOp->getOperand(1), CurBB->getBasicBlock())) { - EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB); + EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB); return; } @@ -1048,10 +1050,10 @@ // // Emit the LHS condition. - FindMergedConditions(BOp->getOperand(0), TBB, TmpBB, CurBB, Opc); + FindMergedConditions(BOp->getOperand(0), TBB, TmpBB, CurBB, SwitchBB, Opc); // Emit the RHS condition into TmpBB. - FindMergedConditions(BOp->getOperand(1), TBB, FBB, TmpBB, Opc); + FindMergedConditions(BOp->getOperand(1), TBB, FBB, TmpBB, SwitchBB, Opc); } else { assert(Opc == Instruction::And && "Unknown merge op!"); // Codegen X & Y as: @@ -1064,10 +1066,10 @@ // This requires creation of TmpBB after CurBB. // Emit the LHS condition. - FindMergedConditions(BOp->getOperand(0), TmpBB, FBB, CurBB, Opc); + FindMergedConditions(BOp->getOperand(0), TmpBB, FBB, CurBB, SwitchBB, Opc); // Emit the RHS condition into TmpBB. - FindMergedConditions(BOp->getOperand(1), TBB, FBB, TmpBB, Opc); + FindMergedConditions(BOp->getOperand(1), TBB, FBB, TmpBB, SwitchBB, Opc); } } @@ -1103,18 +1105,20 @@ } void SelectionDAGBuilder::visitBr(const BranchInst &I) { + MachineBasicBlock *BrMBB = FuncInfo.MBBMap[I.getParent()]; + // Update machine-CFG edges. MachineBasicBlock *Succ0MBB = FuncInfo.MBBMap[I.getSuccessor(0)]; // Figure out which block is immediately after the current one. MachineBasicBlock *NextBlock = 0; - MachineFunction::iterator BBI = CurMBB; + MachineFunction::iterator BBI = BrMBB; if (++BBI != FuncInfo.MF->end()) NextBlock = BBI; if (I.isUnconditional()) { // Update machine-CFG edges. - CurMBB->addSuccessor(Succ0MBB); + BrMBB->addSuccessor(Succ0MBB); // If this is not a fall-through branch, emit the branch. if (Succ0MBB != NextBlock) @@ -1149,11 +1153,12 @@ if (BOp->hasOneUse() && (BOp->getOpcode() == Instruction::And || BOp->getOpcode() == Instruction::Or)) { - FindMergedConditions(BOp, Succ0MBB, Succ1MBB, CurMBB, BOp->getOpcode()); + FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, + BOp->getOpcode()); // If the compares in later blocks need to use values not currently // exported from this block, export them now. This block should always // be the first entry. - assert(SwitchCases[0].ThisBB == CurMBB && "Unexpected lowering!"); + assert(SwitchCases[0].ThisBB == BrMBB && "Unexpected lowering!"); // Allow some cases to be rejected. if (ShouldEmitAsBranches(SwitchCases)) { @@ -1163,7 +1168,7 @@ } // Emit the branch for this block. - visitSwitchCase(SwitchCases[0]); + visitSwitchCase(SwitchCases[0], BrMBB); SwitchCases.erase(SwitchCases.begin()); return; } @@ -1179,16 +1184,17 @@ // Create a CaseBlock record representing this branch. CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(*DAG.getContext()), - NULL, Succ0MBB, Succ1MBB, CurMBB); + NULL, Succ0MBB, Succ1MBB, BrMBB); // Use visitSwitchCase to actually insert the fast branch sequence for this // cond branch. - visitSwitchCase(CB); + visitSwitchCase(CB, BrMBB); } /// visitSwitchCase - Emits the necessary code to represent a single node in /// the binary search tree resulting from lowering a switch instruction. -void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB) { +void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB, + MachineBasicBlock *SwitchBB) { SDValue Cond; SDValue CondLHS = getValue(CB.CmpLHS); DebugLoc dl = getCurDebugLoc(); @@ -1227,13 +1233,13 @@ } // Update successor info - CurMBB->addSuccessor(CB.TrueBB); - CurMBB->addSuccessor(CB.FalseBB); + SwitchBB->addSuccessor(CB.TrueBB); + SwitchBB->addSuccessor(CB.FalseBB); // Set NextBlock to be the MBB immediately after the current one, if any. // This is used to avoid emitting unnecessary branches to the next block. MachineBasicBlock *NextBlock = 0; - MachineFunction::iterator BBI = CurMBB; + MachineFunction::iterator BBI = SwitchBB; if (++BBI != FuncInfo.MF->end()) NextBlock = BBI; @@ -1251,11 +1257,11 @@ // If the branch was constant folded, fix up the CFG. if (BrCond.getOpcode() == ISD::BR) { - CurMBB->removeSuccessor(CB.FalseBB); + SwitchBB->removeSuccessor(CB.FalseBB); } else { // Otherwise, go ahead and insert the false branch. if (BrCond == getControlRoot()) - CurMBB->removeSuccessor(CB.TrueBB); + SwitchBB->removeSuccessor(CB.TrueBB); if (CB.FalseBB != NextBlock) BrCond = DAG.getNode(ISD::BR, dl, MVT::Other, BrCond, @@ -1282,7 +1288,8 @@ /// visitJumpTableHeader - This function emits necessary code to produce index /// in the JumpTable from switch case. void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT, - JumpTableHeader &JTH) { + JumpTableHeader &JTH, + MachineBasicBlock *SwitchBB) { // Subtract the lowest switch case value from the value being switched on and // conditional branch to default mbb if the result is greater than the // difference between smallest and largest cases. @@ -1314,7 +1321,7 @@ // Set NextBlock to be the MBB immediately after the current one, if any. // This is used to avoid emitting unnecessary branches to the next block. MachineBasicBlock *NextBlock = 0; - MachineFunction::iterator BBI = CurMBB; + MachineFunction::iterator BBI = SwitchBB; if (++BBI != FuncInfo.MF->end()) NextBlock = BBI; @@ -1332,7 +1339,8 @@ /// visitBitTestHeader - This function emits necessary code to produce value /// suitable for "bit tests" -void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B) { +void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B, + MachineBasicBlock *SwitchBB) { // Subtract the minimum value SDValue SwitchOp = getValue(B.SValue); EVT VT = SwitchOp.getValueType(); @@ -1355,14 +1363,14 @@ // Set NextBlock to be the MBB immediately after the current one, if any. // This is used to avoid emitting unnecessary branches to the next block. MachineBasicBlock *NextBlock = 0; - MachineFunction::iterator BBI = CurMBB; + MachineFunction::iterator BBI = SwitchBB; if (++BBI != FuncInfo.MF->end()) NextBlock = BBI; MachineBasicBlock* MBB = B.Cases[0].ThisBB; - CurMBB->addSuccessor(B.Default); - CurMBB->addSuccessor(MBB); + SwitchBB->addSuccessor(B.Default); + SwitchBB->addSuccessor(MBB); SDValue BrRange = DAG.getNode(ISD::BRCOND, getCurDebugLoc(), MVT::Other, CopyTo, RangeCmp, @@ -1378,7 +1386,8 @@ /// visitBitTestCase - this function produces one "bit test" void SelectionDAGBuilder::visitBitTestCase(MachineBasicBlock* NextMBB, unsigned Reg, - BitTestCase &B) { + BitTestCase &B, + MachineBasicBlock *SwitchBB) { // Make desired shift SDValue ShiftOp = DAG.getCopyFromReg(getControlRoot(), getCurDebugLoc(), Reg, TLI.getPointerTy()); @@ -1396,8 +1405,8 @@ AndOp, DAG.getConstant(0, TLI.getPointerTy()), ISD::SETNE); - CurMBB->addSuccessor(B.TargetBB); - CurMBB->addSuccessor(NextMBB); + SwitchBB->addSuccessor(B.TargetBB); + SwitchBB->addSuccessor(NextMBB); SDValue BrAnd = DAG.getNode(ISD::BRCOND, getCurDebugLoc(), MVT::Other, getControlRoot(), @@ -1406,7 +1415,7 @@ // Set NextBlock to be the MBB immediately after the current one, if any. // This is used to avoid emitting unnecessary branches to the next block. MachineBasicBlock *NextBlock = 0; - MachineFunction::iterator BBI = CurMBB; + MachineFunction::iterator BBI = SwitchBB; if (++BBI != FuncInfo.MF->end()) NextBlock = BBI; @@ -1418,6 +1427,8 @@ } void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) { + MachineBasicBlock *InvokeMBB = FuncInfo.MBBMap[I.getParent()]; + // Retrieve successors. MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)]; MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; @@ -1433,8 +1444,8 @@ CopyToExportRegsIfNeeded(&I); // Update successor info - CurMBB->addSuccessor(Return); - CurMBB->addSuccessor(LandingPad); + InvokeMBB->addSuccessor(Return); + InvokeMBB->addSuccessor(LandingPad); // Drop into normal successor. DAG.setRoot(DAG.getNode(ISD::BR, getCurDebugLoc(), @@ -1450,7 +1461,8 @@ bool SelectionDAGBuilder::handleSmallSwitchRange(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default) { + MachineBasicBlock *Default, + MachineBasicBlock *SwitchBB) { Case& BackCase = *(CR.Range.second-1); // Size is the number of Cases represented by this range. @@ -1519,8 +1531,8 @@ // code into the current block. Otherwise, push the CaseBlock onto the // vector to be later processed by SDISel, and insert the node's MBB // before the next MBB. - if (CurBlock == CurMBB) - visitSwitchCase(CB); + if (CurBlock == SwitchBB) + visitSwitchCase(CB, SwitchBB); else SwitchCases.push_back(CB); @@ -1547,7 +1559,8 @@ bool SelectionDAGBuilder::handleJTSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default) { + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB) { Case& FrontCase = *CR.Range.first; Case& BackCase = *(CR.Range.second-1); @@ -1628,9 +1641,9 @@ // Set the jump table information so that we can codegen it as a second // MachineBasicBlock JumpTable JT(-1U, JTI, JumpTableBB, Default); - JumpTableHeader JTH(First, Last, SV, CR.CaseBB, (CR.CaseBB == CurMBB)); - if (CR.CaseBB == CurMBB) - visitJumpTableHeader(JT, JTH); + JumpTableHeader JTH(First, Last, SV, CR.CaseBB, (CR.CaseBB == SwitchBB)); + if (CR.CaseBB == SwitchBB) + visitJumpTableHeader(JT, JTH, SwitchBB); JTCases.push_back(JumpTableBlock(JTH, JT)); @@ -1642,7 +1655,8 @@ bool SelectionDAGBuilder::handleBTSplitSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default) { + MachineBasicBlock *Default, + MachineBasicBlock *SwitchBB) { // Get the MachineFunction which holds the current MBB. This is used when // inserting any additional MBBs necessary to represent the switch. MachineFunction *CurMF = FuncInfo.MF; @@ -1756,8 +1770,8 @@ // Otherwise, branch to LHS. CaseBlock CB(ISD::SETLT, SV, C, NULL, TrueBB, FalseBB, CR.CaseBB); - if (CR.CaseBB == CurMBB) - visitSwitchCase(CB); + if (CR.CaseBB == SwitchBB) + visitSwitchCase(CB, SwitchBB); else SwitchCases.push_back(CB); @@ -1770,7 +1784,8 @@ bool SelectionDAGBuilder::handleBitTestsSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default){ + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB){ EVT PTy = TLI.getPointerTy(); unsigned IntPtrBits = PTy.getSizeInBits(); @@ -1885,11 +1900,11 @@ } BitTestBlock BTB(lowBound, cmpRange, SV, - -1U, (CR.CaseBB == CurMBB), + -1U, (CR.CaseBB == SwitchBB), CR.CaseBB, Default, BTC); - if (CR.CaseBB == CurMBB) - visitBitTestHeader(BTB); + if (CR.CaseBB == SwitchBB) + visitBitTestHeader(BTB, SwitchBB); BitTestCases.push_back(BTB); @@ -1940,6 +1955,8 @@ } void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) { + MachineBasicBlock *SwitchMBB = FuncInfo.MBBMap[SI.getParent()]; + // Figure out which block is immediately after the current one. MachineBasicBlock *NextBlock = 0; MachineBasicBlock *Default = FuncInfo.MBBMap[SI.getDefaultDest()]; @@ -1950,7 +1967,7 @@ // Update machine-CFG edges. // If this is not a fall-through branch, emit the branch. - CurMBB->addSuccessor(Default); + SwitchMBB->addSuccessor(Default); if (Default != NextBlock) DAG.setRoot(DAG.getNode(ISD::BR, getCurDebugLoc(), MVT::Other, getControlRoot(), @@ -1975,34 +1992,37 @@ // Push the initial CaseRec onto the worklist CaseRecVector WorkList; - WorkList.push_back(CaseRec(CurMBB,0,0,CaseRange(Cases.begin(),Cases.end()))); + WorkList.push_back(CaseRec(SwitchMBB,0,0, + CaseRange(Cases.begin(),Cases.end()))); while (!WorkList.empty()) { // Grab a record representing a case range to process off the worklist CaseRec CR = WorkList.back(); WorkList.pop_back(); - if (handleBitTestsSwitchCase(CR, WorkList, SV, Default)) + if (handleBitTestsSwitchCase(CR, WorkList, SV, Default, SwitchMBB)) continue; // If the range has few cases (two or less) emit a series of specific // tests. - if (handleSmallSwitchRange(CR, WorkList, SV, Default)) + if (handleSmallSwitchRange(CR, WorkList, SV, Default, SwitchMBB)) continue; // If the switch has more than 5 blocks, and at least 40% dense, and the // target supports indirect branches, then emit a jump table rather than // lowering the switch to a binary tree of conditional branches. - if (handleJTSwitchCase(CR, WorkList, SV, Default)) + if (handleJTSwitchCase(CR, WorkList, SV, Default, SwitchMBB)) continue; // Emit binary tree. We need to pick a pivot, and push left and right ranges // onto the worklist. Leafs are handled via handleSmallSwitchRange() call. - handleBTSplitSwitchCase(CR, WorkList, SV, Default); + handleBTSplitSwitchCase(CR, WorkList, SV, Default, SwitchMBB); } } void SelectionDAGBuilder::visitIndirectBr(const IndirectBrInst &I) { + MachineBasicBlock *IndirectBrMBB = FuncInfo.MBBMap[I.getParent()]; + // Update machine-CFG edges with unique successors. SmallVector succs; succs.reserve(I.getNumSuccessors()); @@ -2011,7 +2031,7 @@ array_pod_sort(succs.begin(), succs.end()); succs.erase(std::unique(succs.begin(), succs.end()), succs.end()); for (unsigned i = 0, e = succs.size(); i != e; ++i) - CurMBB->addSuccessor(FuncInfo.MBBMap[succs[i]]); + IndirectBrMBB->addSuccessor(FuncInfo.MBBMap[succs[i]]); DAG.setRoot(DAG.getNode(ISD::BRIND, getCurDebugLoc(), MVT::Other, getControlRoot(), @@ -3819,7 +3839,8 @@ } case Intrinsic::eh_exception: { // Insert the EXCEPTIONADDR instruction. - assert(CurMBB->isLandingPad() &&"Call to eh.exception not in landing pad!"); + assert(FuncInfo.MBBMap[I.getParent()]->isLandingPad() && + "Call to eh.exception not in landing pad!"); SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); SDValue Ops[1]; Ops[0] = DAG.getRoot(); @@ -3830,16 +3851,17 @@ } case Intrinsic::eh_selector: { + MachineBasicBlock *CallMBB = FuncInfo.MBBMap[I.getParent()]; MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI(); - if (CurMBB->isLandingPad()) - AddCatchInfo(I, &MMI, CurMBB); + if (CallMBB->isLandingPad()) + AddCatchInfo(I, &MMI, CallMBB); else { #ifndef NDEBUG FuncInfo.CatchInfoLost.insert(&I); #endif // FIXME: Mark exception selector register as live in. Hack for PR1508. unsigned Reg = TLI.getExceptionSelectorRegister(); - if (Reg) CurMBB->addLiveIn(Reg); + if (Reg) FuncInfo.MBBMap[I.getParent()]->addLiveIn(Reg); } // Insert the EHSELECTION instruction. @@ -5340,7 +5362,7 @@ // Add (OpFlag&0xffff)>>3 registers to MatchedRegs. if (OpInfo.isIndirect) { // This happens on gcc/testsuite/gcc.dg/pr8788-1.c - LLVMContext &Ctx = CurMBB->getParent()->getFunction()->getContext(); + LLVMContext &Ctx = *DAG.getContext(); Ctx.emitError(CS.getInstruction(), "inline asm not supported yet:" " don't know how to handle tied " "indirect register inputs"); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=101822&r1=101821&r2=101822&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Mon Apr 19 17:41:47 2010 @@ -82,8 +82,6 @@ /// implementation that is parameterized by a TargetLowering object. /// class SelectionDAGBuilder { - MachineBasicBlock *CurMBB; - /// CurDebugLoc - current file + line number. Changes as we build the DAG. DebugLoc CurDebugLoc; @@ -350,8 +348,6 @@ void visit(unsigned Opcode, const User &I); - void setCurrentBasicBlock(MachineBasicBlock *MBB) { CurMBB = MBB; } - SDValue getValue(const Value *V); void setValue(const Value *V, SDValue NewN) { @@ -366,10 +362,11 @@ void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, - unsigned Opc); + MachineBasicBlock *SwitchBB, unsigned Opc); void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, - MachineBasicBlock *CurBB); + MachineBasicBlock *CurBB, + MachineBasicBlock *SwitchBB); bool ShouldEmitAsBranches(const std::vector &Cases); bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB); void CopyToExportRegsIfNeeded(const Value *V); @@ -389,27 +386,34 @@ bool handleSmallSwitchRange(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default); + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB); bool handleJTSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default); + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB); bool handleBTSplitSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default); + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB); bool handleBitTestsSwitchCase(CaseRec& CR, CaseRecVector& WorkList, const Value* SV, - MachineBasicBlock* Default); + MachineBasicBlock* Default, + MachineBasicBlock *SwitchBB); public: - void visitSwitchCase(CaseBlock &CB); - void visitBitTestHeader(BitTestBlock &B); + void visitSwitchCase(CaseBlock &CB, + MachineBasicBlock *SwitchBB); + void visitBitTestHeader(BitTestBlock &B, MachineBasicBlock *SwitchBB); void visitBitTestCase(MachineBasicBlock* NextMBB, unsigned Reg, - BitTestCase &B); + BitTestCase &B, + MachineBasicBlock *SwitchBB); void visitJumpTable(JumpTable &JT); - void visitJumpTableHeader(JumpTable &JT, JumpTableHeader &JTH); + void visitJumpTableHeader(JumpTable &JT, JumpTableHeader &JTH, + MachineBasicBlock *SwitchBB); private: // These all get lowered before this pass. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101822&r1=101821&r2=101822&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 17:41:47 2010 @@ -253,8 +253,6 @@ BasicBlock::const_iterator Begin, BasicBlock::const_iterator End, bool &HadTailCall) { - SDB->setCurrentBasicBlock(BB); - // Lower all of the non-terminator instructions. If a call is emitted // as a tail call, cease emitting nodes for this block. Terminators // are handled below. @@ -922,9 +920,8 @@ if (!SDB->BitTestCases[i].Emitted) { // Set the current basic block to the mbb we wish to insert the code into BB = SDB->BitTestCases[i].Parent; - SDB->setCurrentBasicBlock(BB); // Emit the code - SDB->visitBitTestHeader(SDB->BitTestCases[i]); + SDB->visitBitTestHeader(SDB->BitTestCases[i], BB); CurDAG->setRoot(SDB->getRoot()); CodeGenAndEmitDAG(); SDB->clear(); @@ -933,16 +930,17 @@ for (unsigned j = 0, ej = SDB->BitTestCases[i].Cases.size(); j != ej; ++j) { // Set the current basic block to the mbb we wish to insert the code into BB = SDB->BitTestCases[i].Cases[j].ThisBB; - SDB->setCurrentBasicBlock(BB); // Emit the code if (j+1 != ej) SDB->visitBitTestCase(SDB->BitTestCases[i].Cases[j+1].ThisBB, SDB->BitTestCases[i].Reg, - SDB->BitTestCases[i].Cases[j]); + SDB->BitTestCases[i].Cases[j], + BB); else SDB->visitBitTestCase(SDB->BitTestCases[i].Default, SDB->BitTestCases[i].Reg, - SDB->BitTestCases[i].Cases[j]); + SDB->BitTestCases[i].Cases[j], + BB); CurDAG->setRoot(SDB->getRoot()); @@ -989,9 +987,9 @@ if (!SDB->JTCases[i].first.Emitted) { // Set the current basic block to the mbb we wish to insert the code into BB = SDB->JTCases[i].first.HeaderBB; - SDB->setCurrentBasicBlock(BB); // Emit the code - SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first); + SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first, + BB); CurDAG->setRoot(SDB->getRoot()); CodeGenAndEmitDAG(); SDB->clear(); @@ -999,7 +997,6 @@ // Set the current basic block to the mbb we wish to insert the code into BB = SDB->JTCases[i].second.MBB; - SDB->setCurrentBasicBlock(BB); // Emit the code SDB->visitJumpTable(SDB->JTCases[i].second); CurDAG->setRoot(SDB->getRoot()); @@ -1047,10 +1044,9 @@ for (unsigned i = 0, e = SDB->SwitchCases.size(); i != e; ++i) { // Set the current basic block to the mbb we wish to insert the code into MachineBasicBlock *ThisBB = BB = SDB->SwitchCases[i].ThisBB; - SDB->setCurrentBasicBlock(BB); // Emit the code - SDB->visitSwitchCase(SDB->SwitchCases[i]); + SDB->visitSwitchCase(SDB->SwitchCases[i], BB); CurDAG->setRoot(SDB->getRoot()); CodeGenAndEmitDAG(); From gohman at apple.com Mon Apr 19 17:48:45 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 22:48:45 -0000 Subject: [llvm-commits] [llvm] r101824 - /llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp Message-ID: <20100419224845.DEC902A6C12C@llvm.org> Author: djg Date: Mon Apr 19 17:48:45 2010 New Revision: 101824 URL: http://llvm.org/viewvc/llvm-project?rev=101824&view=rev Log: Delete an unnecessary reference to SelectionDAGISel::BB. Modified: llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp Modified: llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp?rev=101824&r1=101823&r2=101824&view=diff ============================================================================== --- llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp Mon Apr 19 17:48:45 2010 @@ -67,7 +67,6 @@ } // end anonymous namespace SDNode* SparcDAGToDAGISel::getGlobalBaseReg() { - MachineFunction *MF = BB->getParent(); unsigned GlobalBaseReg = TM.getInstrInfo()->getGlobalBaseReg(MF); return CurDAG->getRegister(GlobalBaseReg, TLI.getPointerTy()).getNode(); } From gohman at apple.com Mon Apr 19 17:51:14 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 22:51:14 -0000 Subject: [llvm-commits] [llvm] r101825 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGISel.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100419225114.CDC872A6C12C@llvm.org> Author: djg Date: Mon Apr 19 17:51:14 2010 New Revision: 101825 URL: http://llvm.org/viewvc/llvm-project?rev=101825&view=rev Log: Eliminate SelectionDAGISel's "current block" member. Just pass it as an argument to things that need it. Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h?rev=101825&r1=101824&r2=101825&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h Mon Apr 19 17:51:14 2010 @@ -46,7 +46,6 @@ MachineRegisterInfo *RegInfo; SelectionDAG *CurDAG; SelectionDAGBuilder *SDB; - MachineBasicBlock *BB; AliasAnalysis *AA; GCFunctionInfo *GFI; CodeGenOpt::Level OptLevel; @@ -283,13 +282,14 @@ void PrepareEHLandingPad(MachineBasicBlock *BB); void SelectAllBasicBlocks(const Function &Fn); - void FinishBasicBlock(); + void FinishBasicBlock(MachineBasicBlock *BB); - void SelectBasicBlock(const BasicBlock *LLVMBB, + void SelectBasicBlock(MachineBasicBlock *BB, + const BasicBlock *LLVMBB, BasicBlock::const_iterator Begin, BasicBlock::const_iterator End, bool &HadTailCall); - void CodeGenAndEmitDAG(); + void CodeGenAndEmitDAG(MachineBasicBlock *BB); void LowerArguments(const BasicBlock *BB); void ShrinkDemandedOps(); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101825&r1=101824&r2=101825&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 17:51:14 2010 @@ -249,7 +249,8 @@ FastIS->setCurDebugLoc(DebugLoc()); } -void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB, +void SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB, + const BasicBlock *LLVMBB, BasicBlock::const_iterator Begin, BasicBlock::const_iterator End, bool &HadTailCall) { @@ -286,7 +287,7 @@ CurDAG->setRoot(SDB->getControlRoot()); // Final step, emit the lowered DAG as machine code. - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); HadTailCall = SDB->HasTailCall; SDB->clear(); } @@ -473,7 +474,7 @@ } while (!Worklist.empty()); } -void SelectionDAGISel::CodeGenAndEmitDAG() { +void SelectionDAGISel::CodeGenAndEmitDAG(MachineBasicBlock *BB) { std::string GroupName; if (TimePassesIsEnabled) GroupName = "Instruction Selection and Scheduling"; @@ -754,7 +755,7 @@ // Iterate over all basic blocks in the function. for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { const BasicBlock *LLVMBB = &*I; - BB = FuncInfo->MBBMap[LLVMBB]; + MachineBasicBlock *BB = FuncInfo->MBBMap[LLVMBB]; BasicBlock::const_iterator const Begin = LLVMBB->begin(); BasicBlock::const_iterator const End = LLVMBB->end(); @@ -790,7 +791,7 @@ // beginning FastISel on the entry block. if (LLVMBB == &Fn.getEntryBlock()) { CurDAG->setRoot(SDB->getControlRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); SDB->clear(); } FastIS->startNewBlock(BB); @@ -838,7 +839,7 @@ } bool HadTailCall = false; - SelectBasicBlock(LLVMBB, BI, llvm::next(BI), HadTailCall); + SelectBasicBlock(BB, LLVMBB, BI, llvm::next(BI), HadTailCall); // If the call was emitted as a tail call, we're done with the block. if (HadTailCall) { @@ -874,17 +875,17 @@ // block. if (BI != End) { bool HadTailCall; - SelectBasicBlock(LLVMBB, BI, End, HadTailCall); + SelectBasicBlock(BB, LLVMBB, BI, End, HadTailCall); } - FinishBasicBlock(); + FinishBasicBlock(BB); } delete FastIS; } void -SelectionDAGISel::FinishBasicBlock() { +SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) { DEBUG(dbgs() << "Target-post-processed machine code:\n"); DEBUG(BB->dump()); @@ -923,7 +924,7 @@ // Emit the code SDB->visitBitTestHeader(SDB->BitTestCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -944,7 +945,7 @@ CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -991,7 +992,7 @@ SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first, BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -1000,7 +1001,7 @@ // Emit the code SDB->visitJumpTable(SDB->JTCases[i].second); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); SDB->clear(); // Update PHI Nodes @@ -1048,7 +1049,7 @@ // Emit the code SDB->visitSwitchCase(SDB->SwitchCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + CodeGenAndEmitDAG(BB); // Handle any PHI nodes in successors of this chunk, as if we were coming // from the original BB before switch expansion. Note that PHI nodes can From johnny.chen at apple.com Mon Apr 19 18:02:58 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 19 Apr 2010 23:02:58 -0000 Subject: [llvm-commits] [llvm] r101827 - in /llvm/trunk/lib/Target/ARM/Disassembler: ARMDisassembler.cpp ARMDisassembler.h ARMDisassemblerCore.cpp Message-ID: <20100419230258.A745E2A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 18:02:58 2010 New Revision: 101827 URL: http://llvm.org/viewvc/llvm-project?rev=101827&view=rev Log: Better error handling of invalid IT mask '0000', instead of just asserting. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.h llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp?rev=101827&r1=101826&r2=101827&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Mon Apr 19 18:02:58 2010 @@ -508,17 +508,23 @@ } // A8.6.50 +// Valid return values are {1, 2, 3, 4}, with 0 signifying an error condition. static unsigned short CountITSize(unsigned ITMask) { // First count the trailing zeros of the IT mask. unsigned TZ = CountTrailingZeros_32(ITMask); - assert(TZ <= 3 && "Encoding error"); + if (TZ > 3) { + DEBUG(errs() << "Encoding error of IT mask"); + return 0; + } return (4 - TZ); } -/// Init ITState. -void Session::InitIT(unsigned short bits7_0) { +/// Init ITState. Note that at least one bit is always 1 in mask. +bool Session::InitIT(unsigned short bits7_0) { ITCounter = CountITSize(slice(bits7_0, 3, 0)); ITState = bits7_0; + // Only need to check for > 0. + return ITCounter > 0; } /// Update ITState if necessary. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.h?rev=101827&r1=101826&r2=101827&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.h Mon Apr 19 18:02:58 2010 @@ -60,7 +60,7 @@ Session() : ITCounter(0), ITState(0) {} ~Session() {} /// InitIT - Initializes ITCounter/ITState. - void InitIT(unsigned short bits7_0); + bool InitIT(unsigned short bits7_0); /// UpdateIT - Updates ITCounter/ITState as IT Block progresses. void UpdateIT(); Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=101827&r1=101826&r2=101827&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Mon Apr 19 18:02:58 2010 @@ -3282,7 +3282,7 @@ if (!SP) return Status; if (Opcode == ARM::t2IT) - SP->InitIT(slice(insn, 7, 0)); + Status = SP->InitIT(slice(insn, 7, 0)) ? Status : false; else if (InITBlock()) SP->UpdateIT(); From gohman at apple.com Mon Apr 19 18:11:58 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 23:11:58 -0000 Subject: [llvm-commits] [llvm] r101830 - in /llvm/trunk/lib/CodeGen: AggressiveAntiDepBreaker.cpp AggressiveAntiDepBreaker.h AntiDepBreaker.h CriticalAntiDepBreaker.cpp CriticalAntiDepBreaker.h Message-ID: <20100419231158.B95112A6C12C@llvm.org> Author: djg Date: Mon Apr 19 18:11:58 2010 New Revision: 101830 URL: http://llvm.org/viewvc/llvm-project?rev=101830&view=rev Log: Make BreakAntiDependencies' SUnits argument const, and make the Begin and End arguments by-value rather than by-reference. Modified: llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.cpp llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.h llvm/trunk/lib/CodeGen/AntiDepBreaker.h llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.h Modified: llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.cpp?rev=101830&r1=101829&r2=101830&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.cpp (original) +++ llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.cpp Mon Apr 19 18:11:58 2010 @@ -281,9 +281,9 @@ /// AntiDepEdges - Return in Edges the anti- and output- dependencies /// in SU that we want to consider for breaking. -static void AntiDepEdges(SUnit *SU, std::vector& Edges) { +static void AntiDepEdges(const SUnit *SU, std::vector& Edges) { SmallSet RegSet; - for (SUnit::pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); + for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); P != PE; ++P) { if ((P->getKind() == SDep::Anti) || (P->getKind() == SDep::Output)) { unsigned Reg = P->getReg(); @@ -297,14 +297,14 @@ /// CriticalPathStep - Return the next SUnit after SU on the bottom-up /// critical path. -static SUnit *CriticalPathStep(SUnit *SU) { - SDep *Next = 0; +static const SUnit *CriticalPathStep(const SUnit *SU) { + const SDep *Next = 0; unsigned NextDepth = 0; // Find the predecessor edge with the greatest depth. if (SU != 0) { - for (SUnit::pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); + for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); P != PE; ++P) { - SUnit *PredSU = P->getSUnit(); + const SUnit *PredSU = P->getSUnit(); unsigned PredLatency = P->getLatency(); unsigned PredTotalLatency = PredSU->getDepth() + PredLatency; // In the case of a latency tie, prefer an anti-dependency edge over @@ -703,9 +703,9 @@ /// ScheduleDAG and break them by renaming registers. /// unsigned AggressiveAntiDepBreaker::BreakAntiDependencies( - std::vector& SUnits, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, + const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, unsigned InsertPosIndex) { unsigned *KillIndices = State->GetKillIndices(); unsigned *DefIndices = State->GetDefIndices(); @@ -720,20 +720,21 @@ RenameOrderType RenameOrder; // ...need a map from MI to SUnit. - std::map MISUnitMap; + std::map MISUnitMap; for (unsigned i = 0, e = SUnits.size(); i != e; ++i) { - SUnit *SU = &SUnits[i]; - MISUnitMap.insert(std::pair(SU->getInstr(), SU)); + const SUnit *SU = &SUnits[i]; + MISUnitMap.insert(std::pair(SU->getInstr(), + SU)); } // Track progress along the critical path through the SUnit graph as // we walk the instructions. This is needed for regclasses that only // break critical-path anti-dependencies. - SUnit *CriticalPathSU = 0; + const SUnit *CriticalPathSU = 0; MachineInstr *CriticalPathMI = 0; if (CriticalPathSet.any()) { for (unsigned i = 0, e = SUnits.size(); i != e; ++i) { - SUnit *SU = &SUnits[i]; + const SUnit *SU = &SUnits[i]; if (!CriticalPathSU || ((SU->getDepth() + SU->Latency) > (CriticalPathSU->getDepth() + CriticalPathSU->Latency))) { @@ -774,8 +775,8 @@ // The dependence edges that represent anti- and output- // dependencies that are candidates for breaking. - std::vector Edges; - SUnit *PathSU = MISUnitMap[MI]; + std::vector Edges; + const SUnit *PathSU = MISUnitMap[MI]; AntiDepEdges(PathSU, Edges); // If MI is not on the critical path, then we don't rename @@ -793,7 +794,7 @@ if (!MI->isKill()) { // Attempt to break each anti-dependency... for (unsigned i = 0, e = Edges.size(); i != e; ++i) { - SDep *Edge = Edges[i]; + const SDep *Edge = Edges[i]; SUnit *NextSU = Edge->getSUnit(); if ((Edge->getKind() != SDep::Anti) && @@ -837,7 +838,7 @@ // Also, if there are dependencies on other SUnits with the // same register as the anti-dependency, don't attempt to // break it. - for (SUnit::pred_iterator P = PathSU->Preds.begin(), + for (SUnit::const_pred_iterator P = PathSU->Preds.begin(), PE = PathSU->Preds.end(); P != PE; ++P) { if (P->getSUnit() == NextSU ? (P->getKind() != SDep::Anti || P->getReg() != AntiDepReg) : @@ -846,7 +847,7 @@ break; } } - for (SUnit::pred_iterator P = PathSU->Preds.begin(), + for (SUnit::const_pred_iterator P = PathSU->Preds.begin(), PE = PathSU->Preds.end(); P != PE; ++P) { if ((P->getSUnit() == NextSU) && (P->getKind() != SDep::Anti) && (P->getKind() != SDep::Output)) { Modified: llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.h?rev=101830&r1=101829&r2=101830&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.h (original) +++ llvm/trunk/lib/CodeGen/AggressiveAntiDepBreaker.h Mon Apr 19 18:11:58 2010 @@ -142,9 +142,9 @@ /// path /// of the ScheduleDAG and break them by renaming registers. /// - unsigned BreakAntiDependencies(std::vector& SUnits, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, + unsigned BreakAntiDependencies(const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, unsigned InsertPosIndex); /// Observe - Update liveness information to account for the current Modified: llvm/trunk/lib/CodeGen/AntiDepBreaker.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AntiDepBreaker.h?rev=101830&r1=101829&r2=101830&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AntiDepBreaker.h (original) +++ llvm/trunk/lib/CodeGen/AntiDepBreaker.h Mon Apr 19 18:11:58 2010 @@ -39,9 +39,9 @@ /// basic-block region and break them by renaming registers. Return /// the number of anti-dependencies broken. /// - virtual unsigned BreakAntiDependencies(std::vector& SUnits, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, + virtual unsigned BreakAntiDependencies(const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, unsigned InsertPosIndex) =0; /// Observe - Update liveness information to account for the current Modified: llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp?rev=101830&r1=101829&r2=101830&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp (original) +++ llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp Mon Apr 19 18:11:58 2010 @@ -143,13 +143,13 @@ /// CriticalPathStep - Return the next SUnit after SU on the bottom-up /// critical path. -static SDep *CriticalPathStep(SUnit *SU) { - SDep *Next = 0; +static const SDep *CriticalPathStep(const SUnit *SU) { + const SDep *Next = 0; unsigned NextDepth = 0; // Find the predecessor edge with the greatest depth. - for (SUnit::pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); + for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end(); P != PE; ++P) { - SUnit *PredSU = P->getSUnit(); + const SUnit *PredSU = P->getSUnit(); unsigned PredLatency = P->getLatency(); unsigned PredTotalLatency = PredSU->getDepth() + PredLatency; // In the case of a latency tie, prefer an anti-dependency edge over @@ -326,18 +326,18 @@ } unsigned CriticalAntiDepBreaker:: -BreakAntiDependencies(std::vector& SUnits, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, +BreakAntiDependencies(const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, unsigned InsertPosIndex) { // The code below assumes that there is at least one instruction, // so just duck out immediately if the block is empty. if (SUnits.empty()) return 0; // Find the node at the bottom of the critical path. - SUnit *Max = 0; + const SUnit *Max = 0; for (unsigned i = 0, e = SUnits.size(); i != e; ++i) { - SUnit *SU = &SUnits[i]; + const SUnit *SU = &SUnits[i]; if (!Max || SU->getDepth() + SU->Latency > Max->getDepth() + Max->Latency) Max = SU; } @@ -357,7 +357,7 @@ // Track progress along the critical path through the SUnit graph as we walk // the instructions. - SUnit *CriticalPathSU = Max; + const SUnit *CriticalPathSU = Max; MachineInstr *CriticalPathMI = CriticalPathSU->getInstr(); // Consider this pattern: @@ -429,8 +429,8 @@ // the anti-dependencies in an instruction in order to be effective. unsigned AntiDepReg = 0; if (MI == CriticalPathMI) { - if (SDep *Edge = CriticalPathStep(CriticalPathSU)) { - SUnit *NextSU = Edge->getSUnit(); + if (const SDep *Edge = CriticalPathStep(CriticalPathSU)) { + const SUnit *NextSU = Edge->getSUnit(); // Only consider anti-dependence edges. if (Edge->getKind() == SDep::Anti) { @@ -452,7 +452,7 @@ // Also, if there are dependencies on other SUnits with the // same register as the anti-dependency, don't attempt to // break it. - for (SUnit::pred_iterator P = CriticalPathSU->Preds.begin(), + for (SUnit::const_pred_iterator P = CriticalPathSU->Preds.begin(), PE = CriticalPathSU->Preds.end(); P != PE; ++P) if (P->getSUnit() == NextSU ? (P->getKind() != SDep::Anti || P->getReg() != AntiDepReg) : Modified: llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.h?rev=101830&r1=101829&r2=101830&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.h (original) +++ llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.h Mon Apr 19 18:11:58 2010 @@ -72,9 +72,9 @@ /// path /// of the ScheduleDAG and break them by renaming registers. /// - unsigned BreakAntiDependencies(std::vector& SUnits, - MachineBasicBlock::iterator& Begin, - MachineBasicBlock::iterator& End, + unsigned BreakAntiDependencies(const std::vector& SUnits, + MachineBasicBlock::iterator Begin, + MachineBasicBlock::iterator End, unsigned InsertPosIndex); /// Observe - Update liveness information to account for the current From gohman at apple.com Mon Apr 19 18:34:15 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 19 Apr 2010 23:34:15 -0000 Subject: [llvm-commits] [llvm] r101832 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGISel.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100419233415.CF4942A6C12C@llvm.org> Author: djg Date: Mon Apr 19 18:34:15 2010 New Revision: 101832 URL: http://llvm.org/viewvc/llvm-project?rev=101832&view=rev Log: Revert 101825, which is causing trouble. Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h?rev=101832&r1=101831&r2=101832&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h Mon Apr 19 18:34:15 2010 @@ -46,6 +46,7 @@ MachineRegisterInfo *RegInfo; SelectionDAG *CurDAG; SelectionDAGBuilder *SDB; + MachineBasicBlock *BB; AliasAnalysis *AA; GCFunctionInfo *GFI; CodeGenOpt::Level OptLevel; @@ -282,14 +283,13 @@ void PrepareEHLandingPad(MachineBasicBlock *BB); void SelectAllBasicBlocks(const Function &Fn); - void FinishBasicBlock(MachineBasicBlock *BB); + void FinishBasicBlock(); - void SelectBasicBlock(MachineBasicBlock *BB, - const BasicBlock *LLVMBB, + void SelectBasicBlock(const BasicBlock *LLVMBB, BasicBlock::const_iterator Begin, BasicBlock::const_iterator End, bool &HadTailCall); - void CodeGenAndEmitDAG(MachineBasicBlock *BB); + void CodeGenAndEmitDAG(); void LowerArguments(const BasicBlock *BB); void ShrinkDemandedOps(); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101832&r1=101831&r2=101832&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 18:34:15 2010 @@ -249,8 +249,7 @@ FastIS->setCurDebugLoc(DebugLoc()); } -void SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB, - const BasicBlock *LLVMBB, +void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB, BasicBlock::const_iterator Begin, BasicBlock::const_iterator End, bool &HadTailCall) { @@ -287,7 +286,7 @@ CurDAG->setRoot(SDB->getControlRoot()); // Final step, emit the lowered DAG as machine code. - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); HadTailCall = SDB->HasTailCall; SDB->clear(); } @@ -474,7 +473,7 @@ } while (!Worklist.empty()); } -void SelectionDAGISel::CodeGenAndEmitDAG(MachineBasicBlock *BB) { +void SelectionDAGISel::CodeGenAndEmitDAG() { std::string GroupName; if (TimePassesIsEnabled) GroupName = "Instruction Selection and Scheduling"; @@ -755,7 +754,7 @@ // Iterate over all basic blocks in the function. for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { const BasicBlock *LLVMBB = &*I; - MachineBasicBlock *BB = FuncInfo->MBBMap[LLVMBB]; + BB = FuncInfo->MBBMap[LLVMBB]; BasicBlock::const_iterator const Begin = LLVMBB->begin(); BasicBlock::const_iterator const End = LLVMBB->end(); @@ -791,7 +790,7 @@ // beginning FastISel on the entry block. if (LLVMBB == &Fn.getEntryBlock()) { CurDAG->setRoot(SDB->getControlRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); SDB->clear(); } FastIS->startNewBlock(BB); @@ -839,7 +838,7 @@ } bool HadTailCall = false; - SelectBasicBlock(BB, LLVMBB, BI, llvm::next(BI), HadTailCall); + SelectBasicBlock(LLVMBB, BI, llvm::next(BI), HadTailCall); // If the call was emitted as a tail call, we're done with the block. if (HadTailCall) { @@ -875,17 +874,17 @@ // block. if (BI != End) { bool HadTailCall; - SelectBasicBlock(BB, LLVMBB, BI, End, HadTailCall); + SelectBasicBlock(LLVMBB, BI, End, HadTailCall); } - FinishBasicBlock(BB); + FinishBasicBlock(); } delete FastIS; } void -SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) { +SelectionDAGISel::FinishBasicBlock() { DEBUG(dbgs() << "Target-post-processed machine code:\n"); DEBUG(BB->dump()); @@ -924,7 +923,7 @@ // Emit the code SDB->visitBitTestHeader(SDB->BitTestCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); SDB->clear(); } @@ -945,7 +944,7 @@ CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); SDB->clear(); } @@ -992,7 +991,7 @@ SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first, BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); SDB->clear(); } @@ -1001,7 +1000,7 @@ // Emit the code SDB->visitJumpTable(SDB->JTCases[i].second); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); SDB->clear(); // Update PHI Nodes @@ -1049,7 +1048,7 @@ // Emit the code SDB->visitSwitchCase(SDB->SwitchCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(BB); + CodeGenAndEmitDAG(); // Handle any PHI nodes in successors of this chunk, as if we were coming // from the original BB before switch expansion. Note that PHI nodes can From johnny.chen at apple.com Mon Apr 19 19:15:41 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 20 Apr 2010 00:15:41 -0000 Subject: [llvm-commits] [llvm] r101839 - /llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Message-ID: <20100420001541.4D1E42A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 19:15:41 2010 New Revision: 101839 URL: http://llvm.org/viewvc/llvm-project?rev=101839&view=rev Log: More IT instruction error-handling improvements from fuzzing. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp?rev=101839&r1=101838&r2=101839&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Mon Apr 19 19:15:41 2010 @@ -513,7 +513,7 @@ // First count the trailing zeros of the IT mask. unsigned TZ = CountTrailingZeros_32(ITMask); if (TZ > 3) { - DEBUG(errs() << "Encoding error of IT mask"); + DEBUG(errs() << "Encoding error: IT Mask '0000'"); return 0; } return (4 - TZ); @@ -522,9 +522,23 @@ /// Init ITState. Note that at least one bit is always 1 in mask. bool Session::InitIT(unsigned short bits7_0) { ITCounter = CountITSize(slice(bits7_0, 3, 0)); + if (ITCounter == 0) + return false; + + // A8.6.50 IT + unsigned short FirstCond = slice(bits7_0, 7, 4); + if (FirstCond == 0xF) { + DEBUG(errs() << "Encoding error: IT FirstCond '1111'"); + return false; + } + if (FirstCond == 0xE && ITCounter != 1) { + DEBUG(errs() << "Encoding error: IT FirstCond '1110' && Mask != '1000'"); + return false; + } + ITState = bits7_0; - // Only need to check for > 0. - return ITCounter > 0; + + return true; } /// Update ITState if necessary. From bob.wilson at apple.com Mon Apr 19 19:17:16 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Tue, 20 Apr 2010 00:17:16 -0000 Subject: [llvm-commits] [llvm] r101840 - in /llvm/trunk/test/CodeGen/ARM: vld1.ll vld2.ll vld3.ll vld4.ll vldlane.ll vst1.ll vst2.ll vst3.ll vst4.ll vstlane.ll Message-ID: <20100420001716.85FCB2A6C12C@llvm.org> Author: bwilson Date: Mon Apr 19 19:17:16 2010 New Revision: 101840 URL: http://llvm.org/viewvc/llvm-project?rev=101840&view=rev Log: Fix tests for Neon load/store intrinsics to match the i8* types expected by the intrinsics. The reason for those i8* types is that the intrinsics are overloaded on the vector type and we don't have a way to declare an intrinsic where one argument is an overloaded vector type and another argument is a pointer to the vector element type. The bitcasts added here will match what the frontend will typically generate when these intrinsics are used. Modified: llvm/trunk/test/CodeGen/ARM/vld1.ll llvm/trunk/test/CodeGen/ARM/vld2.ll llvm/trunk/test/CodeGen/ARM/vld3.ll llvm/trunk/test/CodeGen/ARM/vld4.ll llvm/trunk/test/CodeGen/ARM/vldlane.ll llvm/trunk/test/CodeGen/ARM/vst1.ll llvm/trunk/test/CodeGen/ARM/vst2.ll llvm/trunk/test/CodeGen/ARM/vst3.ll llvm/trunk/test/CodeGen/ARM/vst4.ll llvm/trunk/test/CodeGen/ARM/vstlane.ll Modified: llvm/trunk/test/CodeGen/ARM/vld1.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vld1.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vld1.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vld1.ll Mon Apr 19 19:17:16 2010 @@ -10,28 +10,32 @@ define <4 x i16> @vld1i16(i16* %A) nounwind { ;CHECK: vld1i16: ;CHECK: vld1.16 - %tmp1 = call <4 x i16> @llvm.arm.neon.vld1.v4i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call <4 x i16> @llvm.arm.neon.vld1.v4i16(i8* %tmp0) ret <4 x i16> %tmp1 } define <2 x i32> @vld1i32(i32* %A) nounwind { ;CHECK: vld1i32: ;CHECK: vld1.32 - %tmp1 = call <2 x i32> @llvm.arm.neon.vld1.v2i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call <2 x i32> @llvm.arm.neon.vld1.v2i32(i8* %tmp0) ret <2 x i32> %tmp1 } define <2 x float> @vld1f(float* %A) nounwind { ;CHECK: vld1f: ;CHECK: vld1.32 - %tmp1 = call <2 x float> @llvm.arm.neon.vld1.v2f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call <2 x float> @llvm.arm.neon.vld1.v2f32(i8* %tmp0) ret <2 x float> %tmp1 } define <1 x i64> @vld1i64(i64* %A) nounwind { ;CHECK: vld1i64: ;CHECK: vld1.64 - %tmp1 = call <1 x i64> @llvm.arm.neon.vld1.v1i64(i64* %A) + %tmp0 = bitcast i64* %A to i8* + %tmp1 = call <1 x i64> @llvm.arm.neon.vld1.v1i64(i8* %tmp0) ret <1 x i64> %tmp1 } @@ -45,28 +49,32 @@ define <8 x i16> @vld1Qi16(i16* %A) nounwind { ;CHECK: vld1Qi16: ;CHECK: vld1.16 - %tmp1 = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call <8 x i16> @llvm.arm.neon.vld1.v8i16(i8* %tmp0) ret <8 x i16> %tmp1 } define <4 x i32> @vld1Qi32(i32* %A) nounwind { ;CHECK: vld1Qi32: ;CHECK: vld1.32 - %tmp1 = call <4 x i32> @llvm.arm.neon.vld1.v4i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call <4 x i32> @llvm.arm.neon.vld1.v4i32(i8* %tmp0) ret <4 x i32> %tmp1 } define <4 x float> @vld1Qf(float* %A) nounwind { ;CHECK: vld1Qf: ;CHECK: vld1.32 - %tmp1 = call <4 x float> @llvm.arm.neon.vld1.v4f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call <4 x float> @llvm.arm.neon.vld1.v4f32(i8* %tmp0) ret <4 x float> %tmp1 } define <2 x i64> @vld1Qi64(i64* %A) nounwind { ;CHECK: vld1Qi64: ;CHECK: vld1.64 - %tmp1 = call <2 x i64> @llvm.arm.neon.vld1.v2i64(i64* %A) + %tmp0 = bitcast i64* %A to i8* + %tmp1 = call <2 x i64> @llvm.arm.neon.vld1.v2i64(i8* %tmp0) ret <2 x i64> %tmp1 } Modified: llvm/trunk/test/CodeGen/ARM/vld2.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vld2.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vld2.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vld2.ll Mon Apr 19 19:17:16 2010 @@ -24,7 +24,8 @@ define <4 x i16> @vld2i16(i16* %A) nounwind { ;CHECK: vld2i16: ;CHECK: vld2.16 - %tmp1 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2.v4i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2.v4i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x4x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x4x2_t %tmp1, 1 %tmp4 = add <4 x i16> %tmp2, %tmp3 @@ -34,7 +35,8 @@ define <2 x i32> @vld2i32(i32* %A) nounwind { ;CHECK: vld2i32: ;CHECK: vld2.32 - %tmp1 = call %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2.v2i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2.v2i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x2x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x2x2_t %tmp1, 1 %tmp4 = add <2 x i32> %tmp2, %tmp3 @@ -44,7 +46,8 @@ define <2 x float> @vld2f(float* %A) nounwind { ;CHECK: vld2f: ;CHECK: vld2.32 - %tmp1 = call %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2.v2f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2.v2f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x2x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x2x2_t %tmp1, 1 %tmp4 = add <2 x float> %tmp2, %tmp3 @@ -54,7 +57,8 @@ define <1 x i64> @vld2i64(i64* %A) nounwind { ;CHECK: vld2i64: ;CHECK: vld1.64 - %tmp1 = call %struct.__neon_int64x1x2_t @llvm.arm.neon.vld2.v1i64(i64* %A) + %tmp0 = bitcast i64* %A to i8* + %tmp1 = call %struct.__neon_int64x1x2_t @llvm.arm.neon.vld2.v1i64(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int64x1x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int64x1x2_t %tmp1, 1 %tmp4 = add <1 x i64> %tmp2, %tmp3 @@ -74,7 +78,8 @@ define <8 x i16> @vld2Qi16(i16* %A) nounwind { ;CHECK: vld2Qi16: ;CHECK: vld2.16 - %tmp1 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2.v8i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2.v8i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x8x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x8x2_t %tmp1, 1 %tmp4 = add <8 x i16> %tmp2, %tmp3 @@ -84,7 +89,8 @@ define <4 x i32> @vld2Qi32(i32* %A) nounwind { ;CHECK: vld2Qi32: ;CHECK: vld2.32 - %tmp1 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2.v4i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2.v4i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x4x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x4x2_t %tmp1, 1 %tmp4 = add <4 x i32> %tmp2, %tmp3 @@ -94,7 +100,8 @@ define <4 x float> @vld2Qf(float* %A) nounwind { ;CHECK: vld2Qf: ;CHECK: vld2.32 - %tmp1 = call %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2.v4f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2.v4f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x4x2_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x4x2_t %tmp1, 1 %tmp4 = add <4 x float> %tmp2, %tmp3 Modified: llvm/trunk/test/CodeGen/ARM/vld3.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vld3.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vld3.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vld3.ll Mon Apr 19 19:17:16 2010 @@ -24,7 +24,8 @@ define <4 x i16> @vld3i16(i16* %A) nounwind { ;CHECK: vld3i16: ;CHECK: vld3.16 - %tmp1 = call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3.v4i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3.v4i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x4x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x4x3_t %tmp1, 2 %tmp4 = add <4 x i16> %tmp2, %tmp3 @@ -34,7 +35,8 @@ define <2 x i32> @vld3i32(i32* %A) nounwind { ;CHECK: vld3i32: ;CHECK: vld3.32 - %tmp1 = call %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3.v2i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3.v2i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x2x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x2x3_t %tmp1, 2 %tmp4 = add <2 x i32> %tmp2, %tmp3 @@ -44,7 +46,8 @@ define <2 x float> @vld3f(float* %A) nounwind { ;CHECK: vld3f: ;CHECK: vld3.32 - %tmp1 = call %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3.v2f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3.v2f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x2x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x2x3_t %tmp1, 2 %tmp4 = add <2 x float> %tmp2, %tmp3 @@ -54,7 +57,8 @@ define <1 x i64> @vld3i64(i64* %A) nounwind { ;CHECK: vld3i64: ;CHECK: vld1.64 - %tmp1 = call %struct.__neon_int64x1x3_t @llvm.arm.neon.vld3.v1i64(i64* %A) + %tmp0 = bitcast i64* %A to i8* + %tmp1 = call %struct.__neon_int64x1x3_t @llvm.arm.neon.vld3.v1i64(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int64x1x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int64x1x3_t %tmp1, 2 %tmp4 = add <1 x i64> %tmp2, %tmp3 @@ -76,7 +80,8 @@ ;CHECK: vld3Qi16: ;CHECK: vld3.16 ;CHECK: vld3.16 - %tmp1 = call %struct.__neon_int16x8x3_t @llvm.arm.neon.vld3.v8i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x8x3_t @llvm.arm.neon.vld3.v8i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x8x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x8x3_t %tmp1, 2 %tmp4 = add <8 x i16> %tmp2, %tmp3 @@ -87,7 +92,8 @@ ;CHECK: vld3Qi32: ;CHECK: vld3.32 ;CHECK: vld3.32 - %tmp1 = call %struct.__neon_int32x4x3_t @llvm.arm.neon.vld3.v4i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x4x3_t @llvm.arm.neon.vld3.v4i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x4x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x4x3_t %tmp1, 2 %tmp4 = add <4 x i32> %tmp2, %tmp3 @@ -98,7 +104,8 @@ ;CHECK: vld3Qf: ;CHECK: vld3.32 ;CHECK: vld3.32 - %tmp1 = call %struct.__neon_float32x4x3_t @llvm.arm.neon.vld3.v4f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x4x3_t @llvm.arm.neon.vld3.v4f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x4x3_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x4x3_t %tmp1, 2 %tmp4 = add <4 x float> %tmp2, %tmp3 Modified: llvm/trunk/test/CodeGen/ARM/vld4.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vld4.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vld4.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vld4.ll Mon Apr 19 19:17:16 2010 @@ -24,7 +24,8 @@ define <4 x i16> @vld4i16(i16* %A) nounwind { ;CHECK: vld4i16: ;CHECK: vld4.16 - %tmp1 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4.v4i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4.v4i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x4x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x4x4_t %tmp1, 2 %tmp4 = add <4 x i16> %tmp2, %tmp3 @@ -34,7 +35,8 @@ define <2 x i32> @vld4i32(i32* %A) nounwind { ;CHECK: vld4i32: ;CHECK: vld4.32 - %tmp1 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4.v2i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4.v2i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x2x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x2x4_t %tmp1, 2 %tmp4 = add <2 x i32> %tmp2, %tmp3 @@ -44,7 +46,8 @@ define <2 x float> @vld4f(float* %A) nounwind { ;CHECK: vld4f: ;CHECK: vld4.32 - %tmp1 = call %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4.v2f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4.v2f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x2x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x2x4_t %tmp1, 2 %tmp4 = add <2 x float> %tmp2, %tmp3 @@ -54,7 +57,8 @@ define <1 x i64> @vld4i64(i64* %A) nounwind { ;CHECK: vld4i64: ;CHECK: vld1.64 - %tmp1 = call %struct.__neon_int64x1x4_t @llvm.arm.neon.vld4.v1i64(i64* %A) + %tmp0 = bitcast i64* %A to i8* + %tmp1 = call %struct.__neon_int64x1x4_t @llvm.arm.neon.vld4.v1i64(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int64x1x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int64x1x4_t %tmp1, 2 %tmp4 = add <1 x i64> %tmp2, %tmp3 @@ -76,7 +80,8 @@ ;CHECK: vld4Qi16: ;CHECK: vld4.16 ;CHECK: vld4.16 - %tmp1 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4.v8i16(i16* %A) + %tmp0 = bitcast i16* %A to i8* + %tmp1 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4.v8i16(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int16x8x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int16x8x4_t %tmp1, 2 %tmp4 = add <8 x i16> %tmp2, %tmp3 @@ -87,7 +92,8 @@ ;CHECK: vld4Qi32: ;CHECK: vld4.32 ;CHECK: vld4.32 - %tmp1 = call %struct.__neon_int32x4x4_t @llvm.arm.neon.vld4.v4i32(i32* %A) + %tmp0 = bitcast i32* %A to i8* + %tmp1 = call %struct.__neon_int32x4x4_t @llvm.arm.neon.vld4.v4i32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_int32x4x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_int32x4x4_t %tmp1, 2 %tmp4 = add <4 x i32> %tmp2, %tmp3 @@ -98,7 +104,8 @@ ;CHECK: vld4Qf: ;CHECK: vld4.32 ;CHECK: vld4.32 - %tmp1 = call %struct.__neon_float32x4x4_t @llvm.arm.neon.vld4.v4f32(float* %A) + %tmp0 = bitcast float* %A to i8* + %tmp1 = call %struct.__neon_float32x4x4_t @llvm.arm.neon.vld4.v4f32(i8* %tmp0) %tmp2 = extractvalue %struct.__neon_float32x4x4_t %tmp1, 0 %tmp3 = extractvalue %struct.__neon_float32x4x4_t %tmp1, 2 %tmp4 = add <4 x float> %tmp2, %tmp3 Modified: llvm/trunk/test/CodeGen/ARM/vldlane.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vldlane.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vldlane.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vldlane.ll Mon Apr 19 19:17:16 2010 @@ -23,8 +23,9 @@ define <4 x i16> @vld2lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vld2lanei16: ;CHECK: vld2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - %tmp2 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x4x2_t @llvm.arm.neon.vld2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x4x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x4x2_t %tmp2, 1 %tmp5 = add <4 x i16> %tmp3, %tmp4 @@ -34,8 +35,9 @@ define <2 x i32> @vld2lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld2lanei32: ;CHECK: vld2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - %tmp2 = call %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int32x2x2_t @llvm.arm.neon.vld2lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int32x2x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x2x2_t %tmp2, 1 %tmp5 = add <2 x i32> %tmp3, %tmp4 @@ -45,8 +47,9 @@ define <2 x float> @vld2lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vld2lanef: ;CHECK: vld2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - %tmp2 = call %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x2x2_t @llvm.arm.neon.vld2lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x2x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x2x2_t %tmp2, 1 %tmp5 = add <2 x float> %tmp3, %tmp4 @@ -56,8 +59,9 @@ define <8 x i16> @vld2laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vld2laneQi16: ;CHECK: vld2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - %tmp2 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x8x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x8x2_t %tmp2, 1 %tmp5 = add <8 x i16> %tmp3, %tmp4 @@ -67,8 +71,9 @@ define <4 x i32> @vld2laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vld2laneQi32: ;CHECK: vld2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - %tmp2 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) + %tmp2 = call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) %tmp3 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 1 %tmp5 = add <4 x i32> %tmp3, %tmp4 @@ -78,8 +83,9 @@ define <4 x float> @vld2laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vld2laneQf: ;CHECK: vld2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - %tmp2 = call %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x4x2_t @llvm.arm.neon.vld2lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x4x2_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x4x2_t %tmp2, 1 %tmp5 = add <4 x float> %tmp3, %tmp4 @@ -120,8 +126,9 @@ define <4 x i16> @vld3lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vld3lanei16: ;CHECK: vld3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - %tmp2 = call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int16x4x3_t %tmp2, 2 @@ -133,8 +140,9 @@ define <2 x i32> @vld3lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld3lanei32: ;CHECK: vld3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - %tmp2 = call %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int32x2x3_t @llvm.arm.neon.vld3lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int32x2x3_t %tmp2, 2 @@ -146,8 +154,9 @@ define <2 x float> @vld3lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vld3lanef: ;CHECK: vld3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - %tmp2 = call %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x2x3_t @llvm.arm.neon.vld3lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_float32x2x3_t %tmp2, 2 @@ -159,8 +168,9 @@ define <8 x i16> @vld3laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vld3laneQi16: ;CHECK: vld3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - %tmp2 = call %struct.__neon_int16x8x3_t @llvm.arm.neon.vld3lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x8x3_t @llvm.arm.neon.vld3lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x8x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x8x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int16x8x3_t %tmp2, 2 @@ -172,8 +182,9 @@ define <4 x i32> @vld3laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vld3laneQi32: ;CHECK: vld3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - %tmp2 = call %struct.__neon_int32x4x3_t @llvm.arm.neon.vld3lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 3) + %tmp2 = call %struct.__neon_int32x4x3_t @llvm.arm.neon.vld3lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 3) %tmp3 = extractvalue %struct.__neon_int32x4x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x4x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int32x4x3_t %tmp2, 2 @@ -185,8 +196,9 @@ define <4 x float> @vld3laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vld3laneQf: ;CHECK: vld3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - %tmp2 = call %struct.__neon_float32x4x3_t @llvm.arm.neon.vld3lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x4x3_t @llvm.arm.neon.vld3lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x4x3_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x4x3_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_float32x4x3_t %tmp2, 2 @@ -231,8 +243,9 @@ define <4 x i16> @vld4lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vld4lanei16: ;CHECK: vld4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - %tmp2 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x4x4_t @llvm.arm.neon.vld4lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int16x4x4_t %tmp2, 2 @@ -246,8 +259,9 @@ define <2 x i32> @vld4lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vld4lanei32: ;CHECK: vld4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - %tmp2 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int32x2x4_t %tmp2, 2 @@ -261,8 +275,9 @@ define <2 x float> @vld4lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vld4lanef: ;CHECK: vld4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - %tmp2 = call %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x2x4_t @llvm.arm.neon.vld4lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_float32x2x4_t %tmp2, 2 @@ -276,8 +291,9 @@ define <8 x i16> @vld4laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vld4laneQi16: ;CHECK: vld4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - %tmp2 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int16x8x4_t @llvm.arm.neon.vld4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int16x8x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int16x8x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int16x8x4_t %tmp2, 2 @@ -291,8 +307,9 @@ define <4 x i32> @vld4laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vld4laneQi32: ;CHECK: vld4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - %tmp2 = call %struct.__neon_int32x4x4_t @llvm.arm.neon.vld4lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 1) + %tmp2 = call %struct.__neon_int32x4x4_t @llvm.arm.neon.vld4lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_int32x4x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_int32x4x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_int32x4x4_t %tmp2, 2 @@ -306,8 +323,9 @@ define <4 x float> @vld4laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vld4laneQf: ;CHECK: vld4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - %tmp2 = call %struct.__neon_float32x4x4_t @llvm.arm.neon.vld4lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) + %tmp2 = call %struct.__neon_float32x4x4_t @llvm.arm.neon.vld4lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) %tmp3 = extractvalue %struct.__neon_float32x4x4_t %tmp2, 0 %tmp4 = extractvalue %struct.__neon_float32x4x4_t %tmp2, 1 %tmp5 = extractvalue %struct.__neon_float32x4x4_t %tmp2, 2 Modified: llvm/trunk/test/CodeGen/ARM/vst1.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vst1.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vst1.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vst1.ll Mon Apr 19 19:17:16 2010 @@ -11,32 +11,36 @@ define void @vst1i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst1i16: ;CHECK: vst1.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst1.v4i16(i16* %A, <4 x i16> %tmp1) + call void @llvm.arm.neon.vst1.v4i16(i8* %tmp0, <4 x i16> %tmp1) ret void } define void @vst1i32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst1i32: ;CHECK: vst1.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst1.v2i32(i32* %A, <2 x i32> %tmp1) + call void @llvm.arm.neon.vst1.v2i32(i8* %tmp0, <2 x i32> %tmp1) ret void } define void @vst1f(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst1f: ;CHECK: vst1.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst1.v2f32(float* %A, <2 x float> %tmp1) + call void @llvm.arm.neon.vst1.v2f32(i8* %tmp0, <2 x float> %tmp1) ret void } define void @vst1i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst1i64: ;CHECK: vst1.64 + %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B - call void @llvm.arm.neon.vst1.v1i64(i64* %A, <1 x i64> %tmp1) + call void @llvm.arm.neon.vst1.v1i64(i8* %tmp0, <1 x i64> %tmp1) ret void } @@ -51,32 +55,36 @@ define void @vst1Qi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst1Qi16: ;CHECK: vst1.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst1.v8i16(i16* %A, <8 x i16> %tmp1) + call void @llvm.arm.neon.vst1.v8i16(i8* %tmp0, <8 x i16> %tmp1) ret void } define void @vst1Qi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst1Qi32: ;CHECK: vst1.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst1.v4i32(i32* %A, <4 x i32> %tmp1) + call void @llvm.arm.neon.vst1.v4i32(i8* %tmp0, <4 x i32> %tmp1) ret void } define void @vst1Qf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vst1Qf: ;CHECK: vst1.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst1.v4f32(float* %A, <4 x float> %tmp1) + call void @llvm.arm.neon.vst1.v4f32(i8* %tmp0, <4 x float> %tmp1) ret void } define void @vst1Qi64(i64* %A, <2 x i64>* %B) nounwind { ;CHECK: vst1Qi64: ;CHECK: vst1.64 + %tmp0 = bitcast i64* %A to i8* %tmp1 = load <2 x i64>* %B - call void @llvm.arm.neon.vst1.v2i64(i64* %A, <2 x i64> %tmp1) + call void @llvm.arm.neon.vst1.v2i64(i8* %tmp0, <2 x i64> %tmp1) ret void } Modified: llvm/trunk/test/CodeGen/ARM/vst2.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vst2.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vst2.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vst2.ll Mon Apr 19 19:17:16 2010 @@ -11,32 +11,36 @@ define void @vst2i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst2i16: ;CHECK: vst2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst2.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1) + call void @llvm.arm.neon.vst2.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1) ret void } define void @vst2i32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst2i32: ;CHECK: vst2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst2.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1) + call void @llvm.arm.neon.vst2.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1) ret void } define void @vst2f(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst2f: ;CHECK: vst2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst2.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1) + call void @llvm.arm.neon.vst2.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1) ret void } define void @vst2i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst2i64: ;CHECK: vst1.64 + %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B - call void @llvm.arm.neon.vst2.v1i64(i64* %A, <1 x i64> %tmp1, <1 x i64> %tmp1) + call void @llvm.arm.neon.vst2.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1) ret void } @@ -51,24 +55,27 @@ define void @vst2Qi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst2Qi16: ;CHECK: vst2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst2.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1) + call void @llvm.arm.neon.vst2.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1) ret void } define void @vst2Qi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst2Qi32: ;CHECK: vst2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst2.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1) + call void @llvm.arm.neon.vst2.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1) ret void } define void @vst2Qf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vst2Qf: ;CHECK: vst2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst2.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1) + call void @llvm.arm.neon.vst2.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1) ret void } Modified: llvm/trunk/test/CodeGen/ARM/vst3.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vst3.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vst3.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vst3.ll Mon Apr 19 19:17:16 2010 @@ -11,32 +11,36 @@ define void @vst3i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst3i16: ;CHECK: vst3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst3.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1) + call void @llvm.arm.neon.vst3.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1) ret void } define void @vst3i32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst3i32: ;CHECK: vst3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst3.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1) + call void @llvm.arm.neon.vst3.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1) ret void } define void @vst3f(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst3f: ;CHECK: vst3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst3.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1) + call void @llvm.arm.neon.vst3.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1) ret void } define void @vst3i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst3i64: ;CHECK: vst1.64 + %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B - call void @llvm.arm.neon.vst3.v1i64(i64* %A, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1) + call void @llvm.arm.neon.vst3.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1) ret void } @@ -53,8 +57,9 @@ ;CHECK: vst3Qi16: ;CHECK: vst3.16 ;CHECK: vst3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst3.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1) + call void @llvm.arm.neon.vst3.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1) ret void } @@ -62,8 +67,9 @@ ;CHECK: vst3Qi32: ;CHECK: vst3.32 ;CHECK: vst3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst3.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1) + call void @llvm.arm.neon.vst3.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1) ret void } @@ -71,8 +77,9 @@ ;CHECK: vst3Qf: ;CHECK: vst3.32 ;CHECK: vst3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst3.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1) + call void @llvm.arm.neon.vst3.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1) ret void } Modified: llvm/trunk/test/CodeGen/ARM/vst4.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vst4.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vst4.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vst4.ll Mon Apr 19 19:17:16 2010 @@ -11,32 +11,36 @@ define void @vst4i16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst4i16: ;CHECK: vst4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst4.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1) + call void @llvm.arm.neon.vst4.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1) ret void } define void @vst4i32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst4i32: ;CHECK: vst4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst4.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1) + call void @llvm.arm.neon.vst4.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1) ret void } define void @vst4f(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst4f: ;CHECK: vst4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst4.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1) + call void @llvm.arm.neon.vst4.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1) ret void } define void @vst4i64(i64* %A, <1 x i64>* %B) nounwind { ;CHECK: vst4i64: ;CHECK: vst1.64 + %tmp0 = bitcast i64* %A to i8* %tmp1 = load <1 x i64>* %B - call void @llvm.arm.neon.vst4.v1i64(i64* %A, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1) + call void @llvm.arm.neon.vst4.v1i64(i8* %tmp0, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1, <1 x i64> %tmp1) ret void } @@ -53,8 +57,9 @@ ;CHECK: vst4Qi16: ;CHECK: vst4.16 ;CHECK: vst4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst4.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1) + call void @llvm.arm.neon.vst4.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1) ret void } @@ -62,8 +67,9 @@ ;CHECK: vst4Qi32: ;CHECK: vst4.32 ;CHECK: vst4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst4.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1) + call void @llvm.arm.neon.vst4.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1) ret void } @@ -71,8 +77,9 @@ ;CHECK: vst4Qf: ;CHECK: vst4.32 ;CHECK: vst4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst4.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1) + call void @llvm.arm.neon.vst4.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1) ret void } Modified: llvm/trunk/test/CodeGen/ARM/vstlane.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vstlane.ll?rev=101840&r1=101839&r2=101840&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vstlane.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vstlane.ll Mon Apr 19 19:17:16 2010 @@ -11,48 +11,54 @@ define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst2lanei16: ;CHECK: vst2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst2lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) ret void } define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst2lanei32: ;CHECK: vst2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst2lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + call void @llvm.arm.neon.vst2lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) ret void } define void @vst2lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst2lanef: ;CHECK: vst2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst2lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + call void @llvm.arm.neon.vst2lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) ret void } define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst2laneQi16: ;CHECK: vst2.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst2lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) + call void @llvm.arm.neon.vst2lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1) ret void } define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst2laneQi32: ;CHECK: vst2.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst2lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) + call void @llvm.arm.neon.vst2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) ret void } define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vst2laneQf: ;CHECK: vst2.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst2lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, i32 3) + call void @llvm.arm.neon.vst2lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 3) ret void } @@ -76,48 +82,54 @@ define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst3lanei16: ;CHECK: vst3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst3lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + call void @llvm.arm.neon.vst3lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) ret void } define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst3lanei32: ;CHECK: vst3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst3lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + call void @llvm.arm.neon.vst3lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) ret void } define void @vst3lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst3lanef: ;CHECK: vst3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst3lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + call void @llvm.arm.neon.vst3lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) ret void } define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst3laneQi16: ;CHECK: vst3.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst3lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 6) + call void @llvm.arm.neon.vst3lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 6) ret void } define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst3laneQi32: ;CHECK: vst3.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst3lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0) + call void @llvm.arm.neon.vst3lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0) ret void } define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vst3laneQf: ;CHECK: vst3.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst3lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) + call void @llvm.arm.neon.vst3lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) ret void } @@ -142,48 +154,54 @@ define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind { ;CHECK: vst4lanei16: ;CHECK: vst4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <4 x i16>* %B - call void @llvm.arm.neon.vst4lane.v4i16(i16* %A, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) + call void @llvm.arm.neon.vst4lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1) ret void } define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind { ;CHECK: vst4lanei32: ;CHECK: vst4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <2 x i32>* %B - call void @llvm.arm.neon.vst4lane.v2i32(i32* %A, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) + call void @llvm.arm.neon.vst4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1) ret void } define void @vst4lanef(float* %A, <2 x float>* %B) nounwind { ;CHECK: vst4lanef: ;CHECK: vst4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <2 x float>* %B - call void @llvm.arm.neon.vst4lane.v2f32(float* %A, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) + call void @llvm.arm.neon.vst4lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1) ret void } define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind { ;CHECK: vst4laneQi16: ;CHECK: vst4.16 + %tmp0 = bitcast i16* %A to i8* %tmp1 = load <8 x i16>* %B - call void @llvm.arm.neon.vst4lane.v8i16(i16* %A, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7) + call void @llvm.arm.neon.vst4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7) ret void } define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind { ;CHECK: vst4laneQi32: ;CHECK: vst4.32 + %tmp0 = bitcast i32* %A to i8* %tmp1 = load <4 x i32>* %B - call void @llvm.arm.neon.vst4lane.v4i32(i32* %A, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) + call void @llvm.arm.neon.vst4lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2) ret void } define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind { ;CHECK: vst4laneQf: ;CHECK: vst4.32 + %tmp0 = bitcast float* %A to i8* %tmp1 = load <4 x float>* %B - call void @llvm.arm.neon.vst4lane.v4f32(float* %A, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) + call void @llvm.arm.neon.vst4lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1) ret void } From bob.wilson at apple.com Mon Apr 19 19:19:46 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 19 Apr 2010 17:19:46 -0700 Subject: [llvm-commits] [llvm] r101675 - in /llvm/trunk: lib/AsmParser/LLParser.cpp test/Bitcode/memcpy.ll In-Reply-To: References: <20100417212455.B3F262A6C12C@llvm.org> <4BCA2A5E.9010906@mxc.ca> Message-ID: On Apr 17, 2010, at 4:18 PM, Bob Wilson wrote: > > On Apr 17, 2010, at 2:38 PM, Nick Lewycky wrote: > >> Daniel Dunbar wrote: >>> Author: ddunbar >>> Date: Sat Apr 17 16:24:55 2010 >>> New Revision: 101675 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=101675&view=rev >>> Log: >>> Revert "reject forward references to functions whose type don't match", because DJG told me to! >> >> Chris' patch was legitimately finding problems in our test suite. The >> remaining buggy tests are test/CodeGen/ARM/{vst,vld}{1,2,3,4,lane}.ll . >> Those should be fixed by someone who can verify the types on the >> arm.neon intrinsics, after which point we can reinstate this patch. > > Assuming it's not urgent, I'll take a look at it Monday. The Neon load/store intrinsics all take i8* pointers. I don't remember offhand if that was just laziness or something more significant. OK, I fixed the ARM tests and verified that they pass with that patch reapplied. If that was the only issue with the patch, it should be OK to reapply it now. > >> >> Nick >> >>> Modified: >>> llvm/trunk/lib/AsmParser/LLParser.cpp >>> llvm/trunk/test/Bitcode/memcpy.ll >>> >>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=101675&r1=101674&r2=101675&view=diff >>> ============================================================================== >>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original) >>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Sat Apr 17 16:24:55 2010 >>> @@ -2787,10 +2787,6 @@ >>> ForwardRefVals.find(FunctionName); >>> if (FRVI != ForwardRefVals.end()) { >>> Fn = M->getFunction(FunctionName); >>> - if (Fn->getType() != PFT) >>> - return Error(FRVI->second.second, "invalid forward reference to " >>> - "function '" + FunctionName + "' with wrong type!"); >>> - >>> ForwardRefVals.erase(FRVI); >>> } else if ((Fn = M->getFunction(FunctionName))) { >>> // If this function already exists in the symbol table, then it is >>> >>> Modified: llvm/trunk/test/Bitcode/memcpy.ll >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/memcpy.ll?rev=101675&r1=101674&r2=101675&view=diff >>> ============================================================================== >>> --- llvm/trunk/test/Bitcode/memcpy.ll (original) >>> +++ llvm/trunk/test/Bitcode/memcpy.ll Sat Apr 17 16:24:55 2010 >>> @@ -20,4 +20,4 @@ >>> >>> declare void @llvm.memmove.i32(i8*, i8*, i32, i32) >>> >>> -declare void @llvm.memmove.i64(i8*, i8*, i64, i32) >>> +declare void @llvm.memmove.i64(i8*, i8*, i32, i32) >>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >>> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Apr 19 19:27:51 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Apr 2010 17:27:51 -0700 Subject: [llvm-commits] [llvm] r101675 - in /llvm/trunk: lib/AsmParser/LLParser.cpp test/Bitcode/memcpy.ll In-Reply-To: References: <20100417212455.B3F262A6C12C@llvm.org> <4BCA2A5E.9010906@mxc.ca> Message-ID: Thanks Bob! On Apr 19, 2010, at 5:19 PM, Bob Wilson wrote: > > On Apr 17, 2010, at 4:18 PM, Bob Wilson wrote: > >> >> On Apr 17, 2010, at 2:38 PM, Nick Lewycky wrote: >> >>> Daniel Dunbar wrote: >>>> Author: ddunbar >>>> Date: Sat Apr 17 16:24:55 2010 >>>> New Revision: 101675 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=101675&view=rev >>>> Log: >>>> Revert "reject forward references to functions whose type don't match", because DJG told me to! >>> >>> Chris' patch was legitimately finding problems in our test suite. The >>> remaining buggy tests are test/CodeGen/ARM/{vst,vld}{1,2,3,4,lane}.ll . >>> Those should be fixed by someone who can verify the types on the >>> arm.neon intrinsics, after which point we can reinstate this patch. >> >> Assuming it's not urgent, I'll take a look at it Monday. The Neon load/store intrinsics all take i8* pointers. I don't remember offhand if that was just laziness or something more significant. > > OK, I fixed the ARM tests and verified that they pass with that patch reapplied. If that was the only issue with the patch, it should be OK to reapply it now. > > >> >>> >>> Nick >>> >>>> Modified: >>>> llvm/trunk/lib/AsmParser/LLParser.cpp >>>> llvm/trunk/test/Bitcode/memcpy.ll >>>> >>>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=101675&r1=101674&r2=101675&view=diff >>>> ============================================================================== >>>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original) >>>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Sat Apr 17 16:24:55 2010 >>>> @@ -2787,10 +2787,6 @@ >>>> ForwardRefVals.find(FunctionName); >>>> if (FRVI != ForwardRefVals.end()) { >>>> Fn = M->getFunction(FunctionName); >>>> - if (Fn->getType() != PFT) >>>> - return Error(FRVI->second.second, "invalid forward reference to " >>>> - "function '" + FunctionName + "' with wrong type!"); >>>> - >>>> ForwardRefVals.erase(FRVI); >>>> } else if ((Fn = M->getFunction(FunctionName))) { >>>> // If this function already exists in the symbol table, then it is >>>> >>>> Modified: llvm/trunk/test/Bitcode/memcpy.ll >>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/memcpy.ll?rev=101675&r1=101674&r2=101675&view=diff >>>> ============================================================================== >>>> --- llvm/trunk/test/Bitcode/memcpy.ll (original) >>>> +++ llvm/trunk/test/Bitcode/memcpy.ll Sat Apr 17 16:24:55 2010 >>>> @@ -20,4 +20,4 @@ >>>> >>>> declare void @llvm.memmove.i32(i8*, i8*, i32, i32) >>>> >>>> -declare void @llvm.memmove.i64(i8*, i8*, i64, i32) >>>> +declare void @llvm.memmove.i64(i8*, i8*, i32, i32) >>>> >>>> >>>> _______________________________________________ >>>> llvm-commits mailing list >>>> llvm-commits at cs.uiuc.edu >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >>>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From gohman at apple.com Mon Apr 19 19:29:36 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 00:29:36 -0000 Subject: [llvm-commits] [llvm] r101843 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGISel.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100420002936.243DA2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 19:29:35 2010 New Revision: 101843 URL: http://llvm.org/viewvc/llvm-project?rev=101843&view=rev Log: Reapply the removal of SelectionDAGISel's BB, with a fix for the case where multiple blocks are emitted; functions which do this need to return the new BB so that their callers can stay current. Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h?rev=101843&r1=101842&r2=101843&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGISel.h Mon Apr 19 19:29:35 2010 @@ -46,7 +46,6 @@ MachineRegisterInfo *RegInfo; SelectionDAG *CurDAG; SelectionDAGBuilder *SDB; - MachineBasicBlock *BB; AliasAnalysis *AA; GCFunctionInfo *GFI; CodeGenOpt::Level OptLevel; @@ -283,13 +282,14 @@ void PrepareEHLandingPad(MachineBasicBlock *BB); void SelectAllBasicBlocks(const Function &Fn); - void FinishBasicBlock(); + void FinishBasicBlock(MachineBasicBlock *BB); - void SelectBasicBlock(const BasicBlock *LLVMBB, - BasicBlock::const_iterator Begin, - BasicBlock::const_iterator End, - bool &HadTailCall); - void CodeGenAndEmitDAG(); + MachineBasicBlock *SelectBasicBlock(MachineBasicBlock *BB, + const BasicBlock *LLVMBB, + BasicBlock::const_iterator Begin, + BasicBlock::const_iterator End, + bool &HadTailCall); + MachineBasicBlock *CodeGenAndEmitDAG(MachineBasicBlock *BB); void LowerArguments(const BasicBlock *BB); void ShrinkDemandedOps(); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101843&r1=101842&r2=101843&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 19:29:35 2010 @@ -249,10 +249,12 @@ FastIS->setCurDebugLoc(DebugLoc()); } -void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB, - BasicBlock::const_iterator Begin, - BasicBlock::const_iterator End, - bool &HadTailCall) { +MachineBasicBlock * +SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB, + const BasicBlock *LLVMBB, + BasicBlock::const_iterator Begin, + BasicBlock::const_iterator End, + bool &HadTailCall) { // Lower all of the non-terminator instructions. If a call is emitted // as a tail call, cease emitting nodes for this block. Terminators // are handled below. @@ -286,9 +288,10 @@ CurDAG->setRoot(SDB->getControlRoot()); // Final step, emit the lowered DAG as machine code. - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); HadTailCall = SDB->HasTailCall; SDB->clear(); + return BB; } namespace { @@ -473,7 +476,7 @@ } while (!Worklist.empty()); } -void SelectionDAGISel::CodeGenAndEmitDAG() { +MachineBasicBlock *SelectionDAGISel::CodeGenAndEmitDAG(MachineBasicBlock *BB) { std::string GroupName; if (TimePassesIsEnabled) GroupName = "Instruction Selection and Scheduling"; @@ -638,6 +641,7 @@ DEBUG(dbgs() << "Selected machine code:\n"); DEBUG(BB->dump()); + return BB; } void SelectionDAGISel::DoInstructionSelection() { @@ -754,7 +758,7 @@ // Iterate over all basic blocks in the function. for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { const BasicBlock *LLVMBB = &*I; - BB = FuncInfo->MBBMap[LLVMBB]; + MachineBasicBlock *BB = FuncInfo->MBBMap[LLVMBB]; BasicBlock::const_iterator const Begin = LLVMBB->begin(); BasicBlock::const_iterator const End = LLVMBB->end(); @@ -790,7 +794,7 @@ // beginning FastISel on the entry block. if (LLVMBB == &Fn.getEntryBlock()) { CurDAG->setRoot(SDB->getControlRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); SDB->clear(); } FastIS->startNewBlock(BB); @@ -838,7 +842,7 @@ } bool HadTailCall = false; - SelectBasicBlock(LLVMBB, BI, llvm::next(BI), HadTailCall); + BB = SelectBasicBlock(BB, LLVMBB, BI, llvm::next(BI), HadTailCall); // If the call was emitted as a tail call, we're done with the block. if (HadTailCall) { @@ -874,17 +878,17 @@ // block. if (BI != End) { bool HadTailCall; - SelectBasicBlock(LLVMBB, BI, End, HadTailCall); + BB = SelectBasicBlock(BB, LLVMBB, BI, End, HadTailCall); } - FinishBasicBlock(); + FinishBasicBlock(BB); } delete FastIS; } void -SelectionDAGISel::FinishBasicBlock() { +SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) { DEBUG(dbgs() << "Target-post-processed machine code:\n"); DEBUG(BB->dump()); @@ -923,7 +927,7 @@ // Emit the code SDB->visitBitTestHeader(SDB->BitTestCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -944,7 +948,7 @@ CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -991,7 +995,7 @@ SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first, BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); SDB->clear(); } @@ -1000,7 +1004,7 @@ // Emit the code SDB->visitJumpTable(SDB->JTCases[i].second); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); SDB->clear(); // Update PHI Nodes @@ -1048,7 +1052,7 @@ // Emit the code SDB->visitSwitchCase(SDB->SwitchCases[i], BB); CurDAG->setRoot(SDB->getRoot()); - CodeGenAndEmitDAG(); + BB = CodeGenAndEmitDAG(BB); // Handle any PHI nodes in successors of this chunk, as if we were coming // from the original BB before switch expansion. Note that PHI nodes can From gohman at apple.com Mon Apr 19 19:37:27 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 00:37:27 -0000 Subject: [llvm-commits] [llvm] r101844 - in /llvm/trunk: include/llvm/CodeGen/MachineFunction.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100420003728.0C9082A6C12C@llvm.org> Author: djg Date: Mon Apr 19 19:37:27 2010 New Revision: 101844 URL: http://llvm.org/viewvc/llvm-project?rev=101844&view=rev Log: Remove MachineFunction's DefaultDebugLoc member, and make DwarfDebug.cpp responsible for figuring out what that's supposed to be on its own. Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFunction.h?rev=101844&r1=101843&r2=101844&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineFunction.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineFunction.h Mon Apr 19 19:37:27 2010 @@ -109,10 +109,6 @@ typedef ilist BasicBlockListType; BasicBlockListType BasicBlocks; - /// Default debug location. Used to print out the debug label at the beginning - /// of a function. - DebugLoc DefaultDebugLoc; - /// FunctionNumber - This provides a unique ID for each function emitted in /// this translation unit. /// @@ -394,19 +390,6 @@ /// normal 'L' label is returned. MCSymbol *getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate = false) const; - - - //===--------------------------------------------------------------------===// - // Debug location. - // - - /// getDefaultDebugLoc - Get the default debug location for the machine - /// function. - DebugLoc getDefaultDebugLoc() const { return DefaultDebugLoc; } - - /// setDefaultDebugLoc - Get the default debug location for the machine - /// function. - void setDefaultDebugLoc(DebugLoc DL) { DefaultDebugLoc = DL; } }; //===--------------------------------------------------------------------===// Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=101844&r1=101843&r2=101844&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Apr 19 19:37:27 2010 @@ -2283,6 +2283,21 @@ } } +/// FindFirstDebugLoc - Find the first debug location in the function. This +/// is intended to be an approximation for the source position of the +/// beginning of the function. +static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) { + for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); + I != E; ++I) + for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end(); + MBBI != MBBE; ++MBBI) { + DebugLoc DL = MBBI->getDebugLoc(); + if (!DL.isUnknown()) + return DL; + } + return DebugLoc(); +} + /// beginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. void DwarfDebug::beginFunction(const MachineFunction *MF) { @@ -2297,7 +2312,7 @@ // Emit label for the implicitly defined dbg.stoppoint at the start of the // function. - DebugLoc FDL = MF->getDefaultDebugLoc(); + DebugLoc FDL = FindFirstDebugLoc(MF); if (FDL.isUnknown()) return; MDNode *Scope = FDL.getScope(MF->getFunction()->getContext()); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101844&r1=101843&r2=101844&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 19:37:27 2010 @@ -235,11 +235,6 @@ if (FastIS) FastIS->setCurDebugLoc(DL); - - // If the function doesn't have a default debug location yet, set - // it. This is a total hack. - if (MF->getDefaultDebugLoc().isUnknown()) - MF->setDefaultDebugLoc(DL); } /// ResetDebugLoc - Set MF's and SDB's DebugLocs to Unknown. From sabre at nondot.org Mon Apr 19 19:46:50 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 00:46:50 -0000 Subject: [llvm-commits] [llvm] r101845 - in /llvm/trunk: lib/Transforms/IPO/ArgumentPromotion.cpp test/Transforms/ArgumentPromotion/crash.ll Message-ID: <20100420004650.367E32A6C12C@llvm.org> Author: lattner Date: Mon Apr 19 19:46:50 2010 New Revision: 101845 URL: http://llvm.org/viewvc/llvm-project?rev=101845&view=rev Log: Fix rdar://7879828 - crash in CallGraph, a self host issue. Arg promotion was deleting call graph nodes that still had references from the 'indirect' CGN. Like the inliner, it should only delete the function if all references are gone. Added: llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll Modified: llvm/trunk/lib/Transforms/IPO/ArgumentPromotion.cpp Modified: llvm/trunk/lib/Transforms/IPO/ArgumentPromotion.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/ArgumentPromotion.cpp?rev=101845&r1=101844&r2=101845&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/IPO/ArgumentPromotion.cpp (original) +++ llvm/trunk/lib/Transforms/IPO/ArgumentPromotion.cpp Mon Apr 19 19:46:50 2010 @@ -105,7 +105,7 @@ } Changed |= LocalChange; // Remember that we changed something. } while (LocalChange); - + return Changed; } @@ -874,8 +874,14 @@ NF_CGN->stealCalledFunctionsFrom(CG[F]); - // Now that the old function is dead, delete it. - delete CG.removeFunctionFromModule(F); + // Now that the old function is dead, delete it. If there is a dangling + // reference to the CallgraphNode, just leave the dead function around for + // someone else to nuke. + CallGraphNode *CGN = CG[F]; + if (CGN->getNumReferences() == 0) + delete CG.removeFunctionFromModule(CGN); + else + F->setLinkage(Function::ExternalLinkage); return NF_CGN; } Added: llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll?rev=101845&view=auto ============================================================================== --- llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll (added) +++ llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll Mon Apr 19 19:46:50 2010 @@ -0,0 +1,38 @@ +; rdar://7879828 +; RUN: opt -inline -argpromotion %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" +target triple = "x86_64-apple-darwin10.0.0" + +define void @foo() { + invoke void @foo2() + to label %if.end432 unwind label %for.end520 + +if.end432: + unreachable + +for.end520: + unreachable +} + +define internal void @foo2() ssp { + %call7 = call fastcc i8* @foo3(i1 (i8*)* @foo4) + %call58 = call fastcc i8* @foo3(i1 (i8*)* @foo5) + unreachable +} + +define internal fastcc i8* @foo3(i1 (i8*)* %Pred) { +entry: + unreachable +} + +define internal i1 @foo4(i8* %O) nounwind { +entry: + %call = call zeroext i1 @foo5(i8* %O) ; [#uses=0] + unreachable +} + +define internal i1 @foo5(i8* %O) nounwind { +entry: + ret i1 undef +} + From sabre at nondot.org Mon Apr 19 19:47:09 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 00:47:09 -0000 Subject: [llvm-commits] [llvm] r101846 - /llvm/trunk/lib/Transforms/IPO/Inliner.cpp Message-ID: <20100420004709.1E82B2A6C12C@llvm.org> Author: lattner Date: Mon Apr 19 19:47:08 2010 New Revision: 101846 URL: http://llvm.org/viewvc/llvm-project?rev=101846&view=rev Log: make the inliner do less work for leaf functions. Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=101846&r1=101845&r2=101846&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original) +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Mon Apr 19 19:47:08 2010 @@ -333,6 +333,10 @@ DEBUG(dbgs() << ": " << CallSites.size() << " call sites.\n"); + // If there are no calls in this function, exit early. + if (CallSites.empty()) + return false; + // Now that we have all of the call sites, move the ones to functions in the // current SCC to the end of the list. unsigned FirstCallInSCC = CallSites.size(); From sabre at nondot.org Mon Apr 19 19:47:34 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 00:47:34 -0000 Subject: [llvm-commits] [llvm] r101847 - in /llvm/trunk: include/llvm/Analysis/CallGraph.h lib/Analysis/IPA/CallGraph.cpp Message-ID: <20100420004734.DDA812A6C12C@llvm.org> Author: lattner Date: Mon Apr 19 19:47:34 2010 New Revision: 101847 URL: http://llvm.org/viewvc/llvm-project?rev=101847&view=rev Log: make CallGraphNode dtor abort if a node is deleted when there are still references to it. Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=101847&r1=101846&r2=101847&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/CallGraph.h (original) +++ llvm/trunk/include/llvm/Analysis/CallGraph.h Mon Apr 19 19:47:34 2010 @@ -187,6 +187,9 @@ // CallGraphNode ctor - Create a node for the specified function. inline CallGraphNode(Function *f) : F(f), NumReferences(0) {} + ~CallGraphNode() { + assert(NumReferences == 0 && "Node deleted while references remain"); + } //===--------------------------------------------------------------------- // Accessor methods. @@ -277,6 +280,11 @@ /// time, so it should be used sparingly. void replaceCallEdge(CallSite CS, CallSite NewCS, CallGraphNode *NewNode); + /// allReferencesDropped - This is a special function that should only be + /// used by the CallGraph class. + void allReferencesDropped() { + NumReferences = 0; + } }; //===----------------------------------------------------------------------===// Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraph.cpp?rev=101847&r1=101846&r2=101847&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/CallGraph.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Mon Apr 19 19:47:34 2010 @@ -158,6 +158,7 @@ // destroy - Release memory for the call graph virtual void destroy() { /// CallsExternalNode is not in the function map, delete it explicitly. + CallsExternalNode->allReferencesDropped(); delete CallsExternalNode; CallsExternalNode = 0; CallGraph::destroy(); @@ -181,6 +182,14 @@ void CallGraph::destroy() { if (FunctionMap.empty()) return; + // Reset all node's use counts to zero before deleting them to prevent an + // assertion from firing. +#ifndef NDEBUG + for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); + I != E; ++I) + I->second->allReferencesDropped(); +#endif + for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); I != E; ++I) delete I->second; From gohman at apple.com Mon Apr 19 19:48:35 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 00:48:35 -0000 Subject: [llvm-commits] [llvm] r101848 - in /llvm/trunk: include/llvm/CodeGen/FastISel.h lib/CodeGen/SelectionDAG/FastISel.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100420004836.09B292A6C12C@llvm.org> Author: djg Date: Mon Apr 19 19:48:35 2010 New Revision: 101848 URL: http://llvm.org/viewvc/llvm-project?rev=101848&view=rev Log: Sink DebugLoc handling out of SelectionDAGISel into FastISel and SelectionDAGBuilder, where it doesn't have to be as complicated. Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=101848&r1=101847&r2=101848&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/FastISel.h (original) +++ llvm/trunk/include/llvm/CodeGen/FastISel.h Mon Apr 19 19:48:35 2010 @@ -75,11 +75,6 @@ MBB = mbb; } - /// setCurDebugLoc - Set the current debug location information, which is used - /// when creating a machine instruction. - /// - void setCurDebugLoc(DebugLoc dl) { DL = dl; } - /// getCurDebugLoc() - Return current debug location information. DebugLoc getCurDebugLoc() const { return DL; } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=101848&r1=101847&r2=101848&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Mon Apr 19 19:48:35 2010 @@ -552,14 +552,21 @@ bool FastISel::SelectInstruction(const Instruction *I) { + DL = I->getDebugLoc(); + // First, try doing target-independent selection. - if (SelectOperator(I, I->getOpcode())) + if (SelectOperator(I, I->getOpcode())) { + DL = DebugLoc(); return true; + } // Next, try calling the target to attempt to handle the instruction. - if (TargetSelectInstruction(I)) + if (TargetSelectInstruction(I)) { + DL = DebugLoc(); return true; + } + DL = DebugLoc(); return false; } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101848&r1=101847&r2=101848&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Apr 19 19:48:35 2010 @@ -614,7 +614,11 @@ } void SelectionDAGBuilder::visit(const Instruction &I) { + CurDebugLoc = I.getDebugLoc(); + visit(I.getOpcode(), I); + + CurDebugLoc = DebugLoc(); } void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) { Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=101848&r1=101847&r2=101848&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Mon Apr 19 19:48:35 2010 @@ -333,7 +333,6 @@ SDValue getControlRoot(); DebugLoc getCurDebugLoc() const { return CurDebugLoc; } - void setCurDebugLoc(DebugLoc dl) { CurDebugLoc = dl; } unsigned getSDNodeOrder() const { return SDNodeOrder; } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101848&r1=101847&r2=101848&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 19:48:35 2010 @@ -224,26 +224,6 @@ return true; } -/// SetDebugLoc - Update MF's and SDB's DebugLocs if debug information is -/// attached with this instruction. -static void SetDebugLoc(const Instruction *I, SelectionDAGBuilder *SDB, - FastISel *FastIS, MachineFunction *MF) { - DebugLoc DL = I->getDebugLoc(); - if (DL.isUnknown()) return; - - SDB->setCurDebugLoc(DL); - - if (FastIS) - FastIS->setCurDebugLoc(DL); -} - -/// ResetDebugLoc - Set MF's and SDB's DebugLocs to Unknown. -static void ResetDebugLoc(SelectionDAGBuilder *SDB, FastISel *FastIS) { - SDB->setCurDebugLoc(DebugLoc()); - if (FastIS) - FastIS->setCurDebugLoc(DebugLoc()); -} - MachineBasicBlock * SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB, const BasicBlock *LLVMBB, @@ -255,11 +235,8 @@ // are handled below. for (BasicBlock::const_iterator I = Begin; I != End && !SDB->HasTailCall && !isa(I); - ++I) { - SetDebugLoc(I, SDB, 0, MF); + ++I) SDB->visit(*I); - ResetDebugLoc(SDB, 0); - } if (!SDB->HasTailCall) { // Ensure that all instructions which are used outside of their defining @@ -273,9 +250,7 @@ HandlePHINodesInSuccessorBlocks(LLVMBB); // Lower the terminator after the copies are emitted. - SetDebugLoc(LLVMBB->getTerminator(), SDB, 0, MF); SDB->visit(*LLVMBB->getTerminator()); - ResetDebugLoc(SDB, 0); } } @@ -800,7 +775,6 @@ if (isa(BI)) if (!HandlePHINodesInSuccessorBlocksFast(LLVMBB, FastIS)) { ++NumFastIselFailures; - ResetDebugLoc(SDB, FastIS); if (EnableFastISelVerbose || EnableFastISelAbort) { dbgs() << "FastISel miss: "; BI->dump(); @@ -810,17 +784,9 @@ break; } - SetDebugLoc(BI, SDB, FastIS, MF); - // Try to select the instruction with FastISel. - if (FastIS->SelectInstruction(BI)) { - ResetDebugLoc(SDB, FastIS); + if (FastIS->SelectInstruction(BI)) continue; - } - - // Clear out the debug location so that it doesn't carry over to - // unrelated instructions. - ResetDebugLoc(SDB, FastIS); // Then handle certain instructions as single-LLVM-Instruction blocks. if (isa(BI)) { From gohman at apple.com Mon Apr 19 19:56:44 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 00:56:44 -0000 Subject: [llvm-commits] [llvm] r101850 - /llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <20100420005644.59FFD2A6C12C@llvm.org> Author: djg Date: Mon Apr 19 19:56:44 2010 New Revision: 101850 URL: http://llvm.org/viewvc/llvm-project?rev=101850&view=rev Log: Remove this debug output; it isn't that useful, and it's incomplete in the case where a basic block is split. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101850&r1=101849&r2=101850&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 19 19:56:44 2010 @@ -609,8 +609,6 @@ delete Scheduler; } - DEBUG(dbgs() << "Selected machine code:\n"); - DEBUG(BB->dump()); return BB; } From echristo at apple.com Mon Apr 19 19:59:54 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 20 Apr 2010 00:59:54 -0000 Subject: [llvm-commits] [llvm] r101851 - in /llvm/trunk: include/llvm/IntrinsicsX86.td lib/Target/X86/X86InstrSSE.td lib/VMCore/AutoUpgrade.cpp test/Bitcode/ssse3_palignr.ll test/Bitcode/ssse3_palignr.ll.bc Message-ID: <20100420005954.C86AA2A6C12C@llvm.org> Author: echristo Date: Mon Apr 19 19:59:54 2010 New Revision: 101851 URL: http://llvm.org/viewvc/llvm-project?rev=101851&view=rev Log: Remove the palignr intrinsics now that we lower them to vector shuffles, shifts and null vectors. Autoupgrade these to what we'd lower them to. Add a testcase to exercise this. Added: llvm/trunk/test/Bitcode/ssse3_palignr.ll llvm/trunk/test/Bitcode/ssse3_palignr.ll.bc (with props) Modified: llvm/trunk/include/llvm/IntrinsicsX86.td llvm/trunk/lib/Target/X86/X86InstrSSE.td llvm/trunk/lib/VMCore/AutoUpgrade.cpp Modified: llvm/trunk/include/llvm/IntrinsicsX86.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicsX86.td?rev=101851&r1=101850&r2=101851&view=diff ============================================================================== --- llvm/trunk/include/llvm/IntrinsicsX86.td (original) +++ llvm/trunk/include/llvm/IntrinsicsX86.td Mon Apr 19 19:59:54 2010 @@ -669,16 +669,6 @@ Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty], [IntrNoMem]>; } -// Align ops -let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_palign_r : - Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, - llvm_v1i64_ty, llvm_i8_ty], [IntrNoMem]>; - def int_x86_ssse3_palign_r_128 : - Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, - llvm_v2i64_ty, llvm_i8_ty], [IntrNoMem]>; -} - //===----------------------------------------------------------------------===// // SSE4.1 Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=101851&r1=101850&r2=101851&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Mon Apr 19 19:59:54 2010 @@ -2939,14 +2939,8 @@ []>, OpSize; } -def : Pat<(int_x86_ssse3_palign_r VR64:$src1, VR64:$src2, (i8 imm:$src3)), - (PALIGNR64rr VR64:$src1, VR64:$src2, (BYTE_imm imm:$src3))>, - Requires<[HasSSSE3]>; -def : Pat<(int_x86_ssse3_palign_r VR64:$src1, - (memop64 addr:$src2), - (i8 imm:$src3)), - (PALIGNR64rm VR64:$src1, addr:$src2, (BYTE_imm imm:$src3))>, - Requires<[HasSSSE3]>; +let AddedComplexity = 5 in { + def : Pat<(v1i64 (palign:$src3 VR64:$src1, VR64:$src2)), (PALIGNR64rr VR64:$src2, VR64:$src1, (SHUFFLE_get_palign_imm VR64:$src3))>, @@ -2968,16 +2962,6 @@ (SHUFFLE_get_palign_imm VR64:$src3))>, Requires<[HasSSSE3]>; -def : Pat<(int_x86_ssse3_palign_r_128 VR128:$src1, VR128:$src2, (i8 imm:$src3)), - (PALIGNR128rr VR128:$src1, VR128:$src2, (BYTE_imm imm:$src3))>, - Requires<[HasSSSE3]>; -def : Pat<(int_x86_ssse3_palign_r_128 VR128:$src1, - (memopv2i64 addr:$src2), - (i8 imm:$src3)), - (PALIGNR128rm VR128:$src1, addr:$src2, (BYTE_imm imm:$src3))>, - Requires<[HasSSSE3]>; - -let AddedComplexity = 5 in { def : Pat<(v4i32 (palign:$src3 VR128:$src1, VR128:$src2)), (PALIGNR128rr VR128:$src2, VR128:$src1, (SHUFFLE_get_palign_imm VR128:$src3))>, Modified: llvm/trunk/lib/VMCore/AutoUpgrade.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AutoUpgrade.cpp?rev=101851&r1=101850&r2=101851&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/AutoUpgrade.cpp (original) +++ llvm/trunk/lib/VMCore/AutoUpgrade.cpp Mon Apr 19 19:59:54 2010 @@ -19,6 +19,7 @@ #include "llvm/IntrinsicInst.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/IRBuilder.h" #include using namespace llvm; @@ -277,8 +278,13 @@ // Calls to these intrinsics are transformed into vector multiplies. NewFn = 0; return true; + } else if (Name.compare(5, 18, "x86.ssse3.palign.r", 18) == 0 || + Name.compare(5, 22, "x86.ssse3.palign.r.128", 22) == 0) { + // Calls to these intrinsics are transformed into vector shuffles, shifts, + // or 0. + NewFn = 0; + return true; } - break; } @@ -420,6 +426,118 @@ // Remove upgraded multiply. CI->eraseFromParent(); + } else if (F->getName() == "llvm.x86.ssse3.palign.r") { + Value *Op1 = CI->getOperand(1); + Value *Op2 = CI->getOperand(2); + Value *Op3 = CI->getOperand(3); + unsigned shiftVal = cast(Op3)->getZExtValue(); + Value *Rep; + IRBuilder<> Builder(C); + Builder.SetInsertPoint(CI->getParent(), CI); + + // If palignr is shifting the pair of input vectors less than 9 bytes, + // emit a shuffle instruction. + if (shiftVal <= 8) { + const Type *IntTy = Type::getInt32Ty(C); + const Type *EltTy = Type::getInt8Ty(C); + const Type *VecTy = VectorType::get(EltTy, 8); + + Op2 = Builder.CreateBitCast(Op2, VecTy); + Op1 = Builder.CreateBitCast(Op1, VecTy); + + llvm::SmallVector Indices; + for (unsigned i = 0; i != 8; ++i) + Indices.push_back(ConstantInt::get(IntTy, shiftVal + i)); + + Value *SV = ConstantVector::get(Indices.begin(), Indices.size()); + Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr"); + Rep = Builder.CreateBitCast(Rep, F->getReturnType()); + } + + // If palignr is shifting the pair of input vectors more than 8 but less + // than 16 bytes, emit a logical right shift of the destination. + else if (shiftVal < 16) { + // MMX has these as 1 x i64 vectors for some odd optimization reasons. + const Type *EltTy = Type::getInt64Ty(C); + const Type *VecTy = VectorType::get(EltTy, 1); + + Op1 = Builder.CreateBitCast(Op1, VecTy, "cast"); + Op2 = ConstantInt::get(VecTy, (shiftVal-8) * 8); + + // create i32 constant + Function *I = + Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_mmx_psrl_q); + Rep = Builder.CreateCall2(I, Op1, Op2, "palignr"); + } + + // If palignr is shifting the pair of vectors more than 32 bytes, emit zero. + else { + Rep = Constant::getNullValue(F->getReturnType()); + } + + // Replace any uses with our new instruction. + if (!CI->use_empty()) + CI->replaceAllUsesWith(Rep); + + // Remove upgraded instruction. + CI->eraseFromParent(); + + } else if (F->getName() == "llvm.x86.ssse3.palign.r.128") { + Value *Op1 = CI->getOperand(1); + Value *Op2 = CI->getOperand(2); + Value *Op3 = CI->getOperand(3); + unsigned shiftVal = cast(Op3)->getZExtValue(); + Value *Rep; + IRBuilder<> Builder(C); + Builder.SetInsertPoint(CI->getParent(), CI); + + // If palignr is shifting the pair of input vectors less than 17 bytes, + // emit a shuffle instruction. + if (shiftVal <= 16) { + const Type *IntTy = Type::getInt32Ty(C); + const Type *EltTy = Type::getInt8Ty(C); + const Type *VecTy = VectorType::get(EltTy, 16); + + Op2 = Builder.CreateBitCast(Op2, VecTy); + Op1 = Builder.CreateBitCast(Op1, VecTy); + + llvm::SmallVector Indices; + for (unsigned i = 0; i != 16; ++i) + Indices.push_back(ConstantInt::get(IntTy, shiftVal + i)); + + Value *SV = ConstantVector::get(Indices.begin(), Indices.size()); + Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr"); + Rep = Builder.CreateBitCast(Rep, F->getReturnType()); + } + + // If palignr is shifting the pair of input vectors more than 16 but less + // than 32 bytes, emit a logical right shift of the destination. + else if (shiftVal < 32) { + const Type *EltTy = Type::getInt64Ty(C); + const Type *VecTy = VectorType::get(EltTy, 2); + const Type *IntTy = Type::getInt32Ty(C); + + Op1 = Builder.CreateBitCast(Op1, VecTy, "cast"); + Op2 = ConstantInt::get(IntTy, (shiftVal-16) * 8); + + // create i32 constant + Function *I = + Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_sse2_psrl_dq); + Rep = Builder.CreateCall2(I, Op1, Op2, "palignr"); + } + + // If palignr is shifting the pair of vectors more than 32 bytes, emit zero. + else { + Rep = Constant::getNullValue(F->getReturnType()); + } + + // Replace any uses with our new instruction. + if (!CI->use_empty()) + CI->replaceAllUsesWith(Rep); + + // Remove upgraded instruction. + CI->eraseFromParent(); + } else { llvm_unreachable("Unknown function for CallInst upgrade."); } Added: llvm/trunk/test/Bitcode/ssse3_palignr.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/ssse3_palignr.ll?rev=101851&view=auto ============================================================================== --- llvm/trunk/test/Bitcode/ssse3_palignr.ll (added) +++ llvm/trunk/test/Bitcode/ssse3_palignr.ll Mon Apr 19 19:59:54 2010 @@ -0,0 +1 @@ +; RUN: llvm-dis < %s.bc | not grep {@llvm\\.palign} Added: llvm/trunk/test/Bitcode/ssse3_palignr.ll.bc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/ssse3_palignr.ll.bc?rev=101851&view=auto ============================================================================== Binary file - no diff available. Propchange: llvm/trunk/test/Bitcode/ssse3_palignr.ll.bc ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream From johnny.chen at apple.com Mon Apr 19 20:01:57 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 20 Apr 2010 01:01:57 -0000 Subject: [llvm-commits] [llvm] r101852 - /llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Message-ID: <20100420010157.4D53C2A6C12C@llvm.org> Author: johnny Date: Mon Apr 19 20:01:57 2010 New Revision: 101852 URL: http://llvm.org/viewvc/llvm-project?rev=101852&view=rev Log: Better error-handling for DisassembleThumb2DPModImm() with 2-reg operands where d==15 is considered illegal. Return false instead of assert(). Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=101852&r1=101851&r2=101852&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Mon Apr 19 20:01:57 2010 @@ -1413,7 +1413,10 @@ ++OpIdx; if (TwoReg) { - assert(!NoDstReg && "Internal error"); + if (NoDstReg) { + DEBUG(errs() << "Thumb encoding error: d==15 for DPModImm 2-reg instr.\n"); + return false; + } MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, decodeRn(insn)))); ++OpIdx; From sabre at nondot.org Mon Apr 19 20:11:32 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 01:11:32 -0000 Subject: [llvm-commits] [llvm] r101854 - /llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt Message-ID: <20100420011132.DD3272A6C12C@llvm.org> Author: lattner Date: Mon Apr 19 20:11:32 2010 New Revision: 101854 URL: http://llvm.org/viewvc/llvm-project?rev=101854&view=rev Log: disable optimizations in this directory for MSVC9. This avoids an optimizer infinite loop on the file, PR6866. Modified: llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt Modified: llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt?rev=101854&r1=101853&r2=101854&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt (original) +++ llvm/trunk/lib/Target/X86/Disassembler/CMakeLists.txt Mon Apr 19 20:11:32 2010 @@ -4,4 +4,11 @@ X86Disassembler.cpp X86DisassemblerDecoder.c ) +# workaround for hanging compilation on MSVC9 +if( MSVC_VERSION EQUAL 1500 ) +set_property( + SOURCE X86Disassembler.cpp + PROPERTY COMPILE_FLAGS "/Od" + ) +endif() add_dependencies(LLVMX86Disassembler X86CodeGenTable_gen) From isanbard at gmail.com Mon Apr 19 20:25:02 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 20 Apr 2010 01:25:02 -0000 Subject: [llvm-commits] [llvm] r101855 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll Message-ID: <20100420012502.1B40A2A6C12C@llvm.org> Author: void Date: Mon Apr 19 20:25:01 2010 New Revision: 101855 URL: http://llvm.org/viewvc/llvm-project?rev=101855&view=rev Log: The visitXOR method can return the same SDNode. If so, we don't want to delete it as it's not dead. Added: llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=101855&r1=101854&r2=101855&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr 19 20:25:01 2010 @@ -4911,7 +4911,7 @@ if (Op0.getOpcode() == Op1.getOpcode()) { // Avoid missing important xor optimizations. SDValue Tmp = visitXOR(TheXor); - if (Tmp.getNode()) { + if (Tmp.getNode() && Tmp.getNode() != TheXor) { DEBUG(dbgs() << "\nReplacing.8 "; TheXor->dump(&DAG); dbgs() << "\nWith: "; Added: llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll?rev=101855&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll (added) +++ llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll Mon Apr 19 20:25:01 2010 @@ -0,0 +1,58 @@ +; RUN: llc < %s -mtriple=i386-apple-darwin +; rdar://7869290 + +%struct.anon = type { float } + +define void @func() nounwind ssp { +entry: + br label %bb66 + +bb: ; preds = %bb66 + br i1 undef, label %bb65, label %bb2 + +bb2: ; preds = %bb + br i1 undef, label %bb65, label %bb3 + +bb3: ; preds = %bb2 + br i1 undef, label %bb65, label %bb4 + +bb4: ; preds = %bb3 + br i1 undef, label %bb65, label %bb5 + +bb5: ; preds = %bb4 + br i1 undef, label %bb65, label %bb6 + +bb6: ; preds = %bb5 + br i1 undef, label %bb65, label %bb11 + +bb11: ; preds = %bb6 + br i1 undef, label %bb65, label %bb12 + +bb12: ; preds = %bb11 + br i1 undef, label %bb65, label %bb13 + +bb13: ; preds = %bb12 + br i1 undef, label %bb65, label %bb14 + +bb14: ; preds = %bb13 + %0 = trunc i16 undef to i1 ; [#uses=1] + %1 = load i8* undef, align 8 ; [#uses=1] + %2 = shl i8 %1, 4 ; [#uses=1] + %3 = lshr i8 %2, 7 ; [#uses=1] + %4 = trunc i8 %3 to i1 ; [#uses=1] + %5 = icmp ne i1 %0, %4 ; [#uses=1] + br i1 %5, label %bb65, label %bb15 + +bb15: ; preds = %bb14 + %6 = load %struct.anon** undef, align 8 ; <%struct.anon*> [#uses=0] + br label %bb65 + +bb65: ; preds = %bb15, %bb14, %bb13, %bb12, %bb11, %bb6, %bb5, %bb4, %bb3, %bb2, %bb + br label %bb66 + +bb66: ; preds = %bb65, %entry + br i1 undef, label %bb, label %bb67 + +bb67: ; preds = %bb66 + ret void +} From gohman at apple.com Mon Apr 19 20:58:20 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 01:58:20 -0000 Subject: [llvm-commits] [llvm] r101860 - /llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Message-ID: <20100420015820.7A3232A6C12C@llvm.org> Author: djg Date: Mon Apr 19 20:58:20 2010 New Revision: 101860 URL: http://llvm.org/viewvc/llvm-project?rev=101860&view=rev Log: Delete a redundant return statement. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=101860&r1=101859&r2=101860&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Mon Apr 19 20:58:20 2010 @@ -657,7 +657,6 @@ i != e; ++i) MI->addRegisterDead(IDList[i-II.getNumDefs()], TRI); } - return; } /// EmitSpecialNode - Generate machine code for a target-independent node and From clattner at apple.com Mon Apr 19 23:42:54 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 19 Apr 2010 21:42:54 -0700 Subject: [llvm-commits] [llvm] r101855 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll In-Reply-To: <20100420012502.1B40A2A6C12C@llvm.org> References: <20100420012502.1B40A2A6C12C@llvm.org> Message-ID: On Apr 19, 2010, at 6:25 PM, Bill Wendling wrote: > Author: void > Date: Mon Apr 19 20:25:01 2010 > New Revision: 101855 > > URL: http://llvm.org/viewvc/llvm-project?rev=101855&view=rev > Log: > The visitXOR method can return the same SDNode. If so, we don't want to delete > it as it's not dead. Please hand reduce the testcase and add it to the end of test/CodeGen/X86/crash.ll, thanks. -Chris > > Added: > llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll > Modified: > llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp > > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=101855&r1=101854&r2=101855&view=diff > ============================================================================== > --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) > +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr 19 20:25:01 2010 > @@ -4911,7 +4911,7 @@ > if (Op0.getOpcode() == Op1.getOpcode()) { > // Avoid missing important xor optimizations. > SDValue Tmp = visitXOR(TheXor); > - if (Tmp.getNode()) { > + if (Tmp.getNode() && Tmp.getNode() != TheXor) { > DEBUG(dbgs() << "\nReplacing.8 "; > TheXor->dump(&DAG); > dbgs() << "\nWith: "; > > Added: llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll?rev=101855&view=auto > ============================================================================== > --- llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll (added) > +++ llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll Mon Apr 19 20:25:01 2010 > @@ -0,0 +1,58 @@ > +; RUN: llc < %s -mtriple=i386-apple-darwin > +; rdar://7869290 > + > +%struct.anon = type { float } > + > +define void @func() nounwind ssp { > +entry: > + br label %bb66 > + > +bb: ; preds = %bb66 > + br i1 undef, label %bb65, label %bb2 > + > +bb2: ; preds = %bb > + br i1 undef, label %bb65, label %bb3 > + > +bb3: ; preds = %bb2 > + br i1 undef, label %bb65, label %bb4 > + > +bb4: ; preds = %bb3 > + br i1 undef, label %bb65, label %bb5 > + > +bb5: ; preds = %bb4 > + br i1 undef, label %bb65, label %bb6 > + > +bb6: ; preds = %bb5 > + br i1 undef, label %bb65, label %bb11 > + > +bb11: ; preds = %bb6 > + br i1 undef, label %bb65, label %bb12 > + > +bb12: ; preds = %bb11 > + br i1 undef, label %bb65, label %bb13 > + > +bb13: ; preds = %bb12 > + br i1 undef, label %bb65, label %bb14 > + > +bb14: ; preds = %bb13 > + %0 = trunc i16 undef to i1 ; [#uses=1] > + %1 = load i8* undef, align 8 ; [#uses=1] > + %2 = shl i8 %1, 4 ; [#uses=1] > + %3 = lshr i8 %2, 7 ; [#uses=1] > + %4 = trunc i8 %3 to i1 ; [#uses=1] > + %5 = icmp ne i1 %0, %4 ; [#uses=1] > + br i1 %5, label %bb65, label %bb15 > + > +bb15: ; preds = %bb14 > + %6 = load %struct.anon** undef, align 8 ; <%struct.anon*> [#uses=0] > + br label %bb65 > + > +bb65: ; preds = %bb15, %bb14, %bb13, %bb12, %bb11, %bb6, %bb5, %bb4, %bb3, %bb2, %bb > + br label %bb66 > + > +bb66: ; preds = %bb65, %entry > + br i1 undef, label %bb, label %bb67 > + > +bb67: ; preds = %bb66 > + ret void > +} > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From sabre at nondot.org Mon Apr 19 23:49:11 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 04:49:11 -0000 Subject: [llvm-commits] [llvm] r101866 - in /llvm/trunk: lib/AsmParser/LLParser.cpp test/Bitcode/memcpy.ll Message-ID: <20100420044911.66F802A6C12C@llvm.org> Author: lattner Date: Mon Apr 19 23:49:11 2010 New Revision: 101866 URL: http://llvm.org/viewvc/llvm-project?rev=101866&view=rev Log: reapply 'reject forward references to functions whose type don't match' now that the testsuite has been updated. Modified: llvm/trunk/lib/AsmParser/LLParser.cpp llvm/trunk/test/Bitcode/memcpy.ll Modified: llvm/trunk/lib/AsmParser/LLParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=101866&r1=101865&r2=101866&view=diff ============================================================================== --- llvm/trunk/lib/AsmParser/LLParser.cpp (original) +++ llvm/trunk/lib/AsmParser/LLParser.cpp Mon Apr 19 23:49:11 2010 @@ -2787,6 +2787,10 @@ ForwardRefVals.find(FunctionName); if (FRVI != ForwardRefVals.end()) { Fn = M->getFunction(FunctionName); + if (Fn->getType() != PFT) + return Error(FRVI->second.second, "invalid forward reference to " + "function '" + FunctionName + "' with wrong type!"); + ForwardRefVals.erase(FRVI); } else if ((Fn = M->getFunction(FunctionName))) { // If this function already exists in the symbol table, then it is Modified: llvm/trunk/test/Bitcode/memcpy.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/memcpy.ll?rev=101866&r1=101865&r2=101866&view=diff ============================================================================== --- llvm/trunk/test/Bitcode/memcpy.ll (original) +++ llvm/trunk/test/Bitcode/memcpy.ll Mon Apr 19 23:49:11 2010 @@ -20,4 +20,4 @@ declare void @llvm.memmove.i32(i8*, i8*, i32, i32) -declare void @llvm.memmove.i64(i8*, i8*, i32, i32) +declare void @llvm.memmove.i64(i8*, i8*, i64, i32) From sabre at nondot.org Tue Apr 20 00:09:16 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 05:09:16 -0000 Subject: [llvm-commits] [llvm] r101870 - in /llvm/trunk: lib/Transforms/Scalar/LoopUnswitch.cpp test/Transforms/LoopUnswitch/crash.ll Message-ID: <20100420050916.3D9CA2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 00:09:16 2010 New Revision: 101870 URL: http://llvm.org/viewvc/llvm-project?rev=101870&view=rev Log: RewriteLoopBodyWithConditionConstant can end up rewriting the condition we're unswitching on. In this case, don't try to simplify the second copy of the loop which may be dead or not, but is probably a constant now. This fixes PR6879 Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp llvm/trunk/test/Transforms/LoopUnswitch/crash.ll Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=101870&r1=101869&r2=101870&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Tue Apr 20 00:09:16 2010 @@ -677,15 +677,22 @@ LoopProcessWorklist.push_back(NewLoop); redoLoop = true; + // Keep a WeakVH holding onto LIC. If the first call to RewriteLoopBody + // deletes the instruction (for example by simplifying a PHI that feeds into + // the condition that we're unswitching on), we don't rewrite the second + // iteration. + WeakVH LICHandle(LIC); + // Now we rewrite the original code to know that the condition is true and the // new code to know that the condition is false. RewriteLoopBodyWithConditionConstant(L, LIC, Val, false); - - // It's possible that simplifying one loop could cause the other to be - // deleted. If so, don't simplify it. - if (!LoopProcessWorklist.empty() && LoopProcessWorklist.back() == NewLoop) - RewriteLoopBodyWithConditionConstant(NewLoop, LIC, Val, true); + // It's possible that simplifying one loop could cause the other to be + // changed to another value or a constant. If its a constant, don't simplify + // it. + if (!LoopProcessWorklist.empty() && LoopProcessWorklist.back() == NewLoop && + LICHandle && !isa(LICHandle)) + RewriteLoopBodyWithConditionConstant(NewLoop, LICHandle, Val, true); } /// RemoveFromWorklist - Remove all instances of I from the worklist vector @@ -981,6 +988,8 @@ continue; } + // FIXME: Change this to use instruction simplify interfaces! + // Special case hacks that appear commonly in unswitched code. switch (I->getOpcode()) { case Instruction::Select: Modified: llvm/trunk/test/Transforms/LoopUnswitch/crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnswitch/crash.ll?rev=101870&r1=101869&r2=101870&view=diff ============================================================================== --- llvm/trunk/test/Transforms/LoopUnswitch/crash.ll (original) +++ llvm/trunk/test/Transforms/LoopUnswitch/crash.ll Tue Apr 20 00:09:16 2010 @@ -45,3 +45,22 @@ for.end: ; preds = %for.body, %entry ret void } + +; PR6879 +define i32* @test3(i32** %p_45, i16 zeroext %p_46, i64 %p_47, i64 %p_48, i16 signext %p_49) nounwind { +entry: + br label %for.cond + +for.cond: ; preds = %for.cond4, %entry + br i1 false, label %for.cond4, label %for.end88 + +for.cond4: ; preds = %for.cond + %conv46 = trunc i32 0 to i8 ; [#uses=2] + %cmp60 = icmp sgt i8 %conv46, 124 ; [#uses=1] + %or.cond = and i1 undef, %cmp60 ; [#uses=1] + %cond = select i1 %or.cond, i8 %conv46, i8 undef ; [#uses=0] + br label %for.cond + +for.end88: ; preds = %for.cond + ret i32* undef +} From sabre at nondot.org Tue Apr 20 00:32:14 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 05:32:14 -0000 Subject: [llvm-commits] [llvm] r101873 - in /llvm/trunk: include/llvm/Analysis/InstructionSimplify.h lib/Analysis/InstructionSimplify.cpp lib/Transforms/InstCombine/InstCombineSelect.cpp Message-ID: <20100420053214.58E3F2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 00:32:14 2010 New Revision: 101873 URL: http://llvm.org/viewvc/llvm-project?rev=101873&view=rev Log: move some select simplifications out out instcombine into inst simplify. No functionality change. Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h llvm/trunk/lib/Analysis/InstructionSimplify.cpp llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=101873&r1=101872&r2=101873&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (original) +++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Tue Apr 20 00:32:14 2010 @@ -46,6 +46,10 @@ Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, const TargetData *TD = 0); + /// SimplifySelectInst - Given operands for a SelectInst, see if we can fold + /// the result. If not, this returns null. + Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, + const TargetData *TD = 0); /// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can /// fold the result. If not, this returns null. Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=101873&r1=101872&r2=101873&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original) +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Tue Apr 20 00:32:14 2010 @@ -314,6 +314,35 @@ return 0; } +/// SimplifySelectInst - Given operands for a SelectInst, see if we can fold +/// the result. If not, this returns null. +Value *llvm::SimplifySelectInst(Value *CondVal, Value *TrueVal, Value *FalseVal, + const TargetData *TD) { + // select true, X, Y -> X + // select false, X, Y -> Y + if (ConstantInt *CB = dyn_cast(CondVal)) + return CB->getZExtValue() ? TrueVal : FalseVal; + + // select C, X, X -> X + if (TrueVal == FalseVal) + return TrueVal; + + if (isa(TrueVal)) // select C, undef, X -> X + return FalseVal; + if (isa(FalseVal)) // select C, X, undef -> X + return TrueVal; + if (isa(CondVal)) { // select undef, X, Y -> X or Y + if (isa(TrueVal)) + return TrueVal; + return FalseVal; + } + + + + return 0; +} + + /// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can /// fold the result. If not, this returns null. Value *llvm::SimplifyGEPInst(Value *const *Ops, unsigned NumOps, @@ -391,6 +420,9 @@ case Instruction::FCmp: return SimplifyFCmpInst(cast(I)->getPredicate(), I->getOperand(0), I->getOperand(1), TD); + case Instruction::Select: + return SimplifySelectInst(I->getOperand(0), I->getOperand(1), + I->getOperand(2), TD); case Instruction::GetElementPtr: { SmallVector Ops(I->op_begin(), I->op_end()); return SimplifyGEPInst(&Ops[0], Ops.size(), TD); Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=101873&r1=101872&r2=101873&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Tue Apr 20 00:32:14 2010 @@ -13,6 +13,7 @@ #include "InstCombine.h" #include "llvm/Support/PatternMatch.h" +#include "llvm/Analysis/InstructionSimplify.h" using namespace llvm; using namespace PatternMatch; @@ -421,49 +422,30 @@ Value *TrueVal = SI.getTrueValue(); Value *FalseVal = SI.getFalseValue(); - // select true, X, Y -> X - // select false, X, Y -> Y - if (ConstantInt *C = dyn_cast(CondVal)) - return ReplaceInstUsesWith(SI, C->getZExtValue() ? TrueVal : FalseVal); - - // select C, X, X -> X - if (TrueVal == FalseVal) - return ReplaceInstUsesWith(SI, TrueVal); - - if (isa(TrueVal)) // select C, undef, X -> X - return ReplaceInstUsesWith(SI, FalseVal); - if (isa(FalseVal)) // select C, X, undef -> X - return ReplaceInstUsesWith(SI, TrueVal); - if (isa(CondVal)) { // select undef, X, Y -> X or Y - if (isa(TrueVal)) - return ReplaceInstUsesWith(SI, TrueVal); - else - return ReplaceInstUsesWith(SI, FalseVal); - } + if (Value *V = SimplifySelectInst(CondVal, TrueVal, FalseVal, TD)) + return ReplaceInstUsesWith(SI, V); if (SI.getType()->isIntegerTy(1)) { if (ConstantInt *C = dyn_cast(TrueVal)) { if (C->getZExtValue()) { // Change: A = select B, true, C --> A = or B, C return BinaryOperator::CreateOr(CondVal, FalseVal); - } else { - // Change: A = select B, false, C --> A = and !B, C - Value *NotCond = - InsertNewInstBefore(BinaryOperator::CreateNot(CondVal, - "not."+CondVal->getName()), SI); - return BinaryOperator::CreateAnd(NotCond, FalseVal); } + // Change: A = select B, false, C --> A = and !B, C + Value *NotCond = + InsertNewInstBefore(BinaryOperator::CreateNot(CondVal, + "not."+CondVal->getName()), SI); + return BinaryOperator::CreateAnd(NotCond, FalseVal); } else if (ConstantInt *C = dyn_cast(FalseVal)) { if (C->getZExtValue() == false) { // Change: A = select B, C, false --> A = and B, C return BinaryOperator::CreateAnd(CondVal, TrueVal); - } else { - // Change: A = select B, C, true --> A = or !B, C - Value *NotCond = - InsertNewInstBefore(BinaryOperator::CreateNot(CondVal, - "not."+CondVal->getName()), SI); - return BinaryOperator::CreateOr(NotCond, TrueVal); } + // Change: A = select B, C, true --> A = or !B, C + Value *NotCond = + InsertNewInstBefore(BinaryOperator::CreateNot(CondVal, + "not."+CondVal->getName()), SI); + return BinaryOperator::CreateOr(NotCond, TrueVal); } // select a, b, a -> a&b From sabre at nondot.org Tue Apr 20 00:33:18 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 05:33:18 -0000 Subject: [llvm-commits] [llvm] r101874 - /llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Message-ID: <20100420053318.63D242A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 00:33:18 2010 New Revision: 101874 URL: http://llvm.org/viewvc/llvm-project?rev=101874&view=rev Log: remove a bunch of ad-hoc code to simplify instructions from loop unswitch, and use inst simplify instead. It is more powerful and less duplication. Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=101874&r1=101873&r2=101874&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Tue Apr 20 00:33:18 2010 @@ -34,6 +34,7 @@ #include "llvm/Instructions.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/InlineCost.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Dominators.h" @@ -988,47 +989,16 @@ continue; } - // FIXME: Change this to use instruction simplify interfaces! + // See if instruction simplification can hack this up. This is common for + // things like "select false, X, Y" after unswitching made the condition be + // 'false'. + if (Value *V = SimplifyInstruction(I)) { + ReplaceUsesOfWith(I, V, Worklist, L, LPM); + continue; + } // Special case hacks that appear commonly in unswitched code. - switch (I->getOpcode()) { - case Instruction::Select: - if (ConstantInt *CB = dyn_cast(I->getOperand(0))) { - ReplaceUsesOfWith(I, I->getOperand(!CB->getZExtValue()+1), Worklist, L, - LPM); - continue; - } - break; - case Instruction::And: - if (isa(I->getOperand(0)) && - // constant -> RHS - I->getOperand(0)->getType()->isIntegerTy(1)) - cast(I)->swapOperands(); - if (ConstantInt *CB = dyn_cast(I->getOperand(1))) - if (CB->getType()->isIntegerTy(1)) { - if (CB->isOne()) // X & 1 -> X - ReplaceUsesOfWith(I, I->getOperand(0), Worklist, L, LPM); - else // X & 0 -> 0 - ReplaceUsesOfWith(I, I->getOperand(1), Worklist, L, LPM); - continue; - } - break; - case Instruction::Or: - if (isa(I->getOperand(0)) && - // constant -> RHS - I->getOperand(0)->getType()->isIntegerTy(1)) - cast(I)->swapOperands(); - if (ConstantInt *CB = dyn_cast(I->getOperand(1))) - if (CB->getType()->isIntegerTy(1)) { - if (CB->isOne()) // X | 1 -> 1 - ReplaceUsesOfWith(I, I->getOperand(1), Worklist, L, LPM); - else // X | 0 -> X - ReplaceUsesOfWith(I, I->getOperand(0), Worklist, L, LPM); - continue; - } - break; - case Instruction::Br: { - BranchInst *BI = cast(I); + if (BranchInst *BI = dyn_cast(I)) { if (BI->isUnconditional()) { // If BI's parent is the only pred of the successor, fold the two blocks // together. @@ -1061,13 +1031,13 @@ LPM->deleteSimpleAnalysisValue(Succ, L); Succ->eraseFromParent(); ++NumSimplify; - break; + continue; } if (ConstantInt *CB = dyn_cast(BI->getCondition())){ // Conditional branch. Turn it into an unconditional branch, then // remove dead blocks. - break; // FIXME: Enable. + continue; // FIXME: Enable. DEBUG(dbgs() << "Folded branch: " << *BI); BasicBlock *DeadSucc = BI->getSuccessor(CB->getZExtValue()); @@ -1081,8 +1051,7 @@ RemoveBlockIfDead(DeadSucc, Worklist, L); } - break; - } + continue; } } } From sabre at nondot.org Tue Apr 20 00:36:09 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 05:36:09 -0000 Subject: [llvm-commits] [llvm] r101875 - in /llvm/trunk: lib/Target/CellSPU/SPUISelLowering.cpp test/CodeGen/CellSPU/crash.ll Message-ID: <20100420053609.EFA8B2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 00:36:09 2010 New Revision: 101875 URL: http://llvm.org/viewvc/llvm-project?rev=101875&view=rev Log: teach cellspu how to return i8 and i16 from calls, patch by Kalle Raiskila! Added: llvm/trunk/test/CodeGen/CellSPU/crash.ll Modified: llvm/trunk/lib/Target/CellSPU/SPUISelLowering.cpp Modified: llvm/trunk/lib/Target/CellSPU/SPUISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUISelLowering.cpp?rev=101875&r1=101874&r2=101875&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUISelLowering.cpp (original) +++ llvm/trunk/lib/Target/CellSPU/SPUISelLowering.cpp Tue Apr 20 00:36:09 2010 @@ -1330,22 +1330,12 @@ InVals.push_back(Chain.getValue(0)); } break; + case MVT::i8: + case MVT::i16: case MVT::i64: - Chain = DAG.getCopyFromReg(Chain, dl, SPU::R3, MVT::i64, - InFlag).getValue(1); - InVals.push_back(Chain.getValue(0)); - break; case MVT::i128: - Chain = DAG.getCopyFromReg(Chain, dl, SPU::R3, MVT::i128, - InFlag).getValue(1); - InVals.push_back(Chain.getValue(0)); - break; case MVT::f32: case MVT::f64: - Chain = DAG.getCopyFromReg(Chain, dl, SPU::R3, Ins[0].VT, - InFlag).getValue(1); - InVals.push_back(Chain.getValue(0)); - break; case MVT::v2f64: case MVT::v2i64: case MVT::v4f32: Added: llvm/trunk/test/CodeGen/CellSPU/crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/CellSPU/crash.ll?rev=101875&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/CellSPU/crash.ll (added) +++ llvm/trunk/test/CodeGen/CellSPU/crash.ll Tue Apr 20 00:36:09 2010 @@ -0,0 +1,8 @@ +; RUN: llc %s -march=cellspu -o - +declare i8 @return_i8() +declare i16 @return_i16() +define void @testfunc() { + %rv1 = call i8 @return_i8() + %rv2 = call i16 @return_i16() + ret void +} \ No newline at end of file From sabre at nondot.org Tue Apr 20 01:20:21 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 06:20:21 -0000 Subject: [llvm-commits] [llvm] r101879 - in /llvm/trunk: lib/CodeGen/AsmPrinter/AsmPrinter.cpp test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll Message-ID: <20100420062021.B63DC2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 01:20:21 2010 New Revision: 101879 URL: http://llvm.org/viewvc/llvm-project?rev=101879&view=rev Log: Bill's change in r95336 broke empty aggregates embedded in other types. fix this by only bumping zero-byte globals up to a single byte if the *entire global* is zero size, fixing PR6340. This also fixes empty arrays etc to be handled correctly, and only does this on subsection-via-symbols targets (aka darwin) which is the only place where this matters. Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp llvm/trunk/test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=101879&r1=101878&r2=101879&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Apr 20 01:20:21 2010 @@ -1155,6 +1155,10 @@ OutStreamer.EmitValueToAlignment(1 << NumBits, 0, 1, 0); } +//===----------------------------------------------------------------------===// +// Constant emission. +//===----------------------------------------------------------------------===// + /// LowerConstant - Lower the specified LLVM Constant to an MCExpr. /// static const MCExpr *LowerConstant(const Constant *CV, AsmPrinter &AP) { @@ -1282,12 +1286,15 @@ } } +static void EmitGlobalConstantImpl(const Constant *C, unsigned AddrSpace, + AsmPrinter &AP); + static void EmitGlobalConstantArray(const ConstantArray *CA, unsigned AddrSpace, AsmPrinter &AP) { if (AddrSpace != 0 || !CA->isString()) { // Not a string. Print the values in successive locations for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) - AP.EmitGlobalConstant(CA->getOperand(i), AddrSpace); + EmitGlobalConstantImpl(CA->getOperand(i), AddrSpace, AP); return; } @@ -1303,7 +1310,7 @@ static void EmitGlobalConstantVector(const ConstantVector *CV, unsigned AddrSpace, AsmPrinter &AP) { for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i) - AP.EmitGlobalConstant(CV->getOperand(i), AddrSpace); + EmitGlobalConstantImpl(CV->getOperand(i), AddrSpace, AP); } static void EmitGlobalConstantStruct(const ConstantStruct *CS, @@ -1323,7 +1330,7 @@ SizeSoFar += FieldSize + PadSize; // Now print the actual field value. - AP.EmitGlobalConstant(Field, AddrSpace); + EmitGlobalConstantImpl(Field, AddrSpace, AP); // Insert padding - this may include padding to increase the size of the // current field up to the ABI size (if the struct is not packed) as well @@ -1343,7 +1350,7 @@ unsigned FilledSize = TD->getTypeAllocSize(Contents->getType()); // Print the actually filled part - AP.EmitGlobalConstant(Contents, AddrSpace); + EmitGlobalConstantImpl(Contents, AddrSpace, AP); // And pad with enough zeroes AP.OutStreamer.EmitZeros(Size-FilledSize, AddrSpace); @@ -1435,57 +1442,68 @@ } } -/// EmitGlobalConstant - Print a general LLVM constant to the .s file. -void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { +static void EmitGlobalConstantImpl(const Constant *CV, unsigned AddrSpace, + AsmPrinter &AP) { if (isa(CV) || isa(CV)) { - uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); - if (Size == 0) Size = 1; // An empty "_foo:" followed by a section is undef. - return OutStreamer.EmitZeros(Size, AddrSpace); + uint64_t Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType()); + return AP.OutStreamer.EmitZeros(Size, AddrSpace); } if (const ConstantInt *CI = dyn_cast(CV)) { - unsigned Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); + unsigned Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType()); switch (Size) { case 1: case 2: case 4: case 8: - if (isVerbose()) - OutStreamer.GetCommentOS() << format("0x%llx\n", CI->getZExtValue()); - OutStreamer.EmitIntValue(CI->getZExtValue(), Size, AddrSpace); + if (AP.isVerbose()) + AP.OutStreamer.GetCommentOS() << format("0x%llx\n", CI->getZExtValue()); + AP.OutStreamer.EmitIntValue(CI->getZExtValue(), Size, AddrSpace); return; default: - EmitGlobalConstantLargeInt(CI, AddrSpace, *this); + EmitGlobalConstantLargeInt(CI, AddrSpace, AP); return; } } if (const ConstantArray *CVA = dyn_cast(CV)) - return EmitGlobalConstantArray(CVA, AddrSpace, *this); + return EmitGlobalConstantArray(CVA, AddrSpace, AP); if (const ConstantStruct *CVS = dyn_cast(CV)) - return EmitGlobalConstantStruct(CVS, AddrSpace, *this); + return EmitGlobalConstantStruct(CVS, AddrSpace, AP); if (const ConstantFP *CFP = dyn_cast(CV)) - return EmitGlobalConstantFP(CFP, AddrSpace, *this); + return EmitGlobalConstantFP(CFP, AddrSpace, AP); if (isa(CV)) { - unsigned Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); - OutStreamer.EmitIntValue(0, Size, AddrSpace); + unsigned Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType()); + AP.OutStreamer.EmitIntValue(0, Size, AddrSpace); return; } if (const ConstantUnion *CVU = dyn_cast(CV)) - return EmitGlobalConstantUnion(CVU, AddrSpace, *this); + return EmitGlobalConstantUnion(CVU, AddrSpace, AP); if (const ConstantVector *V = dyn_cast(CV)) - return EmitGlobalConstantVector(V, AddrSpace, *this); + return EmitGlobalConstantVector(V, AddrSpace, AP); // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it // thread the streamer with EmitValue. - OutStreamer.EmitValue(LowerConstant(CV, *this), - TM.getTargetData()->getTypeAllocSize(CV->getType()), - AddrSpace); + AP.OutStreamer.EmitValue(LowerConstant(CV, AP), + AP.TM.getTargetData()->getTypeAllocSize(CV->getType()), + AddrSpace); +} + +/// EmitGlobalConstant - Print a general LLVM constant to the .s file. +void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { + uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); + if (Size) + EmitGlobalConstantImpl(CV, AddrSpace, *this); + else if (MAI->hasSubsectionsViaSymbols()) { + // If the global has zero size, emit a single byte so that two labels don't + // look like they are at the same location. + OutStreamer.EmitIntValue(0, 1, AddrSpace); + } } void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { Modified: llvm/trunk/test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll?rev=101879&r1=101878&r2=101879&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll (original) +++ llvm/trunk/test/CodeGen/PowerPC/2010-02-04-EmptyGlobal.ll Tue Apr 20 01:20:21 2010 @@ -8,4 +8,13 @@ ; CHECK: .globl __cmd ; CHECK-NEXT: .align 3 ; CHECK-NEXT: __cmd: -; CHECK-NEXT: .space 1 +; CHECK-NEXT: .byte 0 + +; PR6340 + +%Ty = type { i32, {}, i32 } + at k = global %Ty { i32 1, {} zeroinitializer, i32 3 } + +; CHECK: _k: +; CHECK-NEXT: .long 1 +; CHECK-NEXT: .long 3 From sabre at nondot.org Tue Apr 20 01:28:43 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 06:28:43 -0000 Subject: [llvm-commits] [llvm] r101880 - in /llvm/trunk/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h Message-ID: <20100420062843.736D02A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 01:28:43 2010 New Revision: 101880 URL: http://llvm.org/viewvc/llvm-project?rev=101880&view=rev Log: DAGInstruction::ImpOperands is dead after my recent tblgen work, zap it. Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=101880&r1=101879&r2=101880&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Tue Apr 20 01:28:43 2010 @@ -2297,10 +2297,8 @@ // Create and insert the instruction. std::vector ImpResults; - std::vector ImpOperands; Instructions.insert(std::make_pair(Instrs[i], - DAGInstruction(0, Results, Operands, ImpResults, - ImpOperands))); + DAGInstruction(0, Results, Operands, ImpResults))); continue; // no pattern. } @@ -2447,7 +2445,7 @@ // Create and insert the instruction. // FIXME: InstImpResults and InstImpInputs should not be part of // DAGInstruction. - DAGInstruction TheInst(I, Results, Operands, InstImpResults, InstImpInputs); + DAGInstruction TheInst(I, Results, Operands, InstImpResults); Instructions.insert(std::make_pair(I->getRecord(), TheInst)); // Use a temporary tree pattern to infer all types and make sure that the Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=101880&r1=101879&r2=101880&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Tue Apr 20 01:28:43 2010 @@ -529,23 +529,19 @@ std::vector Results; std::vector Operands; std::vector ImpResults; - std::vector ImpOperands; TreePatternNode *ResultPattern; public: DAGInstruction(TreePattern *TP, const std::vector &results, const std::vector &operands, - const std::vector &impresults, - const std::vector &impoperands) + const std::vector &impresults) : Pattern(TP), Results(results), Operands(operands), - ImpResults(impresults), ImpOperands(impoperands), - ResultPattern(0) {} + ImpResults(impresults), ResultPattern(0) {} const TreePattern *getPattern() const { return Pattern; } unsigned getNumResults() const { return Results.size(); } unsigned getNumOperands() const { return Operands.size(); } unsigned getNumImpResults() const { return ImpResults.size(); } - unsigned getNumImpOperands() const { return ImpOperands.size(); } const std::vector& getImpResults() const { return ImpResults; } void setResultPattern(TreePatternNode *R) { ResultPattern = R; } @@ -565,11 +561,6 @@ return ImpResults[RN]; } - Record *getImpOperand(unsigned ON) const { - assert(ON < ImpOperands.size()); - return ImpOperands[ON]; - } - TreePatternNode *getResultPattern() const { return ResultPattern; } }; From sabre at nondot.org Tue Apr 20 01:30:25 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 06:30:25 -0000 Subject: [llvm-commits] [llvm] r101881 - in /llvm/trunk/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h Message-ID: <20100420063025.4D62D2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 01:30:25 2010 New Revision: 101881 URL: http://llvm.org/viewvc/llvm-project?rev=101881&view=rev Log: stop computing InstImpInputs, it is dead Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=101881&r1=101880&r2=101881&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Tue Apr 20 01:30:25 2010 @@ -1992,16 +1992,13 @@ /// HandleUse - Given "Pat" a leaf in the pattern, check to see if it is an /// instruction input. Return true if this is a real use. static bool HandleUse(TreePattern *I, TreePatternNode *Pat, - std::map &InstInputs, - std::vector &InstImpInputs) { + std::map &InstInputs) { // No name -> not interesting. if (Pat->getName().empty()) { if (Pat->isLeaf()) { DefInit *DI = dynamic_cast(Pat->getLeafValue()); if (DI && DI->getDef()->isSubClassOf("RegisterClass")) I->error("Input " + DI->getDef()->getName() + " must be named!"); - else if (DI && DI->getDef()->isSubClassOf("Register")) - InstImpInputs.push_back(DI->getDef()); } return false; } @@ -2047,10 +2044,9 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat, std::map &InstInputs, std::map&InstResults, - std::vector &InstImpInputs, std::vector &InstImpResults) { if (Pat->isLeaf()) { - bool isUse = HandleUse(I, Pat, InstInputs, InstImpInputs); + bool isUse = HandleUse(I, Pat, InstInputs); if (!isUse && Pat->getTransformFn()) I->error("Cannot specify a transform function for a non-input value!"); return; @@ -2077,12 +2073,12 @@ if (Pat->getChild(i)->getNumTypes() == 0) I->error("Cannot have void nodes inside of patterns!"); FindPatternInputsAndOutputs(I, Pat->getChild(i), InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); } // If this is a non-leaf node with no children, treat it basically as if // it were a leaf. This handles nodes like (imm). - bool isUse = HandleUse(I, Pat, InstInputs, InstImpInputs); + bool isUse = HandleUse(I, Pat, InstInputs); if (!isUse && Pat->getTransformFn()) I->error("Cannot specify a transform function for a non-input value!"); @@ -2123,8 +2119,7 @@ // Verify and collect info from the computation. FindPatternInputsAndOutputs(I, Pat->getChild(NumDests), - InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstInputs, InstResults, InstImpResults); } //===----------------------------------------------------------------------===// @@ -2320,7 +2315,6 @@ // in the instruction, including what reg class they are. std::map InstResults; - std::vector InstImpInputs; std::vector InstImpResults; // Verify that the top-level forms in the instruction are of void type, and @@ -2333,7 +2327,7 @@ // Find inputs and outputs, and verify the structure of the uses/defs. FindPatternInputsAndOutputs(I, Pat, InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); } // Now that we have inputs and outputs of the pattern, inspect the operands @@ -2443,8 +2437,7 @@ ResultPattern->setType(i, Res0Node->getExtType(i)); // Create and insert the instruction. - // FIXME: InstImpResults and InstImpInputs should not be part of - // DAGInstruction. + // FIXME: InstImpResults should not be part of DAGInstruction. DAGInstruction TheInst(I, Results, Operands, InstImpResults); Instructions.insert(std::make_pair(I->getRecord(), TheInst)); @@ -2680,12 +2673,11 @@ // Validate that the input pattern is correct. std::map InstInputs; std::map InstResults; - std::vector InstImpInputs; std::vector InstImpResults; for (unsigned j = 0, ee = Pattern->getNumTrees(); j != ee; ++j) FindPatternInputsAndOutputs(Pattern, Pattern->getTree(j), InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); // Promote the xform function to be an explicit node if set. TreePatternNode *DstPattern = Result->getOnlyTree(); Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=101881&r1=101880&r2=101881&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Tue Apr 20 01:30:25 2010 @@ -741,7 +741,6 @@ TreePatternNode*> &InstInputs, std::map &InstResults, - std::vector &InstImpInputs, std::vector &InstImpResults); }; } // end namespace llvm From baldrick at free.fr Tue Apr 20 02:22:59 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:22:59 -0000 Subject: [llvm-commits] [dragonegg] r101883 - /dragonegg/branches/ Message-ID: <20100420072259.95BAF2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 02:22:59 2010 New Revision: 101883 URL: http://llvm.org/viewvc/llvm-project?rev=101883&view=rev Log: Dragonegg branches. Added: dragonegg/branches/ From baldrick at free.fr Tue Apr 20 02:24:08 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:24:08 -0000 Subject: [llvm-commits] [dragonegg] r101884 - /dragonegg/branches/release_27/ Message-ID: <20100420072408.3FDAF2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 02:24:08 2010 New Revision: 101884 URL: http://llvm.org/viewvc/llvm-project?rev=101884&view=rev Log: Prepare a copy for release alongside llvm-2.7. Added: dragonegg/branches/release_27/ - copied from r101883, dragonegg/trunk/ From baldrick at free.fr Tue Apr 20 02:34:44 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:34:44 -0000 Subject: [llvm-commits] [dragonegg] r101885 - /dragonegg/branches/release_27/llvm-backend.cpp Message-ID: <20100420073444.2BE012A6C12D@llvm.org> Author: baldrick Date: Tue Apr 20 02:34:44 2010 New Revision: 101885 URL: http://llvm.org/viewvc/llvm-project?rev=101885&view=rev Log: Undo commit 100855, which is incompatible with llvm-2.7: Fix build, due to llvm::llvm_report_error -> llvm::report_fatal_error LLVM API change (commit 100709). Modified: dragonegg/branches/release_27/llvm-backend.cpp Modified: dragonegg/branches/release_27/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-backend.cpp?rev=101885&r1=101884&r2=101885&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-backend.cpp (original) +++ dragonegg/branches/release_27/llvm-backend.cpp Tue Apr 20 02:34:44 2010 @@ -495,7 +495,7 @@ const Target *TME = TargetRegistry::lookupTarget(TargetTriple, Err); if (!TME) - report_fatal_error(Err); + llvm_report_error(Err); // Figure out the subtarget feature string we pass to the target. std::string FeatureStr; @@ -556,7 +556,7 @@ Binary ? raw_fd_ostream::F_Binary : 0); if (!Error.empty()) - report_fatal_error(Error); + llvm_report_error(Error); FormattedOutStream.setStream(*OutStream, formatted_raw_ostream::PRESERVE_STREAM); From baldrick at free.fr Tue Apr 20 02:37:22 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:37:22 -0000 Subject: [llvm-commits] [dragonegg] r101886 - /dragonegg/branches/release_27/llvm-convert.cpp Message-ID: <20100420073722.D69232A6C12D@llvm.org> Author: baldrick Date: Tue Apr 20 02:37:22 2010 New Revision: 101886 URL: http://llvm.org/viewvc/llvm-project?rev=101886&view=rev Log: Undo commit 100426, which is incompatible with llvm-2.7: Port commit 100303 (wangmp) from llvm-gcc, hopefully fixing the self-host build: Reapply patch for adding support for address spaces and added a isVolatile field to memcpy, memmove, and memset. Modified: dragonegg/branches/release_27/llvm-convert.cpp Modified: dragonegg/branches/release_27/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-convert.cpp?rev=101886&r1=101885&r2=101886&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-convert.cpp (original) +++ dragonegg/branches/release_27/llvm-convert.cpp Tue Apr 20 02:37:22 2010 @@ -1621,17 +1621,15 @@ unsigned Align) { const Type *SBP = Type::getInt8PtrTy(Context); const Type *IntPtr = TD.getIntPtrType(Context); - Value *Ops[5] = { + Value *Ops[4] = { Builder.CreateBitCast(DestPtr, SBP), Builder.CreateBitCast(SrcPtr, SBP), Builder.CreateIntCast(Size, IntPtr, /*isSigned*/true), - ConstantInt::get(Type::getInt32Ty(Context), Align), - ConstantInt::get(Type::getInt1Ty(Context), false) + ConstantInt::get(Type::getInt32Ty(Context), Align) }; - const Type *ArgTypes[3] = { SBP, SBP, IntPtr }; Builder.CreateCall(Intrinsic::getDeclaration(TheModule, Intrinsic::memcpy, - ArgTypes, 3), Ops, Ops+5); + &IntPtr, 1), Ops, Ops+4); return Ops[0]; } @@ -1639,17 +1637,15 @@ unsigned Align) { const Type *SBP = Type::getInt8PtrTy(Context); const Type *IntPtr = TD.getIntPtrType(Context); - Value *Ops[5] = { + Value *Ops[4] = { Builder.CreateBitCast(DestPtr, SBP), Builder.CreateBitCast(SrcPtr, SBP), Builder.CreateIntCast(Size, IntPtr, /*isSigned*/true), - ConstantInt::get(Type::getInt32Ty(Context), Align), - ConstantInt::get(Type::getInt1Ty(Context), false) + ConstantInt::get(Type::getInt32Ty(Context), Align) }; - const Type *ArgTypes[3] = { SBP, SBP, IntPtr }; Builder.CreateCall(Intrinsic::getDeclaration(TheModule, Intrinsic::memmove, - ArgTypes, 3), Ops, Ops+5); + &IntPtr, 1), Ops, Ops+4); return Ops[0]; } @@ -1657,17 +1653,15 @@ unsigned Align) { const Type *SBP = Type::getInt8PtrTy(Context); const Type *IntPtr = TD.getIntPtrType(Context); - Value *Ops[5] = { + Value *Ops[4] = { Builder.CreateBitCast(DestPtr, SBP), Builder.CreateIntCast(SrcVal, Type::getInt8Ty(Context), /*isSigned*/true), Builder.CreateIntCast(Size, IntPtr, /*isSigned*/true), - ConstantInt::get(Type::getInt32Ty(Context), Align), - ConstantInt::get(Type::getInt1Ty(Context), false) + ConstantInt::get(Type::getInt32Ty(Context), Align) }; - const Type *ArgTypes[2] = { SBP, IntPtr }; Builder.CreateCall(Intrinsic::getDeclaration(TheModule, Intrinsic::memset, - ArgTypes, 2), Ops, Ops+5); + &IntPtr, 1), Ops, Ops+4); return Ops[0]; } From baldrick at free.fr Tue Apr 20 02:43:00 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:43:00 -0000 Subject: [llvm-commits] [dragonegg] r101887 - /dragonegg/branches/release_27/llvm-debug.cpp Message-ID: <20100420074300.750782A6C12D@llvm.org> Author: baldrick Date: Tue Apr 20 02:43:00 2010 New Revision: 101887 URL: http://llvm.org/viewvc/llvm-project?rev=101887&view=rev Log: Undo commits 100103 and 100286, which are incompatible with llvm-2.7: Port commit 100220 (lattner) from llvm-gcc, fixing the build: NewDebugLoc -> DebugLoc. Port commit 100094 (lattner) from llvm-gcc: adjust to IRBuilder change and use faster DebugLoc apis. Modified: dragonegg/branches/release_27/llvm-debug.cpp Modified: dragonegg/branches/release_27/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-debug.cpp?rev=101887&r1=101886&r2=101887&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-debug.cpp (original) +++ dragonegg/branches/release_27/llvm-debug.cpp Tue Apr 20 02:43:00 2010 @@ -416,7 +416,12 @@ // Insert an llvm.dbg.declare into the current block. Instruction *Call = DebugFactory.InsertDeclare(AI, D, Builder.GetInsertBlock()); - Call->setDebugLoc(DebugLoc::get(CurLineNo, 0, VarScope.getNode())); + + llvm::DILocation DO(NULL); + llvm::DILocation DL = + DebugFactory.CreateLocation(CurLineNo, 0 /* column */, VarScope, DO); + + Call->setMetadata("dbg", DL.getNode()); } /// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of @@ -437,8 +442,12 @@ if (RegionStack.empty()) return; - MDNode *Scope = cast(RegionStack.back()); - Builder.SetCurrentDebugLocation(DebugLoc::get(CurLineNo,0/*col*/,Scope)); + llvm::DIDescriptor DR(cast(RegionStack.back())); + llvm::DIScope DS = llvm::DIScope(DR.getNode()); + llvm::DILocation DO(NULL); + llvm::DILocation DL = + DebugFactory.CreateLocation(CurLineNo, 0 /* column */, DS, DO); + Builder.SetCurrentDebugLocation(DL.getNode()); } /// EmitGlobalVariable - Emit information about a global variable. From baldrick at free.fr Tue Apr 20 02:45:59 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:45:59 -0000 Subject: [llvm-commits] [dragonegg] r101888 - in /dragonegg/branches/release_27: llvm-debug.cpp llvm-debug.h Message-ID: <20100420074559.B438F2A6C12D@llvm.org> Author: baldrick Date: Tue Apr 20 02:45:59 2010 New Revision: 101888 URL: http://llvm.org/viewvc/llvm-project?rev=101888&view=rev Log: Undo commit 98147, which is incompatible with llvm-2.7: Port commit 98022 (dpatel) from llvm-gcc: Start using DIFile. Corresponding llvm patch is r98020. Modified: dragonegg/branches/release_27/llvm-debug.cpp dragonegg/branches/release_27/llvm-debug.h Modified: dragonegg/branches/release_27/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-debug.cpp?rev=101888&r1=101887&r2=101888&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-debug.cpp (original) +++ dragonegg/branches/release_27/llvm-debug.cpp Tue Apr 20 02:45:59 2010 @@ -275,7 +275,7 @@ ArtificialFnWithAbstractOrigin = true; DIDescriptor SPContext = ArtificialFnWithAbstractOrigin ? - getOrCreateFile(main_input_filename) : + getOrCreateCompileUnit(main_input_filename) : findRegion (DECL_CONTEXT(FnDecl)); // Creating context may have triggered creation of this SP descriptor. So @@ -316,7 +316,7 @@ DebugFactory.CreateSubprogram(SPContext, FnName, FnName, LinkageName, - getOrCreateFile(Loc.file), lineno, + getOrCreateCompileUnit(Loc.file), lineno, FNType, Fn->hasInternalLinkage(), true /*definition*/, @@ -340,7 +340,7 @@ expanded_location Loc = GetNodeLocation(Node, false); DINameSpace DNS = DebugFactory.CreateNameSpace(Context, GetNodeName(Node), - getOrCreateFile(Loc.file), Loc.line); + getOrCreateCompileUnit(Loc.file), Loc.line); NameSpaceCache[Node] = WeakVH(DNS.getNode()); return DNS; @@ -349,7 +349,7 @@ /// findRegion - Find tree_node N's region. DIDescriptor DebugInfo::findRegion(tree Node) { if (Node == NULL_TREE) - return getOrCreateFile(main_input_filename); + return getOrCreateCompileUnit(main_input_filename); std::map::iterator I = RegionMap.find(Node); if (I != RegionMap.end()) @@ -369,7 +369,7 @@ } // Otherwise main compile unit covers everything. - return getOrCreateFile(main_input_filename); + return getOrCreateCompileUnit(main_input_filename); } /// EmitFunctionEnd - Constructs the debug code for exiting a declarative @@ -410,7 +410,7 @@ Ty = DebugFactory.CreateArtificialType(Ty); llvm::DIVariable D = DebugFactory.CreateVariable(Tag, VarScope, - Name, getOrCreateFile(Loc.file), + Name, getOrCreateCompileUnit(Loc.file), Loc.line, Ty); // Insert an llvm.dbg.declare into the current block. @@ -470,7 +470,7 @@ LinkageName = GV->getName(); DebugFactory.CreateGlobalVariable(findRegion(DECL_CONTEXT(decl)), DispName, DispName, LinkageName, - getOrCreateFile(Loc.file), Loc.line, + getOrCreateCompileUnit(Loc.file), Loc.line, TyD, GV->hasInternalLinkage(), true/*definition*/, GV); } @@ -517,9 +517,9 @@ } return - DebugFactory.CreateBasicType(getOrCreateFile(main_input_filename), + DebugFactory.CreateBasicType(getOrCreateCompileUnit(main_input_filename), TypeName, - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(main_input_filename), 0, Size, Align, 0, 0, Encoding); } @@ -548,9 +548,9 @@ sprintf(FwdTypeName, "fwd.type.%d", FwdTypeCount++); llvm::DIType FwdType = DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type, - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), FwdTypeName, - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), 0, 0, 0, 0, 0, llvm::DIType(), llvm::DIArray()); llvm::TrackingVH FwdTypeNode = FwdType.getNode(); @@ -591,7 +591,7 @@ DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type, findRegion(TYPE_CONTEXT(type)), StringRef(), - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), 0, 0, 0, 0, 0, llvm::DIType(), EltTypeArray); @@ -620,7 +620,7 @@ DIType Ty = DebugFactory.CreateDerivedType(Tag, findRegion(DECL_CONTEXT(TyName)), GetNodeName(TyName), - getOrCreateFile(TypeNameLoc.file), + getOrCreateCompileUnit(TypeNameLoc.file), TypeNameLoc.line, 0 /*size*/, 0 /*align*/, @@ -636,7 +636,7 @@ DebugFactory.CreateDerivedType(Tag, findRegion(TYPE_CONTEXT(type)), Tag == DW_TAG_pointer_type ? StringRef() : PName, - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), 0 /*line no*/, NodeSizeInBits(type), NodeAlignInBits(type), @@ -698,7 +698,7 @@ return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_array_type, findRegion(TYPE_CONTEXT(type)), StringRef(), - getOrCreateFile(Loc.file), 0, + getOrCreateCompileUnit(Loc.file), 0, NodeSizeInBits(type), NodeAlignInBits(type), 0, 0, getOrCreateType(EltTy), @@ -732,7 +732,7 @@ return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type, findRegion(TYPE_CONTEXT(type)), GetNodeName(type), - getOrCreateFile(Loc.file), + getOrCreateCompileUnit(Loc.file), Loc.line, NodeSizeInBits(type), NodeAlignInBits(type), 0, 0, @@ -750,7 +750,8 @@ //TODO if (TYPE_LANG_SPECIFIC (type) //TODO && lang_hooks.types.is_runtime_specific_type (type)) //TODO { -//TODO unsigned CULang = TheCU.getLanguage(); +//TODO DICompileUnit CU = getOrCreateCompileUnit(main_input_filename); +//TODO unsigned CULang = CU.getLanguage(); //TODO switch (CULang) { //TODO case DW_LANG_ObjC_plus_plus : //TODO RunTimeLang = DW_LANG_ObjC_plus_plus; @@ -801,7 +802,7 @@ DebugFactory.CreateCompositeType(Tag, TyContext, FwdName.c_str(), - getOrCreateFile(Loc.file), + getOrCreateCompileUnit(Loc.file), Loc.line, 0, 0, 0, SFlags | llvm::DIType::FlagFwdDecl, llvm::DIType(), llvm::DIArray(), @@ -851,7 +852,7 @@ DIType DTy = DebugFactory.CreateDerivedType(DW_TAG_inheritance, findRegion(TYPE_CONTEXT(type)), StringRef(), - llvm::DIFile(), 0,0,0, + llvm::DICompileUnit(), 0,0,0, Offset, BFlags, BaseClass); EltTys.push_back(DTy); @@ -897,7 +898,7 @@ DebugFactory.CreateDerivedType(DW_TAG_member, findRegion(DECL_CONTEXT(Member)), MemberName, - getOrCreateFile(MemLoc.file), + getOrCreateCompileUnit(MemLoc.file), MemLoc.line, NodeSizeInBits(Member), NodeAlignInBits(FieldNodeType), int_bit_position(Member), @@ -936,7 +937,7 @@ DebugFactory.CreateSubprogram(findRegion(DECL_CONTEXT(Member)), MemberName, MemberName, LinkageName, - getOrCreateFile(MemLoc.file), + getOrCreateCompileUnit(MemLoc.file), MemLoc.line, SPTy, false, false, Virtuality, VIndex, ContainingType, DECL_ARTIFICIAL (Member)); @@ -961,7 +962,7 @@ llvm::DICompositeType RealDecl = DebugFactory.CreateCompositeType(Tag, findRegion(TYPE_CONTEXT(type)), GetNodeName(type), - getOrCreateFile(Loc.file), + getOrCreateCompileUnit(Loc.file), Loc.line, NodeSizeInBits(type), NodeAlignInBits(type), 0, SFlags, llvm::DIType(), Elements, @@ -989,7 +990,7 @@ Ty = DebugFactory.CreateDerivedType(DW_TAG_typedef, findRegion(DECL_CONTEXT(TyDef)), GetNodeName(TyDef), - getOrCreateFile(TypeDefLoc.file), + getOrCreateCompileUnit(TypeDefLoc.file), TypeDefLoc.line, 0 /*size*/, 0 /*align*/, @@ -1005,7 +1006,7 @@ Ty = DebugFactory.CreateDerivedType(DW_TAG_volatile_type, findRegion(TYPE_CONTEXT(type)), StringRef(), - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), 0 /*line no*/, NodeSizeInBits(type), NodeAlignInBits(type), @@ -1019,7 +1020,7 @@ Ty = DebugFactory.CreateDerivedType(DW_TAG_const_type, findRegion(TYPE_CONTEXT(type)), StringRef(), - getOrCreateFile(main_input_filename), + getOrCreateCompileUnit(NULL), 0 /*line no*/, NodeSizeInBits(type), NodeAlignInBits(type), @@ -1130,9 +1131,9 @@ // module does not contain any main compile unit then the code generator // will emit multiple compile units in the output object file. if (!strcmp (main_input_filename, "")) - TheCU = getOrCreateCompileUnit("", true); + getOrCreateCompileUnit("", true); else - TheCU = getOrCreateCompileUnit(main_input_filename, true); + getOrCreateCompileUnit(main_input_filename, true); } /// getOrCreateCompileUnit - Get the compile unit from the cache or @@ -1145,6 +1146,10 @@ else FullPath = main_input_filename; } + std::map::iterator I = CUCache.find(FullPath); + if (I != CUCache.end()) + if (Value *M = I->second) + return DICompileUnit(cast(M)); // Get source file information. std::string Directory; @@ -1180,25 +1185,11 @@ unsigned ObjcRunTimeVer = 0; // if (flag_objc_abi != 0 && flag_objc_abi != -1) // ObjcRunTimeVer = flag_objc_abi; - return DebugFactory.CreateCompileUnit(LangTag, FileName.c_str(), - Directory.c_str(), - version_string, isMain, - optimize, Flags, - ObjcRunTimeVer); -} - -/// getOrCreateFile - Get DIFile descriptor. -DIFile DebugInfo::getOrCreateFile(const char *FullPath) { - if (!FullPath) { - if (!strcmp (main_input_filename, "")) - FullPath = ""; - else - FullPath = main_input_filename; - } - - // Get source file information. - std::string Directory; - std::string FileName; - DirectoryAndFile(FullPath, Directory, FileName); - return DebugFactory.CreateFile(FileName, Directory, TheCU); + DICompileUnit NewCU = DebugFactory.CreateCompileUnit(LangTag, FileName.c_str(), + Directory.c_str(), + version_string, isMain, + optimize, Flags, + ObjcRunTimeVer); + CUCache[FullPath] = WeakVH(NewCU.getNode()); + return NewCU; } Modified: dragonegg/branches/release_27/llvm-debug.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-debug.h?rev=101888&r1=101887&r2=101888&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-debug.h (original) +++ dragonegg/branches/release_27/llvm-debug.h Tue Apr 20 02:45:59 2010 @@ -57,14 +57,13 @@ const char *PrevFullPath; // Previous location file encountered. int PrevLineNo; // Previous location line# encountered. BasicBlock *PrevBB; // Last basic block encountered. - - DICompileUnit TheCU; // The compile unit. - + // This counter counts debug info for forward referenced subroutine types. // This counter is used to create unique name for such types so that their // debug info (through MDNodes) is not shared accidently. unsigned FwdTypeCount; + std::map CUCache; std::map TypeCache; // Cache of previously constructed // Types. @@ -146,9 +145,6 @@ DICompileUnit getOrCreateCompileUnit(const char *FullPath, bool isMain = false); - /// getOrCreateFile - Get DIFile descriptor. - DIFile getOrCreateFile(const char *FullPath); - /// findRegion - Find tree_node N's region. DIDescriptor findRegion(tree_node *n); From baldrick at free.fr Tue Apr 20 02:47:32 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 07:47:32 -0000 Subject: [llvm-commits] [dragonegg] r101889 - /dragonegg/branches/release_27/llvm-debug.cpp Message-ID: <20100420074732.549972A6C12D@llvm.org> Author: baldrick Date: Tue Apr 20 02:47:32 2010 New Revision: 101889 URL: http://llvm.org/viewvc/llvm-project?rev=101889&view=rev Log: Undo commit 98146, which is incompatible with llvm-2.7: Port commits 97948, 97962 and 97977 (dpatel) from llvm-gcc: - Avoid DIDescriptor.isNull() checks. - Revert r97948. - Avoid using DIDescriptor.isNull(). One character "!" makes all the difference! Modified: dragonegg/branches/release_27/llvm-debug.cpp Modified: dragonegg/branches/release_27/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_27/llvm-debug.cpp?rev=101889&r1=101888&r2=101889&view=diff ============================================================================== --- dragonegg/branches/release_27/llvm-debug.cpp (original) +++ dragonegg/branches/release_27/llvm-debug.cpp Tue Apr 20 02:47:32 2010 @@ -1059,7 +1059,7 @@ MainTy = getOrCreateType(TYPE_MAIN_VARIANT(type)); DIType Ty = createVariantType(type, MainTy); - if (Ty.isValid()) + if (!Ty.isNull()) return Ty; // Work out details of type. From baldrick at free.fr Tue Apr 20 03:04:00 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 08:04:00 -0000 Subject: [llvm-commits] [dragonegg] r101890 - /dragonegg/trunk/x86/llvm-target.cpp Message-ID: <20100420080400.7D5DE2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 03:04:00 2010 New Revision: 101890 URL: http://llvm.org/viewvc/llvm-project?rev=101890&view=rev Log: Port commit 101333 (echristo) from llvm-gcc: Rewrite palignr and palignr128 handling to use vector shuffle if possible instead of intrinsic. Modified: dragonegg/trunk/x86/llvm-target.cpp Modified: dragonegg/trunk/x86/llvm-target.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.cpp?rev=101890&r1=101889&r2=101890&view=diff ============================================================================== --- dragonegg/trunk/x86/llvm-target.cpp (original) +++ dragonegg/trunk/x86/llvm-target.cpp Tue Apr 20 03:04:00 2010 @@ -751,7 +751,6 @@ } bool flip = false; - Intrinsic::ID IntrID; unsigned PredCode; goto *Handler; @@ -1248,25 +1247,107 @@ Result = Builder.CreateLoad(Ptr); return true; } - IX86_BUILTIN_PALIGNR: - IntrID = Intrinsic::x86_ssse3_palign_r; - goto PALIGNR; - IX86_BUILTIN_PALIGNR128: - IntrID = Intrinsic::x86_ssse3_palign_r_128; - goto PALIGNR; - PALIGNR: + IX86_BUILTIN_PALIGNR: { if (isa(Ops[2])) { - Function *palignr = - Intrinsic::getDeclaration(TheModule, IntrID); - Value *Op2 = Builder.CreateTrunc(Ops[2], Type::getInt8Ty(Context)); - Value *CallOps[3] = { Ops[0], Ops[1], Op2 }; - Result = Builder.CreateCall(palignr, CallOps, CallOps+3); + + // In the header we multiply by 8, correct that back now. + unsigned shiftVal = (cast(Ops[2])->getZExtValue())/8; + + // If palignr is shifting the pair of input vectors less than 9 bytes, + // emit a shuffle instruction. + if (shiftVal <= 8) { + const llvm::Type *IntTy = Type::getInt32Ty(Context); + const llvm::Type *EltTy = Type::getInt8Ty(Context); + const llvm::Type *VecTy = VectorType::get(EltTy, 8); + + Ops[1] = Builder.CreateBitCast(Ops[1], VecTy); + Ops[0] = Builder.CreateBitCast(Ops[0], VecTy); + + SmallVector Indices; + for (unsigned i = 0; i != 8; ++i) + Indices.push_back(ConstantInt::get(IntTy, shiftVal + i)); + + Value* SV = ConstantVector::get(Indices.begin(), Indices.size()); + Result = Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr"); + return true; + } + + // If palignr is shifting the pair of input vectors more than 8 but less + // than 16 bytes, emit a logical right shift of the destination. + if (shiftVal < 16) { + // MMX has these as 1 x i64 vectors for some odd optimization reasons. + const llvm::Type *EltTy = Type::getInt64Ty(Context); + const llvm::Type *VecTy = VectorType::get(EltTy, 1); + + Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast"); + Ops[1] = ConstantInt::get(VecTy, (shiftVal-8) * 8); + + // create i32 constant + Function *F = Intrinsic::getDeclaration(TheModule, + Intrinsic::x86_mmx_psrl_q); + Result = Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr"); + return true; + } + + // If palignr is shifting the pair of vectors more than 32 bytes, + // emit zero. + Result = Constant::getNullValue(ResultType); + return true; + } else { + error_at(gimple_location(stmt), "mask must be an immediate"); + Result = Ops[0]; + return true; + } + } + IX86_BUILTIN_PALIGNR128: { + if (isa(Ops[2])) { + unsigned shiftVal = cast(Ops[2])->getZExtValue(); + + // If palignr is shifting the pair of input vectors less than 17 bytes, + // emit a shuffle instruction. + if (shiftVal <= 16) { + const llvm::Type *IntTy = Type::getInt32Ty(Context); + const llvm::Type *EltTy = Type::getInt8Ty(Context); + const llvm::Type *VecTy = VectorType::get(EltTy, 16); + + Ops[1] = Builder.CreateBitCast(Ops[1], VecTy); + Ops[0] = Builder.CreateBitCast(Ops[0], VecTy); + + llvm::SmallVector Indices; + for (unsigned i = 0; i != 16; ++i) + Indices.push_back(ConstantInt::get(IntTy, shiftVal + i)); + + Value* SV = ConstantVector::get(Indices.begin(), Indices.size()); + Result = Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr"); + return true; + } + + // If palignr is shifting the pair of input vectors more than 16 but less + // than 32 bytes, emit a logical right shift of the destination. + if (shiftVal < 32) { + const llvm::Type *EltTy = Type::getInt64Ty(Context); + const llvm::Type *VecTy = VectorType::get(EltTy, 2); + const llvm::Type *IntTy = Type::getInt32Ty(Context); + + Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast"); + Ops[1] = ConstantInt::get(IntTy, (shiftVal-16) * 8); + + // create i32 constant + llvm::Function *F = Intrinsic::getDeclaration(TheModule, + Intrinsic::x86_sse2_psrl_dq); + Result = Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr"); + return true; + } + + // If palignr is shifting the pair of vectors more than 32 bytes, emit zero. + Result = Constant::getNullValue(ResultType); return true; } else { error_at(gimple_location(stmt), "mask must be an immediate"); Result = Ops[0]; return true; } + } } /* These are defined in i386.c */ From baldrick at free.fr Tue Apr 20 03:08:20 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 08:08:20 -0000 Subject: [llvm-commits] [dragonegg] r101891 - in /dragonegg/trunk: llvm-backend.cpp llvm-convert.cpp Message-ID: <20100420080820.980DF2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 03:08:20 2010 New Revision: 101891 URL: http://llvm.org/viewvc/llvm-project?rev=101891&view=rev Log: Inform the compiler that, yes, we really mean to drop the const-ness here. Modified: dragonegg/trunk/llvm-backend.cpp dragonegg/trunk/llvm-convert.cpp Modified: dragonegg/trunk/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-backend.cpp?rev=101891&r1=101890&r2=101891&view=diff ============================================================================== --- dragonegg/trunk/llvm-backend.cpp (original) +++ dragonegg/trunk/llvm-backend.cpp Tue Apr 20 03:08:20 2010 @@ -426,7 +426,7 @@ Args.push_back(0); // Null terminator. int pseudo_argc = Args.size()-1; - llvm::cl::ParseCommandLineOptions(pseudo_argc, (char**)&Args[0]); + llvm::cl::ParseCommandLineOptions(pseudo_argc, const_cast(&Args[0])); Configured = true; } Modified: dragonegg/trunk/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=101891&r1=101890&r2=101891&view=diff ============================================================================== --- dragonegg/trunk/llvm-convert.cpp (original) +++ dragonegg/trunk/llvm-convert.cpp Tue Apr 20 03:08:20 2010 @@ -3353,7 +3353,7 @@ static void FreeConstTupleStrings(const char **ReplacementStrings, unsigned int Size) { for (unsigned int i=0; i(ReplacementStrings[i])); } // When extracting a register name from a DECL_HARD_REGISTER variable, From baldrick at free.fr Tue Apr 20 03:39:03 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 08:39:03 -0000 Subject: [llvm-commits] [dragonegg] r101892 - /dragonegg/trunk/llvm-backend.cpp Message-ID: <20100420083903.51C2A2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 03:39:03 2010 New Revision: 101892 URL: http://llvm.org/viewvc/llvm-project?rev=101892&view=rev Log: Wire up gcc's -ffunction-sections and -fdata-sections options to the LLVM equivalents. Modified: dragonegg/trunk/llvm-backend.cpp Modified: dragonegg/trunk/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-backend.cpp?rev=101892&r1=101891&r2=101892&view=diff ============================================================================== --- dragonegg/trunk/llvm-backend.cpp (original) +++ dragonegg/trunk/llvm-backend.cpp Tue Apr 20 03:39:03 2010 @@ -390,6 +390,10 @@ Args.push_back("--unwind-tables"); if (!flag_schedule_insns) Args.push_back("--pre-RA-sched=source"); + if (flag_function_sections) + Args.push_back("--ffunction-sections"); + if (flag_data_sections) + Args.push_back("--fdata-sections"); // If there are options that should be passed through to the LLVM backend // directly from the command line, do so now. This is mainly for debugging From baldrick at free.fr Tue Apr 20 04:59:04 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 09:59:04 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r101893 - /llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Message-ID: <20100420095904.E89902A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 04:59:04 2010 New Revision: 101893 URL: http://llvm.org/viewvc/llvm-project?rev=101893&view=rev Log: Port commit 101892 (baldrick) from dragonegg: Wire up gcc's -ffunction-sections and -fdata-sections options to the LLVM equivalents. Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=101893&r1=101892&r2=101893&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Tue Apr 20 04:59:04 2010 @@ -409,6 +409,10 @@ Args.push_back("--unwind-tables"); if (!flag_schedule_insns) Args.push_back("--pre-RA-sched=source"); + if (flag_function_sections) + Args.push_back("--ffunction-sections"); + if (flag_data_sections) + Args.push_back("--fdata-sections"); // If there are options that should be passed through to the LLVM backend // directly from the command line, do so now. This is mainly for debugging From benny.kra at googlemail.com Tue Apr 20 06:50:37 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Tue, 20 Apr 2010 11:50:37 -0000 Subject: [llvm-commits] [llvm] r101894 - /llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp Message-ID: <20100420115037.AB6AC2A6C12C@llvm.org> Author: d0k Date: Tue Apr 20 06:50:37 2010 New Revision: 101894 URL: http://llvm.org/viewvc/llvm-project?rev=101894&view=rev Log: Fix -Wcast-qual warning. Modified: llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp Modified: llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp?rev=101894&r1=101893&r2=101894&view=diff ============================================================================== --- llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp (original) +++ llvm/trunk/examples/ExceptionDemo/ExceptionDemo.cpp Tue Apr 20 06:50:37 2010 @@ -813,8 +813,7 @@ } #endif - const uint8_t* lsda = (uint8_t*) - _Unwind_GetLanguageSpecificData(context); + const uint8_t* lsda = _Unwind_GetLanguageSpecificData(context); #ifdef DEBUG fprintf(stderr, From benny.kra at googlemail.com Tue Apr 20 07:16:50 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Tue, 20 Apr 2010 12:16:50 -0000 Subject: [llvm-commits] [llvm] r101897 - /llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Message-ID: <20100420121650.CE4132A6C12C@llvm.org> Author: d0k Date: Tue Apr 20 07:16:50 2010 New Revision: 101897 URL: http://llvm.org/viewvc/llvm-project?rev=101897&view=rev Log: PR6880: Don't dereference CallsExternalNode if it's NULL. Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraph.cpp?rev=101897&r1=101896&r2=101897&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/IPA/CallGraph.cpp (original) +++ llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Tue Apr 20 07:16:50 2010 @@ -158,9 +158,11 @@ // destroy - Release memory for the call graph virtual void destroy() { /// CallsExternalNode is not in the function map, delete it explicitly. - CallsExternalNode->allReferencesDropped(); - delete CallsExternalNode; - CallsExternalNode = 0; + if (CallsExternalNode) { + CallsExternalNode->allReferencesDropped(); + delete CallsExternalNode; + CallsExternalNode = 0; + } CallGraph::destroy(); } }; From baldrick at free.fr Tue Apr 20 07:35:37 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 12:35:37 -0000 Subject: [llvm-commits] [dragonegg] r101898 - /dragonegg/trunk/extras/buildbot_self_strap-32 Message-ID: <20100420123537.C9CC72A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 07:35:37 2010 New Revision: 101898 URL: http://llvm.org/viewvc/llvm-project?rev=101898&view=rev Log: See if the 32 bit buildbot is capable of building the gcc Ada frontend (a good test, since it is written in Ada). Modified: dragonegg/trunk/extras/buildbot_self_strap-32 Modified: dragonegg/trunk/extras/buildbot_self_strap-32 URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap-32?rev=101898&r1=101897&r2=101898&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap-32 (original) +++ dragonegg/trunk/extras/buildbot_self_strap-32 Tue Apr 20 07:35:37 2010 @@ -14,7 +14,7 @@ export CXX="g++ -m32" export LD_LIBRARY_PATH=$HOME/cfarm-32/lib:$LD_LIBRARY_PATH export CPPFLAGS="-I/$HOME/cfarm-32/include" -export GCC_OPTIONS="--enable-languages=c,c++,fortran,objc,obj-c++ --build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" +export GCC_OPTIONS="--enable-languages=ada,c,c++,fortran,objc,obj-c++ --build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" export LLVM_OPTIONS="--build=i686-pc-linux-gnu" cd $BUILD_DIR From ggreif at gmail.com Tue Apr 20 08:13:04 2010 From: ggreif at gmail.com (Gabor Greif) Date: Tue, 20 Apr 2010 13:13:04 -0000 Subject: [llvm-commits] [llvm] r101899 - in /llvm/trunk/lib: CodeGen/ShadowStackGC.cpp Transforms/IPO/GlobalOpt.cpp Transforms/InstCombine/InstCombineCalls.cpp Transforms/Scalar/MemCpyOptimizer.cpp Transforms/Scalar/ScalarReplAggregates.cpp Message-ID: <20100420131304.C12372A6C12C@llvm.org> Author: ggreif Date: Tue Apr 20 08:13:04 2010 New Revision: 101899 URL: http://llvm.org/viewvc/llvm-project?rev=101899&view=rev Log: use abstract accessors to CallInst Modified: llvm/trunk/lib/CodeGen/ShadowStackGC.cpp llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Modified: llvm/trunk/lib/CodeGen/ShadowStackGC.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ShadowStackGC.cpp?rev=101899&r1=101898&r2=101899&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/ShadowStackGC.cpp (original) +++ llvm/trunk/lib/CodeGen/ShadowStackGC.cpp Tue Apr 20 08:13:04 2010 @@ -160,7 +160,7 @@ Args.clear(); Args.append(CI->op_begin() + 1, CI->op_end()); - InvokeInst *II = InvokeInst::Create(CI->getOperand(0), + InvokeInst *II = InvokeInst::Create(CI->getCalledValue(), NewBB, CleanupBB, Args.begin(), Args.end(), CI->getName(), CallBB); Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=101899&r1=101898&r2=101899&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original) +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Tue Apr 20 08:13:04 2010 @@ -2295,10 +2295,10 @@ } // Cannot handle inline asm. - if (isa(CI->getOperand(0))) return false; + if (isa(CI->getCalledValue())) return false; // Resolve function pointers. - Function *Callee = dyn_cast(getVal(Values, CI->getOperand(0))); + Function *Callee = dyn_cast(getVal(Values, CI->getCalledValue())); if (!Callee) return false; // Cannot resolve. SmallVector Formals; Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=101899&r1=101898&r2=101899&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Tue Apr 20 08:13:04 2010 @@ -287,7 +287,7 @@ const Type *Tys[3] = { CI.getOperand(1)->getType(), CI.getOperand(2)->getType(), CI.getOperand(3)->getType() }; - CI.setOperand(0, + CI.setCalledFunction( Intrinsic::getDeclaration(M, MemCpyID, Tys, 3)); Changed = true; } @@ -526,7 +526,7 @@ // X + 0 -> {X, false} if (RHS->isZero()) { Constant *V[] = { - UndefValue::get(II->getOperand(0)->getType()), + UndefValue::get(II->getCalledValue()->getType()), ConstantInt::getFalse(II->getContext()) }; Constant *Struct = ConstantStruct::get(II->getContext(), V, 2, false); Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=101899&r1=101898&r2=101899&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Tue Apr 20 08:13:04 2010 @@ -744,7 +744,7 @@ const Type *ArgTys[3] = { M->getRawDest()->getType(), M->getRawSource()->getType(), M->getLength()->getType() }; - M->setOperand(0,Intrinsic::getDeclaration(Mod, Intrinsic::memcpy, ArgTys, 3)); + M->setCalledFunction(Intrinsic::getDeclaration(Mod, Intrinsic::memcpy, ArgTys, 3)); // MemDep may have over conservative information about this instruction, just // conservatively flush it from the cache. Modified: llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp?rev=101899&r1=101898&r2=101899&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp Tue Apr 20 08:13:04 2010 @@ -1316,7 +1316,7 @@ } // Process each element of the aggregate. - Value *TheFn = MI->getOperand(0); + Value *TheFn = MI->getCalledValue(); const Type *BytePtrTy = MI->getRawDest()->getType(); bool SROADest = MI->getRawDest() == Inst; From nicholas at mxc.ca Tue Apr 20 08:28:59 2010 From: nicholas at mxc.ca (Nick Lewycky) Date: Tue, 20 Apr 2010 06:28:59 -0700 Subject: [llvm-commits] [llvm] r101812 - in /llvm/trunk: lib/Support/Dwarf.cpp test/DebugInfo/2010-04-19-FramePtr.ll In-Reply-To: <20100419203139.315AC2A6C12C@llvm.org> References: <20100419203139.315AC2A6C12C@llvm.org> Message-ID: <4BCDAC1B.1000707@mxc.ca> Devang Patel wrote: > Author: dpatel > Date: Mon Apr 19 15:31:39 2010 > New Revision: 101812 > > URL: http://llvm.org/viewvc/llvm-project?rev=101812&view=rev > Log: > Fix typo. add a test case. > > Added: > llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll > Modified: > llvm/trunk/lib/Support/Dwarf.cpp > > Modified: llvm/trunk/lib/Support/Dwarf.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Dwarf.cpp?rev=101812&r1=101811&r2=101812&view=diff > ============================================================================== > --- llvm/trunk/lib/Support/Dwarf.cpp (original) > +++ llvm/trunk/lib/Support/Dwarf.cpp Mon Apr 19 15:31:39 2010 > @@ -198,7 +198,7 @@ > case DW_AT_APPLE_block: return "DW_AT_APPLE_block"; > case DW_AT_APPLE_major_runtime_vers: return "DW_AT_APPLE_major_runtime_vers"; > case DW_AT_APPLE_runtime_class: return "DW_AT_APPLE_runtime_class"; > - case DW_AT_APPLE_omit_frame_ptr: return "DW_APPLE_omit_frame_ptr"; > + case DW_AT_APPLE_omit_frame_ptr: return "DW_AT_APPLE_omit_frame_ptr"; > } > return 0; > } > > Added: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll?rev=101812&view=auto > ============================================================================== > --- llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll (added) > +++ llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Mon Apr 19 15:31:39 2010 > @@ -0,0 +1,30 @@ > +; RUN: llc -asm-verbose -O0 -o %t< %s > +; grep DW_AT_APPLE_omit_frame_ptr %t > +; RUN: llc -disable-fp-elim -asm-verbose -O0 -o %t< %s > +; grep -v DW_AT_APPLE_omit_frame_ptr %t There's no RUN: before the 'grep' lines, so grep isn't being run. Please fix this test. Nick > + > + > +define i32 @foo() nounwind ssp { > +entry: > + %retval = alloca i32 ; [#uses=2] > + %0 = alloca i32 ; [#uses=2] > + %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] > + store i32 42, i32* %0, align 4, !dbg !0 > + %1 = load i32* %0, align 4, !dbg !0 ; [#uses=1] > + store i32 %1, i32* %retval, align 4, !dbg !0 > + br label %return, !dbg !0 > + > +return: ; preds = %entry > + %retval1 = load i32* %retval, !dbg !0 ; [#uses=1] > + ret i32 %retval1, !dbg !7 > +} > + > +!0 = metadata !{i32 2, i32 0, metadata !1, null} > +!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] > +!2 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] > +!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] > +!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] > +!5 = metadata !{metadata !6} > +!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] > +!7 = metadata !{i32 2, i32 0, metadata !8, null} > +!8 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From gohman at apple.com Tue Apr 20 09:46:25 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 14:46:25 -0000 Subject: [llvm-commits] [llvm] r101900 - /llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Message-ID: <20100420144625.D28242A6C12C@llvm.org> Author: djg Date: Tue Apr 20 09:46:25 2010 New Revision: 101900 URL: http://llvm.org/viewvc/llvm-project?rev=101900&view=rev Log: Don't iterate through the whole block just to find the PHI nodes. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp?rev=101900&r1=101899&r2=101900&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Tue Apr 20 09:46:25 2010 @@ -211,13 +211,10 @@ // Create Machine PHI nodes for LLVM PHI nodes, lowering them as // appropriate. - const PHINode *PN; DebugLoc DL; - for (BasicBlock::const_iterator - I = BB->begin(), E = BB->end(); I != E; ++I) { - - PN = dyn_cast(I); - if (!PN || PN->use_empty()) continue; + for (BasicBlock::const_iterator I = BB->begin(); + const PHINode *PN = dyn_cast(I); ++I) { + if (PN->use_empty()) continue; unsigned PHIReg = ValueMap[PN]; assert(PHIReg && "PHI node does not have an assigned virtual register!"); From gohman at apple.com Tue Apr 20 09:48:02 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 14:48:02 -0000 Subject: [llvm-commits] [llvm] r101901 - /llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Message-ID: <20100420144802.9616A2A6C12C@llvm.org> Author: djg Date: Tue Apr 20 09:48:02 2010 New Revision: 101901 URL: http://llvm.org/viewvc/llvm-project?rev=101901&view=rev Log: If a PHI node somehow has debug info, propogate it to the MachineInstr PHI. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp?rev=101901&r1=101900&r2=101901&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Tue Apr 20 09:48:02 2010 @@ -211,11 +211,11 @@ // Create Machine PHI nodes for LLVM PHI nodes, lowering them as // appropriate. - DebugLoc DL; for (BasicBlock::const_iterator I = BB->begin(); const PHINode *PN = dyn_cast(I); ++I) { if (PN->use_empty()) continue; + DebugLoc DL = PN->getDebugLoc(); unsigned PHIReg = ValueMap[PN]; assert(PHIReg && "PHI node does not have an assigned virtual register!"); From gohman at apple.com Tue Apr 20 09:50:14 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 14:50:14 -0000 Subject: [llvm-commits] [llvm] r101902 - /llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Message-ID: <20100420145014.0EE4C2A6C12C@llvm.org> Author: djg Date: Tue Apr 20 09:50:13 2010 New Revision: 101902 URL: http://llvm.org/viewvc/llvm-project?rev=101902&view=rev Log: Sink this use_empty() check into isUsedOutsideOfDefiningBlock. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp?rev=101902&r1=101901&r2=101902&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp Tue Apr 20 09:50:13 2010 @@ -124,6 +124,7 @@ /// PHI nodes or outside of the basic block that defines it, or used by a /// switch or atomic instruction, which may expand to multiple basic blocks. static bool isUsedOutsideOfDefiningBlock(const Instruction *I) { + if (I->use_empty()) return false; if (isa(I)) return true; const BasicBlock *BB = I->getParent(); for (Value::const_use_iterator UI = I->use_begin(), E = I->use_end(); @@ -190,7 +191,7 @@ for (; BB != EB; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) - if (!I->use_empty() && isUsedOutsideOfDefiningBlock(I)) + if (isUsedOutsideOfDefiningBlock(I)) if (!isa(I) || !StaticAllocaMap.count(cast(I))) InitializeRegForValue(I); From gohman at apple.com Tue Apr 20 09:51:20 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 14:51:20 -0000 Subject: [llvm-commits] [llvm] r101903 - /llvm/trunk/include/llvm/Target/TargetRegisterInfo.h Message-ID: <20100420145120.44D5C2A6C12C@llvm.org> Author: djg Date: Tue Apr 20 09:51:20 2010 New Revision: 101903 URL: http://llvm.org/viewvc/llvm-project?rev=101903&view=rev Log: Document that TargetRegisterInfo::contains does not cover virtual registers. Modified: llvm/trunk/include/llvm/Target/TargetRegisterInfo.h Modified: llvm/trunk/include/llvm/Target/TargetRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRegisterInfo.h?rev=101903&r1=101902&r2=101903&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetRegisterInfo.h (original) +++ llvm/trunk/include/llvm/Target/TargetRegisterInfo.h Tue Apr 20 09:51:20 2010 @@ -109,7 +109,7 @@ } /// contains - Return true if the specified register is included in this - /// register class. + /// register class. This does not include virtual registers. bool contains(unsigned Reg) const { return RegSet.count(Reg); } From gohman at apple.com Tue Apr 20 10:00:41 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 15:00:41 -0000 Subject: [llvm-commits] [llvm] r101904 - in /llvm/trunk/lib/CodeGen/SelectionDAG: FastISel.cpp SelectionDAGBuilder.cpp SelectionDAGBuilder.h SelectionDAGISel.cpp Message-ID: <20100420150041.646352A6C12C@llvm.org> Author: djg Date: Tue Apr 20 10:00:41 2010 New Revision: 101904 URL: http://llvm.org/viewvc/llvm-project?rev=101904&view=rev Log: Don't send PHI nodes down to SelectionDAGBuilder of FastISel, since they end up doing nothing. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=101904&r1=101903&r2=101904&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Tue Apr 20 10:00:41 2010 @@ -52,6 +52,7 @@ #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Support/ErrorHandling.h" #include "FunctionLoweringInfo.h" using namespace llvm; @@ -692,10 +693,6 @@ // Nothing to emit. return true; - case Instruction::PHI: - // PHI nodes are already emitted. - return true; - case Instruction::Alloca: // FunctionLowering has the static-sized case covered. if (StaticAllocaMap.count(cast(I))) @@ -735,6 +732,9 @@ return true; } + case Instruction::PHI: + llvm_unreachable("FastISel shouldn't visit PHI nodes!"); + default: // Unhandled instruction. Halt "fast" selection and bail. return false; Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101904&r1=101903&r2=101904&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Tue Apr 20 10:00:41 2010 @@ -621,6 +621,10 @@ CurDebugLoc = DebugLoc(); } +void SelectionDAGBuilder::visitPHI(const PHINode &) { + llvm_unreachable("SelectionDAGBuilder shouldn't visit PHI nodes!"); +} + void SelectionDAGBuilder::visit(unsigned Opcode, const User &I) { // Note: this doesn't use InstVisitor, because it has to work with // ConstantExpr's in addition to instructions. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=101904&r1=101903&r2=101904&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Tue Apr 20 10:00:41 2010 @@ -468,7 +468,7 @@ void visitAlloca(const AllocaInst &I); void visitLoad(const LoadInst &I); void visitStore(const StoreInst &I); - void visitPHI(const PHINode &I) { } // PHI nodes are handled specially. + void visitPHI(const PHINode &I); void visitCall(const CallInst &I); bool visitMemCmpCall(const CallInst &I); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101904&r1=101903&r2=101904&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 20 10:00:41 2010 @@ -728,7 +728,7 @@ const BasicBlock *LLVMBB = &*I; MachineBasicBlock *BB = FuncInfo->MBBMap[LLVMBB]; - BasicBlock::const_iterator const Begin = LLVMBB->begin(); + BasicBlock::const_iterator const Begin = LLVMBB->getFirstNonPHI(); BasicBlock::const_iterator const End = LLVMBB->end(); BasicBlock::const_iterator BI = Begin; From baldrick at free.fr Tue Apr 20 10:02:07 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 15:02:07 -0000 Subject: [llvm-commits] [dragonegg] r101905 - /dragonegg/trunk/extras/do_self_strap Message-ID: <20100420150208.02F152A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 10:02:07 2010 New Revision: 101905 URL: http://llvm.org/viewvc/llvm-project?rev=101905&view=rev Log: If building Ada, make sure that the newly built GNAT tools are used, rather than the system tools. Modified: dragonegg/trunk/extras/do_self_strap Modified: dragonegg/trunk/extras/do_self_strap URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/do_self_strap?rev=101905&r1=101904&r2=101905&view=diff ============================================================================== --- dragonegg/trunk/extras/do_self_strap (original) +++ dragonegg/trunk/extras/do_self_strap Tue Apr 20 10:02:07 2010 @@ -158,6 +158,7 @@ export CC="$GCC_INSTALL/bin/gcc $PLUGIN_OPTION" export CXX="$GCC_INSTALL/bin/g++ $PLUGIN_OPTION" export GCC=$CC # Tells dragonegg what to build against + export PATH=$GCC_INSTALL/bin:$PATH # For gnatmake, gnatbind etc if building Ada # The built libstdc++ and libgcc may be more recent than the system versions. # Set the library path so that programs compiled with the just built GCC will From gohman at apple.com Tue Apr 20 10:03:56 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 15:03:56 -0000 Subject: [llvm-commits] [llvm] r101906 - in /llvm/trunk/lib/CodeGen/SelectionDAG: SelectionDAGBuilder.cpp SelectionDAGISel.cpp Message-ID: <20100420150356.388562A6C12C@llvm.org> Author: djg Date: Tue Apr 20 10:03:56 2010 New Revision: 101906 URL: http://llvm.org/viewvc/llvm-project?rev=101906&view=rev Log: Sink the CopyToExportRegsIfNeeded calls out of SelectionDAGISel into SelectionDAGBuilder. This avoids a separate pass over the instructions, and has the side effect of providing debug location information to the copy. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=101906&r1=101905&r2=101906&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Tue Apr 20 10:03:56 2010 @@ -618,6 +618,9 @@ visit(I.getOpcode(), I); + if (!isa(&I) && !HasTailCall) + CopyToExportRegsIfNeeded(&I); + CurDebugLoc = DebugLoc(); } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=101906&r1=101905&r2=101906&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 20 10:03:56 2010 @@ -239,12 +239,6 @@ SDB->visit(*I); if (!SDB->HasTailCall) { - // Ensure that all instructions which are used outside of their defining - // blocks are available as virtual registers. Invoke is handled elsewhere. - for (BasicBlock::const_iterator I = Begin; I != End; ++I) - if (!isa(I) && !isa(I)) - SDB->CopyToExportRegsIfNeeded(I); - // Handle PHI nodes in successor blocks. if (End == LLVMBB->end()) { HandlePHINodesInSuccessorBlocks(LLVMBB); From gohman at apple.com Tue Apr 20 10:55:31 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 15:55:31 -0000 Subject: [llvm-commits] [test-suite] r101908 - /test-suite/trunk/SingleSource/Benchmarks/Misc-C++-EH/spirit.cpp Message-ID: <20100420155531.B55612A6C12C@llvm.org> Author: djg Date: Tue Apr 20 10:55:31 2010 New Revision: 101908 URL: http://llvm.org/viewvc/llvm-project?rev=101908&view=rev Log: Fix compilation errors due to missing #includes. Modified: test-suite/trunk/SingleSource/Benchmarks/Misc-C++-EH/spirit.cpp Modified: test-suite/trunk/SingleSource/Benchmarks/Misc-C++-EH/spirit.cpp URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Misc-C%2B%2B-EH/spirit.cpp?rev=101908&r1=101907&r2=101908&view=diff ============================================================================== --- test-suite/trunk/SingleSource/Benchmarks/Misc-C++-EH/spirit.cpp (original) +++ test-suite/trunk/SingleSource/Benchmarks/Misc-C++-EH/spirit.cpp Tue Apr 20 10:55:31 2010 @@ -2,6 +2,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace boost { namespace spirit { struct nil_t {}; From gohman at apple.com Tue Apr 20 11:09:25 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 16:09:25 -0000 Subject: [llvm-commits] [test-suite] r101910 - /test-suite/trunk/SingleSource/Benchmarks/Makefile Message-ID: <20100420160925.F10622A6C12C@llvm.org> Author: djg Date: Tue Apr 20 11:09:25 2010 New Revision: 101910 URL: http://llvm.org/viewvc/llvm-project?rev=101910&view=rev Log: Re-enable Misc-C++-EH. llvm-gcc supports exceptions these days, and the unoptimized bitcode file is 3.1M these days rather than 100M. Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Makefile?rev=101910&r1=101909&r2=101910&view=diff ============================================================================== --- test-suite/trunk/SingleSource/Benchmarks/Makefile (original) +++ test-suite/trunk/SingleSource/Benchmarks/Makefile Tue Apr 20 11:09:25 2010 @@ -1,9 +1,6 @@ LEVEL = ../.. PARALLEL_DIRS=Dhrystone CoyoteBench Shootout Shootout-C++ Stanford McGill \ - Misc Misc-C++ BenchmarkGame Adobe-C++ -# Misc-C++-EH - someday when EH is supported in llvm-gcc we should -# re-enable this test. It always fails and its very slow -# (100MB Bytecode) so we disable it for now. + Misc Misc-C++ Misc-C++-EH BenchmarkGame Adobe-C++ LDFLAGS += -lm include $(LEVEL)/SingleSource/Makefile.singlesrc From dalej at apple.com Tue Apr 20 12:04:48 2010 From: dalej at apple.com (Dale Johannesen) Date: Tue, 20 Apr 2010 10:04:48 -0700 Subject: [llvm-commits] [test-suite] r101910 - /test-suite/trunk/SingleSource/Benchmarks/Makefile In-Reply-To: <20100420160925.F10622A6C12C@llvm.org> References: <20100420160925.F10622A6C12C@llvm.org> Message-ID: On Apr 20, 2010, at 9:09 AMPDT, Dan Gohman wrote: > Author: djg > Date: Tue Apr 20 11:09:25 2010 > New Revision: 101910 > > URL: http://llvm.org/viewvc/llvm-project?rev=101910&view=rev > Log: > Re-enable Misc-C++-EH. llvm-gcc supports exceptions these days, and the > unoptimized bitcode file is 3.1M these days rather than 100M. Does it pass now? > Modified: > test-suite/trunk/SingleSource/Benchmarks/Makefile > > Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile > URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Makefile?rev=101910&r1=101909&r2=101910&view=diff > ============================================================================== > --- test-suite/trunk/SingleSource/Benchmarks/Makefile (original) > +++ test-suite/trunk/SingleSource/Benchmarks/Makefile Tue Apr 20 11:09:25 2010 > @@ -1,9 +1,6 @@ > LEVEL = ../.. > PARALLEL_DIRS=Dhrystone CoyoteBench Shootout Shootout-C++ Stanford McGill \ > - Misc Misc-C++ BenchmarkGame Adobe-C++ > -# Misc-C++-EH - someday when EH is supported in llvm-gcc we should > -# re-enable this test. It always fails and its very slow > -# (100MB Bytecode) so we disable it for now. > + Misc Misc-C++ Misc-C++-EH BenchmarkGame Adobe-C++ > LDFLAGS += -lm > > include $(LEVEL)/SingleSource/Makefile.singlesrc > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From dpatel at apple.com Tue Apr 20 12:20:10 2010 From: dpatel at apple.com (Devang Patel) Date: Tue, 20 Apr 2010 17:20:10 -0000 Subject: [llvm-commits] [llvm] r101913 - /llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Message-ID: <20100420172010.81DA92A6C12C@llvm.org> Author: dpatel Date: Tue Apr 20 12:20:10 2010 New Revision: 101913 URL: http://llvm.org/viewvc/llvm-project?rev=101913&view=rev Log: Add RUN: Modified: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Modified: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll?rev=101913&r1=101912&r2=101913&view=diff ============================================================================== --- llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll (original) +++ llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Tue Apr 20 12:20:10 2010 @@ -1,7 +1,7 @@ ; RUN: llc -asm-verbose -O0 -o %t < %s -; grep DW_AT_APPLE_omit_frame_ptr %t +; RUN: grep DW_AT_APPLE_omit_frame_ptr %t ; RUN: llc -disable-fp-elim -asm-verbose -O0 -o %t < %s -; grep -v DW_AT_APPLE_omit_frame_ptr %t +; RUN: grep -v DW_AT_APPLE_omit_frame_ptr %t define i32 @foo() nounwind ssp { From dpatel at apple.com Tue Apr 20 12:21:25 2010 From: dpatel at apple.com (Devang Patel) Date: Tue, 20 Apr 2010 10:21:25 -0700 Subject: [llvm-commits] [llvm] r101812 - in /llvm/trunk: lib/Support/Dwarf.cpp test/DebugInfo/2010-04-19-FramePtr.ll In-Reply-To: <4BCDAC1B.1000707@mxc.ca> References: <20100419203139.315AC2A6C12C@llvm.org> <4BCDAC1B.1000707@mxc.ca> Message-ID: <24BFAD4A-9AF7-4D71-BB22-B66372E2D61A@apple.com> Done. On Apr 20, 2010, at 6:28 AM, Nick Lewycky wrote: > Devang Patel wrote: >> Author: dpatel >> Date: Mon Apr 19 15:31:39 2010 >> New Revision: 101812 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=101812&view=rev >> Log: >> Fix typo. add a test case. >> >> Added: >> llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll >> Modified: >> llvm/trunk/lib/Support/Dwarf.cpp >> >> Modified: llvm/trunk/lib/Support/Dwarf.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Dwarf.cpp?rev=101812&r1=101811&r2=101812&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Support/Dwarf.cpp (original) >> +++ llvm/trunk/lib/Support/Dwarf.cpp Mon Apr 19 15:31:39 2010 >> @@ -198,7 +198,7 @@ >> case DW_AT_APPLE_block: return "DW_AT_APPLE_block"; >> case DW_AT_APPLE_major_runtime_vers: return "DW_AT_APPLE_major_runtime_vers"; >> case DW_AT_APPLE_runtime_class: return "DW_AT_APPLE_runtime_class"; >> - case DW_AT_APPLE_omit_frame_ptr: return "DW_APPLE_omit_frame_ptr"; >> + case DW_AT_APPLE_omit_frame_ptr: return "DW_AT_APPLE_omit_frame_ptr"; >> } >> return 0; >> } >> >> Added: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll?rev=101812&view=auto >> ============================================================================== >> --- llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll (added) >> +++ llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Mon Apr 19 15:31:39 2010 >> @@ -0,0 +1,30 @@ >> +; RUN: llc -asm-verbose -O0 -o %t< %s >> +; grep DW_AT_APPLE_omit_frame_ptr %t >> +; RUN: llc -disable-fp-elim -asm-verbose -O0 -o %t< %s >> +; grep -v DW_AT_APPLE_omit_frame_ptr %t > > There's no RUN: before the 'grep' lines, so grep isn't being run. Please fix this test. > > Nick > >> + >> + >> +define i32 @foo() nounwind ssp { >> +entry: >> + %retval = alloca i32 ; [#uses=2] >> + %0 = alloca i32 ; [#uses=2] >> + %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] >> + store i32 42, i32* %0, align 4, !dbg !0 >> + %1 = load i32* %0, align 4, !dbg !0 ; [#uses=1] >> + store i32 %1, i32* %retval, align 4, !dbg !0 >> + br label %return, !dbg !0 >> + >> +return: ; preds = %entry >> + %retval1 = load i32* %retval, !dbg !0 ; [#uses=1] >> + ret i32 %retval1, !dbg !7 >> +} >> + >> +!0 = metadata !{i32 2, i32 0, metadata !1, null} >> +!1 = metadata !{i32 524334, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"foo", metadata !2, i32 2, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i1 false} ; [ DW_TAG_subprogram ] >> +!2 = metadata !{i32 524329, metadata !"a.c", metadata !"/tmp", metadata !3} ; [ DW_TAG_file_type ] >> +!3 = metadata !{i32 524305, i32 0, i32 1, metadata !"a.c", metadata !"/tmp", metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] >> +!4 = metadata !{i32 524309, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null} ; [ DW_TAG_subroutine_type ] >> +!5 = metadata !{metadata !6} >> +!6 = metadata !{i32 524324, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] >> +!7 = metadata !{i32 2, i32 0, metadata !8, null} >> +!8 = metadata !{i32 524299, metadata !1, i32 2, i32 0} ; [ DW_TAG_lexical_block ] >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> > From evan.cheng at apple.com Tue Apr 20 12:27:38 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Apr 2010 17:27:38 -0000 Subject: [llvm-commits] [llvm] r101914 - /llvm/trunk/lib/CodeGen/MachineCSE.cpp Message-ID: <20100420172738.ECD382A6C12C@llvm.org> Author: evancheng Date: Tue Apr 20 12:27:38 2010 New Revision: 101914 URL: http://llvm.org/viewvc/llvm-project?rev=101914&view=rev Log: Typo. Modified: llvm/trunk/lib/CodeGen/MachineCSE.cpp Modified: llvm/trunk/lib/CodeGen/MachineCSE.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineCSE.cpp?rev=101914&r1=101913&r2=101914&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineCSE.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineCSE.cpp Tue Apr 20 12:27:38 2010 @@ -356,7 +356,7 @@ CSEPairs.clear(); } - // Recursively call ProcessBlock with childred. + // Recursively call ProcessBlock with children. const std::vector &Children = Node->getChildren(); for (unsigned i = 0, e = Children.size(); i != e; ++i) Changed |= ProcessBlock(Children[i]); From johnny.chen at apple.com Tue Apr 20 12:28:50 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 20 Apr 2010 17:28:50 -0000 Subject: [llvm-commits] [llvm] r101915 - in /llvm/trunk: lib/Target/ARM/Disassembler/ARMDisassembler.cpp test/MC/Disassembler/thumb-tests.txt Message-ID: <20100420172850.972012A6C12C@llvm.org> Author: johnny Date: Tue Apr 20 12:28:50 2010 New Revision: 101915 URL: http://llvm.org/viewvc/llvm-project?rev=101915&view=rev Log: For t2LDRT, t2LDRBT, t2LDRHT, t2LDRSBT, and t2LDRSHT, if Rn(Inst{19-16})=='1111', transform the Opcode to the corresponding t2LDR*pci counterpart. Ref: A8.6.86 LDRT, A8.6.65 LDRBT, A8.6.77 LDRHT, A8.6.81 LDRSBT, A8.6.85 LDRSHT Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp llvm/trunk/test/MC/Disassembler/thumb-tests.txt Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp?rev=101915&r1=101914&r2=101915&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Tue Apr 20 12:28:50 2010 @@ -250,27 +250,27 @@ case ARM::t2LDR_POST: case ARM::t2LDR_PRE: case ARM::t2LDRi12: case ARM::t2LDRi8: - case ARM::t2LDRs: + case ARM::t2LDRs: case ARM::t2LDRT: return ARM::t2LDRpci; case ARM::t2LDRB_POST: case ARM::t2LDRB_PRE: case ARM::t2LDRBi12: case ARM::t2LDRBi8: - case ARM::t2LDRBs: + case ARM::t2LDRBs: case ARM::t2LDRBT: return ARM::t2LDRBpci; case ARM::t2LDRH_POST: case ARM::t2LDRH_PRE: case ARM::t2LDRHi12: case ARM::t2LDRHi8: - case ARM::t2LDRHs: + case ARM::t2LDRHs: case ARM::t2LDRHT: return ARM::t2LDRHpci; case ARM::t2LDRSB_POST: case ARM::t2LDRSB_PRE: case ARM::t2LDRSBi12: case ARM::t2LDRSBi8: - case ARM::t2LDRSBs: + case ARM::t2LDRSBs: case ARM::t2LDRSBT: return ARM::t2LDRSBpci; case ARM::t2LDRSH_POST: case ARM::t2LDRSH_PRE: case ARM::t2LDRSHi12: case ARM::t2LDRSHi8: - case ARM::t2LDRSHs: + case ARM::t2LDRSHs: case ARM::t2LDRSHT: return ARM::t2LDRSHpci; } } Modified: llvm/trunk/test/MC/Disassembler/thumb-tests.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/thumb-tests.txt?rev=101915&r1=101914&r2=101915&view=diff ============================================================================== --- llvm/trunk/test/MC/Disassembler/thumb-tests.txt (original) +++ llvm/trunk/test/MC/Disassembler/thumb-tests.txt Tue Apr 20 12:28:50 2010 @@ -27,6 +27,9 @@ # CHECK: ldmia r0!, {r1} 0x02 0xc8 +# CHECK: ldrb.w r8, #-24 +0x1f 0xf8 0x18 0x80 + # CHECK: ldrd r0, r1, [r7, #64]! 0xf7 0xe9 0x10 0x01 From gohman at apple.com Tue Apr 20 12:32:00 2010 From: gohman at apple.com (Dan Gohman) Date: Tue, 20 Apr 2010 17:32:00 -0000 Subject: [llvm-commits] [test-suite] r101916 - /test-suite/trunk/SingleSource/Benchmarks/Makefile Message-ID: <20100420173200.89B192A6C12C@llvm.org> Author: djg Date: Tue Apr 20 12:32:00 2010 New Revision: 101916 URL: http://llvm.org/viewvc/llvm-project?rev=101916&view=rev Log: Re-disable Misc-C++-EH; it fails under clang. Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Makefile?rev=101916&r1=101915&r2=101916&view=diff ============================================================================== --- test-suite/trunk/SingleSource/Benchmarks/Makefile (original) +++ test-suite/trunk/SingleSource/Benchmarks/Makefile Tue Apr 20 12:32:00 2010 @@ -1,6 +1,11 @@ LEVEL = ../.. + +# TODO: Misc-C++-EH is excluded from PARALLEL_DIRS because spirit.cpp +# fails with clang. + PARALLEL_DIRS=Dhrystone CoyoteBench Shootout Shootout-C++ Stanford McGill \ - Misc Misc-C++ Misc-C++-EH BenchmarkGame Adobe-C++ + Misc Misc-C++ BenchmarkGame Adobe-C++ + LDFLAGS += -lm include $(LEVEL)/SingleSource/Makefile.singlesrc From isanbard at gmail.com Tue Apr 20 13:14:47 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 20 Apr 2010 18:14:47 -0000 Subject: [llvm-commits] [llvm] r101925 - in /llvm/trunk/test/CodeGen/X86: 2010-04-19-DAGCombineCrash.ll crash.ll Message-ID: <20100420181447.72B8E2A6C12C@llvm.org> Author: void Date: Tue Apr 20 13:14:47 2010 New Revision: 101925 URL: http://llvm.org/viewvc/llvm-project?rev=101925&view=rev Log: Move CodeGen/X86/2010-04-19-DAGCombineCrash.ll into CodeGen/X86/crash.ll. Also reduce. Removed: llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll Modified: llvm/trunk/test/CodeGen/X86/crash.ll Removed: llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll?rev=101924&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll (original) +++ llvm/trunk/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll (removed) @@ -1,58 +0,0 @@ -; RUN: llc < %s -mtriple=i386-apple-darwin -; rdar://7869290 - -%struct.anon = type { float } - -define void @func() nounwind ssp { -entry: - br label %bb66 - -bb: ; preds = %bb66 - br i1 undef, label %bb65, label %bb2 - -bb2: ; preds = %bb - br i1 undef, label %bb65, label %bb3 - -bb3: ; preds = %bb2 - br i1 undef, label %bb65, label %bb4 - -bb4: ; preds = %bb3 - br i1 undef, label %bb65, label %bb5 - -bb5: ; preds = %bb4 - br i1 undef, label %bb65, label %bb6 - -bb6: ; preds = %bb5 - br i1 undef, label %bb65, label %bb11 - -bb11: ; preds = %bb6 - br i1 undef, label %bb65, label %bb12 - -bb12: ; preds = %bb11 - br i1 undef, label %bb65, label %bb13 - -bb13: ; preds = %bb12 - br i1 undef, label %bb65, label %bb14 - -bb14: ; preds = %bb13 - %0 = trunc i16 undef to i1 ; [#uses=1] - %1 = load i8* undef, align 8 ; [#uses=1] - %2 = shl i8 %1, 4 ; [#uses=1] - %3 = lshr i8 %2, 7 ; [#uses=1] - %4 = trunc i8 %3 to i1 ; [#uses=1] - %5 = icmp ne i1 %0, %4 ; [#uses=1] - br i1 %5, label %bb65, label %bb15 - -bb15: ; preds = %bb14 - %6 = load %struct.anon** undef, align 8 ; <%struct.anon*> [#uses=0] - br label %bb65 - -bb65: ; preds = %bb15, %bb14, %bb13, %bb12, %bb11, %bb6, %bb5, %bb4, %bb3, %bb2, %bb - br label %bb66 - -bb66: ; preds = %bb65, %entry - br i1 undef, label %bb, label %bb67 - -bb67: ; preds = %bb66 - ret void -} Modified: llvm/trunk/test/CodeGen/X86/crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/crash.ll?rev=101925&r1=101924&r2=101925&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/crash.ll (original) +++ llvm/trunk/test/CodeGen/X86/crash.ll Tue Apr 20 13:14:47 2010 @@ -109,3 +109,24 @@ !0 = metadata !{i32 633550} !1 = metadata !{i32 634261} + + +; Crash during XOR optimization. +; + +define void @test7() nounwind ssp { +entry: + br i1 undef, label %bb14, label %bb67 + +bb14: + %tmp0 = trunc i16 undef to i1 + %tmp1 = load i8* undef, align 8 + %tmp2 = shl i8 %tmp1, 4 + %tmp3 = lshr i8 %tmp2, 7 + %tmp4 = trunc i8 %tmp3 to i1 + %tmp5 = icmp ne i1 %tmp0, %tmp4 + br i1 %tmp5, label %bb14, label %bb67 + +bb67: + ret void +} From johnny.chen at apple.com Tue Apr 20 13:45:24 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 20 Apr 2010 18:45:24 -0000 Subject: [llvm-commits] [llvm] r101929 - in /llvm/trunk: test/MC/Disassembler/thumb-tests.txt utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20100420184524.E106D2A6C12C@llvm.org> Author: johnny Date: Tue Apr 20 13:45:24 2010 New Revision: 101929 URL: http://llvm.org/viewvc/llvm-project?rev=101929&view=rev Log: When doing Thumb disassembly, there's no need to consider t2ADDrSPi12/t2SUBrSPi12, as their generic counterparts t2ADDri12/t2SUBri12 should suffice. Modified: llvm/trunk/test/MC/Disassembler/thumb-tests.txt llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/test/MC/Disassembler/thumb-tests.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/thumb-tests.txt?rev=101929&r1=101928&r2=101929&view=diff ============================================================================== --- llvm/trunk/test/MC/Disassembler/thumb-tests.txt (original) +++ llvm/trunk/test/MC/Disassembler/thumb-tests.txt Tue Apr 20 13:45:24 2010 @@ -60,6 +60,9 @@ # CHECK: subw r0, pc, #1 0xaf 0xf2 0x01 0x00 +# CHECK: subw r0, sp, #835 +0xad 0xf2 0x43 0x30 + # CHECK: uqadd16 r3, r4, r5 0x94 0xfa 0x55 0xf3 Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=101929&r1=101928&r2=101929&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Tue Apr 20 13:45:24 2010 @@ -1699,8 +1699,12 @@ // Ignore tADDrSP, tADDspr, and tPICADD, prefer the generic tADDhirr. // Ignore t2SUBrSPs, prefer the t2SUB[S]r[r|s]. // Ignore t2ADDrSPs, prefer the t2ADD[S]r[r|s]. + // Ignore t2ADDrSPi/t2SUBrSPi, which have more generic couterparts. + // Ignore t2ADDrSPi12/t2SUBrSPi12, which have more generic couterparts if (Name == "tADDrSP" || Name == "tADDspr" || Name == "tPICADD" || - Name == "t2SUBrSPs" || Name == "t2ADDrSPs") + Name == "t2SUBrSPs" || Name == "t2ADDrSPs" || + Name == "t2ADDrSPi" || Name == "t2SUBrSPi" || + Name == "t2ADDrSPi12" || Name == "t2SUBrSPi12") return false; // Ignore t2LDRDpci, prefer the generic t2LDRDi8, t2LDRD_PRE, t2LDRD_POST. @@ -1723,7 +1727,6 @@ // tLDRcp conflicts with tLDRspi // tRestore conflicts with tLDRspi // t2LEApcrelJT conflicts with t2LEApcrel - // t2ADDrSPi/t2SUBrSPi have more generic couterparts if (Name == "tBfar" || /* Name == "tCMNz" || */ Name == "tCMPzi8" || Name == "tCMPzr" || Name == "tCMPzhir" || /* Name == "t2CMNzrr" || Name == "t2CMNzrs" || @@ -1731,7 +1734,7 @@ Name == "t2CMPzri" || Name == "tPOP_RET" || Name == "t2LDM_RET" || Name == "tMOVCCi" || Name == "tMOVCCr" || Name == "tBR_JTr" || Name == "tSpill" || Name == "tLDRcp" || Name == "tRestore" || - Name == "t2LEApcrelJT" || Name == "t2ADDrSPi" || Name == "t2SUBrSPi") + Name == "t2LEApcrelJT") return false; } From stoklund at 2pi.dk Tue Apr 20 13:45:47 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Tue, 20 Apr 2010 18:45:47 -0000 Subject: [llvm-commits] [llvm] r101930 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp Message-ID: <20100420184547.C86302A6C12C@llvm.org> Author: stoklund Date: Tue Apr 20 13:45:47 2010 New Revision: 101930 URL: http://llvm.org/viewvc/llvm-project?rev=101930&view=rev Log: When MachineLICM is hoisting a physical register after regalloc, make sure the register is not killed in the loop. This fixes 188.ammp on ARM where the post-ra scheduler would grab a register that looked available but wasn't. A testcase would be huge and fragile, sorry. Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=101930&r1=101929&r2=101930&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Tue Apr 20 13:45:47 2010 @@ -411,12 +411,25 @@ delete[] PhysRegDefs; } -/// AddToLiveIns - Add register 'Reg' to the livein sets of BBs in the -/// current loop. +/// AddToLiveIns - Add register 'Reg' to the livein sets of BBs in the current +/// loop, and make sure it is not killed by any instructions in the loop. void MachineLICM::AddToLiveIns(unsigned Reg) { const std::vector Blocks = CurLoop->getBlocks(); - for (unsigned i = 0, e = Blocks.size(); i != e; ++i) - Blocks[i]->addLiveIn(Reg); + for (unsigned i = 0, e = Blocks.size(); i != e; ++i) { + MachineBasicBlock *BB = Blocks[i]; + if (!BB->isLiveIn(Reg)) + BB->addLiveIn(Reg); + for (MachineBasicBlock::iterator + MII = BB->begin(), E = BB->end(); MII != E; ++MII) { + MachineInstr *MI = &*MII; + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + MachineOperand &MO = MI->getOperand(i); + if (!MO.isReg() || !MO.getReg() || MO.isDef()) continue; + if (MO.getReg() == Reg || TRI->isSuperRegister(Reg, MO.getReg())) + MO.setIsKill(false); + } + } + } } /// HoistPostRA - When an instruction is found to only use loop invariant From evan.cheng at apple.com Tue Apr 20 14:22:43 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Apr 2010 12:22:43 -0700 Subject: [llvm-commits] [llvm] r101930 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp In-Reply-To: <20100420184547.C86302A6C12C@llvm.org> References: <20100420184547.C86302A6C12C@llvm.org> Message-ID: <165AE6D9-56EB-4244-853C-DCDA39611CDF@apple.com> On Apr 20, 2010, at 11:45 AM, Jakob Stoklund Olesen wrote: > Author: stoklund > Date: Tue Apr 20 13:45:47 2010 > New Revision: 101930 > > URL: http://llvm.org/viewvc/llvm-project?rev=101930&view=rev > Log: > When MachineLICM is hoisting a physical register after regalloc, make sure the > register is not killed in the loop. > > This fixes 188.ammp on ARM where the post-ra scheduler would grab a register > that looked available but wasn't. > > A testcase would be huge and fragile, sorry. > > Modified: > llvm/trunk/lib/CodeGen/MachineLICM.cpp > > Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=101930&r1=101929&r2=101930&view=diff > ============================================================================== > --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original) > +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Tue Apr 20 13:45:47 2010 > @@ -411,12 +411,25 @@ > delete[] PhysRegDefs; > } > > -/// AddToLiveIns - Add register 'Reg' to the livein sets of BBs in the > -/// current loop. > +/// AddToLiveIns - Add register 'Reg' to the livein sets of BBs in the current > +/// loop, and make sure it is not killed by any instructions in the loop. > void MachineLICM::AddToLiveIns(unsigned Reg) { > const std::vector Blocks = CurLoop->getBlocks(); > - for (unsigned i = 0, e = Blocks.size(); i != e; ++i) > - Blocks[i]->addLiveIn(Reg); > + for (unsigned i = 0, e = Blocks.size(); i != e; ++i) { > + MachineBasicBlock *BB = Blocks[i]; > + if (!BB->isLiveIn(Reg)) > + BB->addLiveIn(Reg); > + for (MachineBasicBlock::iterator > + MII = BB->begin(), E = BB->end(); MII != E; ++MII) { > + MachineInstr *MI = &*MII; > + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { > + MachineOperand &MO = MI->getOperand(i); > + if (!MO.isReg() || !MO.getReg() || MO.isDef()) continue; > + if (MO.getReg() == Reg || TRI->isSuperRegister(Reg, MO.getReg())) Thanks. Shouldn't this checks for alias rather than super register? It's bad if any part of the loop invariant is modified. Evan > + MO.setIsKill(false); > + } > + } > + } > } > > /// HoistPostRA - When an instruction is found to only use loop invariant > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From baldrick at free.fr Tue Apr 20 14:25:33 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 19:25:33 -0000 Subject: [llvm-commits] [dragonegg] r101932 - /dragonegg/trunk/extras/buildbot_self_strap-32 Message-ID: <20100420192533.CA66B2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 14:25:33 2010 New Revision: 101932 URL: http://llvm.org/viewvc/llvm-project?rev=101932&view=rev Log: Stop trying to build with Ada while I try to work out why it is failing. Modified: dragonegg/trunk/extras/buildbot_self_strap-32 Modified: dragonegg/trunk/extras/buildbot_self_strap-32 URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/extras/buildbot_self_strap-32?rev=101932&r1=101931&r2=101932&view=diff ============================================================================== --- dragonegg/trunk/extras/buildbot_self_strap-32 (original) +++ dragonegg/trunk/extras/buildbot_self_strap-32 Tue Apr 20 14:25:33 2010 @@ -14,7 +14,7 @@ export CXX="g++ -m32" export LD_LIBRARY_PATH=$HOME/cfarm-32/lib:$LD_LIBRARY_PATH export CPPFLAGS="-I/$HOME/cfarm-32/include" -export GCC_OPTIONS="--enable-languages=ada,c,c++,fortran,objc,obj-c++ --build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" +export GCC_OPTIONS="--enable-languages=c,c++,fortran,objc,obj-c++ --build=i686-pc-linux-gnu --disable-multilib --enable-targets=all --with-mpfr=$HOME/cfarm-32/ --with-gmp=$HOME/cfarm-32/ --with-mpc=$HOME/cfarm-32/ --with-libelf=$HOME/cfarm-32/" export LLVM_OPTIONS="--build=i686-pc-linux-gnu" cd $BUILD_DIR From baldrick at free.fr Tue Apr 20 14:40:59 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 20 Apr 2010 19:40:59 -0000 Subject: [llvm-commits] [llvm] r101934 - /llvm/trunk/docs/ReleaseNotes.html Message-ID: <20100420194059.1364D2A6C12C@llvm.org> Author: baldrick Date: Tue Apr 20 14:40:58 2010 New Revision: 101934 URL: http://llvm.org/viewvc/llvm-project?rev=101934&view=rev Log: I plan to release a version of dragonegg based on llvm-2.7 shortly after the llvm-2.7 release. Modified: llvm/trunk/docs/ReleaseNotes.html Modified: llvm/trunk/docs/ReleaseNotes.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ReleaseNotes.html?rev=101934&r1=101933&r2=101934&view=diff ============================================================================== --- llvm/trunk/docs/ReleaseNotes.html (original) +++ llvm/trunk/docs/ReleaseNotes.html Tue Apr 20 14:40:58 2010 @@ -245,12 +245,11 @@ DragonEgg is still a work in progress. Currently C works very well, while C++, Ada and Fortran work fairly well. All other languages either don't work at all, or only work poorly. For the moment only the x86-32 and x86-64 targets are -supported, and only on linux. +supported, and only on linux and darwin (darwin needs an additional gcc patch).

-DragonEgg has not yet been released. Once gcc-4.5 has been released, dragonegg -will probably be released as part of the following LLVM release. +The first dragonegg release will occur shortly after llvm-2.7 is released.

From stoklund at 2pi.dk Tue Apr 20 14:45:29 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Tue, 20 Apr 2010 12:45:29 -0700 Subject: [llvm-commits] [llvm] r101930 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp In-Reply-To: <165AE6D9-56EB-4244-853C-DCDA39611CDF@apple.com> References: <20100420184547.C86302A6C12C@llvm.org> <165AE6D9-56EB-4244-853C-DCDA39611CDF@apple.com> Message-ID: <5C39F0B0-2372-47BA-A9A1-2C3C86339DEB@2pi.dk> On Apr 20, 2010, at 12:22 PM, Evan Cheng wrote: > > On Apr 20, 2010, at 11:45 AM, Jakob Stoklund Olesen wrote: > >> Author: stoklund >> Date: Tue Apr 20 13:45:47 2010 >> New Revision: 101930 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=101930&view=rev >> Log: >> When MachineLICM is hoisting a physical register after regalloc, make sure the >> register is not killed in the loop. >> >> This fixes 188.ammp on ARM where the post-ra scheduler would grab a register >> that looked available but wasn't. >> >> A testcase would be huge and fragile, sorry. >> + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { >> + MachineOperand &MO = MI->getOperand(i); >> + if (!MO.isReg() || !MO.getReg() || MO.isDef()) continue; >> + if (MO.getReg() == Reg || TRI->isSuperRegister(Reg, MO.getReg())) > > Shouldn't this checks for alias rather than super register? It's bad if any part of the loop invariant is modified. I am pretty sure the above is safe since nobody would steal a register with a live super-register (Right?!). There is not going to be any sub-reg redefines, or we wouldn't do the hoist in the first place, so it doesn't really make a difference as far as I can tell. TRI->regsOverlap(Reg, MO.getReg()) works too, feel free to change it. /jakob From dpatel at apple.com Tue Apr 20 15:34:07 2010 From: dpatel at apple.com (Devang Patel) Date: Tue, 20 Apr 2010 20:34:07 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r101937 - /llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1 Message-ID: <20100420203407.B47D62A6C12D@llvm.org> Author: dpatel Date: Tue Apr 20 15:34:07 2010 New Revision: 101937 URL: http://llvm.org/viewvc/llvm-project?rev=101937&view=rev Log: llvm-gcc does not support #pragma optimization_level. Modified: llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1 Modified: llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1 URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1?rev=101937&r1=101936&r2=101937&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1 (original) +++ llvm-gcc-4.2/trunk/gcc/doc/llvm-gcc.1 Tue Apr 20 15:34:07 2010 @@ -20,7 +20,7 @@ [\fB\-f\fR\fIoption\fR...] [\fB\-m\fR\fImachine-option\fR...] [\fB\-o\fR \fIoutfile\fR] \fIinfile\fR... .Sh DESCRIPTION -llvm-gcc is a C, C++, Objective-C and Objective-C++ compiler. llvm-g++ is a compiler driver for C++. llvm-gcc uses gcc front-end and gcc's command line interface. Consult the cc(1) man page for command line options supported by llvm-gcc. Only selected LLVM specific options are listed here. +llvm-gcc is a C, C++, Objective-C and Objective-C++ compiler. llvm-g++ is a compiler driver for C++. llvm-gcc uses gcc front-end and gcc's command line interface. Consult the cc(1) man page for command line options supported by llvm-gcc. llvm-gcc does not support #pragma optimization_level supported by Darwin gcc. Only selected LLVM specific options are listed here. .Pp .Bl -tag -width -indent .It Fl flto From johnny.chen at apple.com Tue Apr 20 16:29:28 2010 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 20 Apr 2010 21:29:28 -0000 Subject: [llvm-commits] [llvm] r101942 - /llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Message-ID: <20100420212928.743D82A6C12C@llvm.org> Author: johnny Date: Tue Apr 20 16:29:28 2010 New Revision: 101942 URL: http://llvm.org/viewvc/llvm-project?rev=101942&view=rev Log: Better error-handling of getBitFieldInvMask() where msb < lsb (encoding error), instead of just asserting. Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=101942&r1=101941&r2=101942&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Tue Apr 20 16:29:28 2010 @@ -193,14 +193,18 @@ // A8.6.17 BFC // Encoding T1 ARMv6T2, ARMv7 // LLVM-specific encoding for # and # -static inline uint32_t getBitfieldInvMask(uint32_t insn) { +static inline bool getBitfieldInvMask(uint32_t insn, uint32_t &mask) { uint32_t lsb = getImm3(insn) << 2 | getImm2(insn); uint32_t msb = getMsb(insn); uint32_t Val = 0; - assert(lsb <= msb && "Encoding error: lsb > msb"); + if (msb < lsb) { + DEBUG(errs() << "Encoding error: msb < lsb\n"); + return false; + } for (uint32_t i = lsb; i <= msb; ++i) Val |= (1 << i); - return ~Val; + mask = ~Val; + return true; } // A8.4 Shifts applied to a register @@ -1550,9 +1554,13 @@ MI.addOperand(MCOperand::CreateImm(getIImm3Imm8(insn))); else if (Opcode == ARM::t2MOVi16 || Opcode == ARM::t2MOVTi16) MI.addOperand(MCOperand::CreateImm(getImm16(insn))); - else if (Opcode == ARM::t2BFC) - MI.addOperand(MCOperand::CreateImm(getBitfieldInvMask(insn))); - else { + else if (Opcode == ARM::t2BFC) { + uint32_t mask = 0; + if (getBitfieldInvMask(insn, mask)) + MI.addOperand(MCOperand::CreateImm(mask)); + else + return false; + } else { // Handle the case of: lsb width assert((Opcode == ARM::t2SBFX || Opcode == ARM::t2UBFX || Opcode == ARM::t2BFI) && "Invalid opcode"); From sabre at nondot.org Tue Apr 20 16:54:09 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 21:54:09 -0000 Subject: [llvm-commits] [www-pubs] r101944 - in /www-pubs/trunk: 2010-04-EUROSYS-DresdenTM.html 2010-04-EUROSYS-DresdenTM.pdf pubs.js Message-ID: <20100420215409.F2DC12A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 16:54:09 2010 New Revision: 101944 URL: http://llvm.org/viewvc/llvm-project?rev=101944&view=rev Log: add another EUROSYS paper, thanks to Torvald Riegel for sending this to me. Added: www-pubs/trunk/2010-04-EUROSYS-DresdenTM.html www-pubs/trunk/2010-04-EUROSYS-DresdenTM.pdf (with props) Modified: www-pubs/trunk/pubs.js Added: www-pubs/trunk/2010-04-EUROSYS-DresdenTM.html URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/2010-04-EUROSYS-DresdenTM.html?rev=101944&view=auto ============================================================================== --- www-pubs/trunk/2010-04-EUROSYS-DresdenTM.html (added) +++ www-pubs/trunk/2010-04-EUROSYS-DresdenTM.html Tue Apr 20 16:54:09 2010 @@ -0,0 +1,64 @@ + + + + + + Dresden TM Compiler (DTMC) + + + + +
+ Dave Christie and Jae-Woong Chung and Stephan Diestelhorst +and Michael Hohmuth and Martin Pohlack and Christof Fetzer and Martin Nowack +and Torvald Riegel and Pascal Felber and Patrick Marlier and Etienne Riviere +
+ +

Abstract:

+
+AMD's Advanced Synchronization Facility (ASF) is an x86 instruction set +extension proposal intended to simplify and speed up the +synchronization of concurrent programs. In this paper, we report our +experiences using ASF for implementing transactional memory. We have extended +a C/C++ compiler to support language-level transactions and generate +code that takes advantage of ASF. We use a software fallback mechanism for +transactions that cannot be committed within ASF (e.g., because of hardware +capacity limitations). Our evaluation uses a cycle-accurate x86 simulator +that we have extended with ASF support. Building a complete ASF-based software +stack allows us to evaluate the performance gains that a user-level program +can obtain from ASF. Our measurements on a wide range of benchmarks indicate +that the overheads traditionally associated with software transactional +memories can be significantly reduced with the help of ASF. +
+ +

Published:

+
+ "Dresden TM Compiler (DTMC)" +
+ Dave Christie and Jae-Woong Chung and Stephan Diestelhorst +and Michael Hohmuth and Martin Pohlack and Christof Fetzer and Martin Nowack +and Torvald Riegel and Pascal Felber and Patrick Marlier and Etienne Riviere +
+ +Proc. of the 5th ACM European Conference on Computer Systems +, Paris, France, April 2010. +
+

Download:

+

Paper:

+ + + +
+ Valid CSS! + Valid HTML 4.01! + + + Added: www-pubs/trunk/2010-04-EUROSYS-DresdenTM.pdf URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/2010-04-EUROSYS-DresdenTM.pdf?rev=101944&view=auto ============================================================================== Binary file - no diff available. Propchange: www-pubs/trunk/2010-04-EUROSYS-DresdenTM.pdf ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: www-pubs/trunk/pubs.js URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/pubs.js?rev=101944&r1=101943&r2=101944&view=diff ============================================================================== --- www-pubs/trunk/pubs.js (original) +++ www-pubs/trunk/pubs.js Tue Apr 20 16:54:09 2010 @@ -8,6 +8,15 @@ location: "Cape Town, South Africa", month: 5, year: 2010}, + {url: "2010-04-EUROSYS-DresdenTM.html", + title: "Dresden TM Compiler (DTMC)", + published: "Proc. of the 5th ACM European Conference on Computer Systems (EuroSys'10)", + author: "Dave Christie and Jae-Woong Chung and Stephan Diestelhorst + and Michael Hohmuth and Martin Pohlack and Christof Fetzer and Martin Nowack + and Torvald Riegel and Pascal Felber and Patrick Marlier and Etienne Riviere", + location: "Paris, France", + month: 4, + year: 2010}, {url: "2010-04-EUROSYS-RevNIC.html", title: "Reverse Engineering of Binary Device Drivers with RevNIC", published: "Proc. of the 5th ACM European Conference on Computer Systems (EuroSys'10)", From sabre at nondot.org Tue Apr 20 16:54:51 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 21:54:51 -0000 Subject: [llvm-commits] [www-pubs] r101945 - /www-pubs/trunk/pubs.js Message-ID: <20100420215451.BFC152A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 16:54:51 2010 New Revision: 101945 URL: http://llvm.org/viewvc/llvm-project?rev=101945&view=rev Log: hopefully valid js now. Modified: www-pubs/trunk/pubs.js Modified: www-pubs/trunk/pubs.js URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/pubs.js?rev=101945&r1=101944&r2=101945&view=diff ============================================================================== --- www-pubs/trunk/pubs.js (original) +++ www-pubs/trunk/pubs.js Tue Apr 20 16:54:51 2010 @@ -11,9 +11,7 @@ {url: "2010-04-EUROSYS-DresdenTM.html", title: "Dresden TM Compiler (DTMC)", published: "Proc. of the 5th ACM European Conference on Computer Systems (EuroSys'10)", - author: "Dave Christie and Jae-Woong Chung and Stephan Diestelhorst - and Michael Hohmuth and Martin Pohlack and Christof Fetzer and Martin Nowack - and Torvald Riegel and Pascal Felber and Patrick Marlier and Etienne Riviere", + author: "Dave Christie, Jae-Woong Chung, et al", location: "Paris, France", month: 4, year: 2010}, From sabre at nondot.org Tue Apr 20 16:58:05 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 20 Apr 2010 21:58:05 -0000 Subject: [llvm-commits] [www-pubs] r101946 - /www-pubs/trunk/index.html Message-ID: <20100420215805.C36FC2A6C12C@llvm.org> Author: lattner Date: Tue Apr 20 16:58:05 2010 New Revision: 101946 URL: http://llvm.org/viewvc/llvm-project?rev=101946&view=rev Log: add a blurb. Modified: www-pubs/trunk/index.html Modified: www-pubs/trunk/index.html URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/index.html?rev=101946&r1=101945&r2=101946&view=diff ============================================================================== --- www-pubs/trunk/index.html (original) +++ www-pubs/trunk/index.html Tue Apr 20 16:58:05 2010 @@ -4,6 +4,11 @@
+

Here are some of the publications that use or build on LLVM. This list + generally lags behind publication, if you have a paper for this + please email Chris or commit it + directly to the llvm-pubs SVN module if you have llvm.org commit access.

+