mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Disambiguate symbols after loop extraction so that we can diagnose a code
generator bug if multiple loops are extracted from a function. llvm-svn: 12847
This commit is contained in:
parent
24f8b11206
commit
903a90b9de
@ -201,6 +201,19 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*>&Funcs){
|
|||||||
return TestFn(BD, ToOptimize, ToNotOptimize);
|
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,
|
/// 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
|
/// 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.
|
/// 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
|
// Okay, we extracted some loops and the problem still appears. See if we
|
||||||
// can eliminate some of the created functions from being candidates.
|
// 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...
|
// Do the reduction...
|
||||||
ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions);
|
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() {
|
bool BugDriver::debugCodeGenerator() {
|
||||||
if ((void*)cbe == (void*)Interpreter) {
|
if ((void*)cbe == (void*)Interpreter) {
|
||||||
std::string Result = executeProgramWithCBE("bugpoint.cbe.out");
|
std::string Result = executeProgramWithCBE("bugpoint.cbe.out");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user