Disambiguate symbols after loop extraction so that we can diagnose a code
authorChris Lattner <sabre@nondot.org>
Sun, 11 Apr 2004 23:52:35 +0000 (23:52 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Apr 2004 23:52:35 +0000 (23:52 +0000)
generator bug if multiple loops are extracted from a function.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12847 91177308-0d34-0410-b5e6-96231b3b80d8

tools/bugpoint/Miscompilation.cpp

index fddbebddfe7274e103c7160c873683de45ca33cc..7c82b582eff5df067fab206697c6439e76f057eb 100644 (file)
@@ -201,6 +201,19 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*>&Funcs){
   return TestFn(BD, ToOptimize, ToNotOptimize);
 }
 
+static void DisambiguateGlobalSymbols(Module *M) {
+  // Try not to cause collisions by minimizing chances of renaming an
+  // already-external symbol, so take in external globals and functions as-is.
+  // The code should work correctly without disambiguation (assuming the same
+  // mangler is used by the two code generators), but having symbols with the
+  // same name causes warnings to be emitted by the code generator.
+  Mangler Mang(*M);
+  for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
+    I->setName(Mang.getValueName(I));
+  for (Module::iterator  I = M->begin(),  E = M->end();  I != E; ++I)
+    I->setName(Mang.getValueName(I));
+}
+
 /// ExtractLoops - Given a reduced list of functions that still exposed the bug,
 /// check to see if we can extract the loops in the region without obscuring the
 /// bug.  If so, it reduces the amount of code identified.
@@ -321,6 +334,11 @@ DebugAMiscompilation(BugDriver &BD,
     // Okay, we extracted some loops and the problem still appears.  See if we
     // can eliminate some of the created functions from being candidates.
 
+    // Loop extraction can introduce functions with the same name (foo_code).
+    // Make sure to disambiguate the symbols so that when the program is split
+    // apart that we can link it back together again.
+    DisambiguateGlobalSymbols(BD.getProgram());
+
     // Do the reduction...
     ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions);
     
@@ -549,22 +567,6 @@ static bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) {
 }
 
 
-
-static void DisambiguateGlobalSymbols(Module *M) {
-  // Try not to cause collisions by minimizing chances of renaming an
-  // already-external symbol, so take in external globals and functions as-is.
-  // The code should work correctly without disambiguation (assuming the same
-  // mangler is used by the two code generators), but having symbols with the
-  // same name causes warnings to be emitted by the code generator.
-  Mangler Mang(*M);
-  for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
-    I->setName(Mang.getValueName(I));
-  for (Module::iterator  I = M->begin(),  E = M->end();  I != E; ++I)
-    I->setName(Mang.getValueName(I));
-}
-
-
-
 bool BugDriver::debugCodeGenerator() {
   if ((void*)cbe == (void*)Interpreter) {
     std::string Result = executeProgramWithCBE("bugpoint.cbe.out");