[llvm-commits] [llvm] r52447 - in /llvm/trunk/tools/lto2: LTOCodeGenerator.cpp LTOModule.cpp

Bill Wendling isanbard at gmail.com
Tue Jun 17 23:35:30 PDT 2008


Author: void
Date: Wed Jun 18 01:35:30 2008
New Revision: 52447

URL: http://llvm.org/viewvc/llvm-project?rev=52447&view=rev
Log:
If compiling for PPC on an i386 box, the LTO wouldn't get the altivec (and
other) feature information. The workaround is inelegant and could be cleaned up
if this information were available some other way (say, in the IR).


Modified:
    llvm/trunk/tools/lto2/LTOCodeGenerator.cpp
    llvm/trunk/tools/lto2/LTOModule.cpp

Modified: llvm/trunk/tools/lto2/LTOCodeGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto2/LTOCodeGenerator.cpp?rev=52447&r1=52446&r2=52447&view=diff

==============================================================================
--- llvm/trunk/tools/lto2/LTOCodeGenerator.cpp (original)
+++ llvm/trunk/tools/lto2/LTOCodeGenerator.cpp Wed Jun 18 01:35:30 2008
@@ -32,6 +32,7 @@
 #include "llvm/Analysis/Verifier.h"
 #include "llvm/Analysis/LoadValueNumbering.h"
 #include "llvm/CodeGen/FileWriters.h"
+#include "llvm/Target/SubtargetFeature.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
@@ -261,8 +262,24 @@
                                                        *mergedModule, errMsg);
         if ( march == NULL )
             return true;
-        std::string features;
-        _target = march->CtorFn(*mergedModule, features);
+
+        // construct LTModule, hand over ownership of module and target
+        //
+        // FIXME: This is an inelegant way of specifying the features of a
+        // subtarget. It would be better if we could encode this information
+        // into the IR. See <rdar://5972456>.
+        SubtargetFeatures Features;
+        std::string FeatureStr;
+        std::string TargetTriple = _linker.getModule()->getTargetTriple();
+
+        if (strncmp(TargetTriple.c_str(), "powerpc-apple-", 14) == 0) {
+          Features.AddFeature("altivec", true);
+        } else if (strncmp(TargetTriple.c_str(), "powerpc64-apple-", 16) == 0) {
+          Features.AddFeature("64bit", true);
+          Features.AddFeature("altivec", true);
+        }
+
+        _target = march->CtorFn(*mergedModule, Features.getString());
     }
     return false;
 }
@@ -302,7 +319,6 @@
     }
 }
 
-
 /// Optimize merged modules using various IPO passes
 bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errMsg)
 {
@@ -360,12 +376,9 @@
     // function pointers.  When this happens, we often have to resolve varargs
     // calls, etc, so let instcombine do this.
     passes.add(createInstructionCombiningPass());
-
-    passes.add(createFunctionInliningPass()); // Inline small functions
-
-    passes.add(createPruneEHPass());            // Remove dead EH info
-
-    passes.add(createGlobalDCEPass());          // Remove dead functions
+    passes.add(createFunctionInliningPass());     // Inline small functions
+    passes.add(createPruneEHPass());              // Remove dead EH info
+    passes.add(createGlobalDCEPass());            // Remove dead functions
 
     // If we didn't decide to inline a function, check to see if we can
     // transform it to pass arguments by value instead of by reference.
@@ -377,16 +390,14 @@
     passes.add(createScalarReplAggregatesPass()); // Break up allocas
 
     // Run a few AA driven optimizations here and now, to cleanup the code.
-    passes.add(createGlobalsModRefPass());      // IP alias analysis
-
-    passes.add(createLICMPass());               // Hoist loop invariants
-    passes.add(createGVNPass());               // Remove common subexprs
-    passes.add(createMemCpyOptPass());  // Remove dead memcpy's
+    passes.add(createGlobalsModRefPass());        // IP alias analysis
+    passes.add(createLICMPass());                 // Hoist loop invariants
+    passes.add(createGVNPass());                  // Remove common subexprs
+    passes.add(createMemCpyOptPass());            // Remove dead memcpy's
     passes.add(createDeadStoreEliminationPass()); // Nuke dead stores
 
     // Cleanup and simplify the code after the scalar optimizations.
     passes.add(createInstructionCombiningPass());
-
     passes.add(createJumpThreadingPass());        // Thread jumps.
 
     // Delete basic blocks, which optimization passes may have killed...
@@ -431,13 +442,13 @@
 
     // Run the code generator, and write assembly file
     codeGenPasses->doInitialization();
-    for (Module::iterator it = mergedModule->begin(),
-                e = mergedModule->end(); it != e; ++it) {
-        if (!it->isDeclaration())
-            codeGenPasses->run(*it);
-    }
-    codeGenPasses->doFinalization();
 
+    for (Module::iterator
+           it = mergedModule->begin(), e = mergedModule->end(); it != e; ++it)
+      if (!it->isDeclaration())
+        codeGenPasses->run(*it);
+
+    codeGenPasses->doFinalization();
     return false; // success
 }
 

Modified: llvm/trunk/tools/lto2/LTOModule.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto2/LTOModule.cpp?rev=52447&r1=52446&r2=52447&view=diff

==============================================================================
--- llvm/trunk/tools/lto2/LTOModule.cpp (original)
+++ llvm/trunk/tools/lto2/LTOModule.cpp Wed Jun 18 01:35:30 2008
@@ -24,11 +24,11 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/System/Path.h"
 #include "llvm/System/Process.h"
+#include "llvm/Target/SubtargetFeature.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetMachineRegistry.h"
 #include "llvm/Target/TargetAsmInfo.h"
 
-
 #include <fstream>
 
 using namespace llvm;
@@ -125,11 +125,27 @@
     // find machine architecture for this module
     const TargetMachineRegistry::entry* march = 
             TargetMachineRegistry::getClosestStaticTargetForModule(*m, errMsg);
+
     if ( march == NULL ) 
         return NULL;
+
     // construct LTModule, hand over ownership of module and target
-    std::string     features;
-    TargetMachine*  target = march->CtorFn(*m, features);
+    //
+    // FIXME: This is an inelegant way of specifying the features of a
+    // subtarget. It would be better if we could encode this information into
+    // the IR. See <rdar://5972456>.
+    SubtargetFeatures Features;
+    std::string FeatureStr;
+    const char *TargetTriple = m->getTargetTriple().c_str();
+
+    if (strncmp(TargetTriple, "powerpc-apple-", 14) == 0) {
+      Features.AddFeature("altivec", true);
+    } else if (strncmp(TargetTriple, "powerpc64-apple-", 16) == 0) {
+      Features.AddFeature("64bit", true);
+      Features.AddFeature("altivec", true);
+    }
+
+    TargetMachine* target = march->CtorFn(*m, Features.getString());
     return new LTOModule(m.take(), target);
 }
 





More information about the llvm-commits mailing list