mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Fix bug: test/Regression/Transforms/GCSE/2002-05-21-NoSharedDominator.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3215 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ce231f3ae
commit
be1ecf6050
@ -192,6 +192,34 @@ void GCSE::CommonSubExpressionFound(Instruction *I, Instruction *Other) {
|
|||||||
} else if (DomSetInfo->dominates(BB2, BB1)) { // Other dom I?
|
} else if (DomSetInfo->dominates(BB2, BB1)) { // Other dom I?
|
||||||
ReplaceInstWithInst(Other, I);
|
ReplaceInstWithInst(Other, I);
|
||||||
} else {
|
} else {
|
||||||
|
// This code is disabled because it has several problems:
|
||||||
|
// One, the actual assumption is wrong, as shown by this code:
|
||||||
|
// int "test"(int %X, int %Y) {
|
||||||
|
// %Z = add int %X, %Y
|
||||||
|
// ret int %Z
|
||||||
|
// Unreachable:
|
||||||
|
// %Q = add int %X, %Y
|
||||||
|
// ret int %Q
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Here there are no shared dominators. Additionally, this had the habit of
|
||||||
|
// moving computations where they were not always computed. For example, in
|
||||||
|
// a cast like this:
|
||||||
|
// if (c) {
|
||||||
|
// if (d) ...
|
||||||
|
// else ... X+Y ...
|
||||||
|
// } else {
|
||||||
|
// ... X+Y ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// In thiscase, the expression would be hoisted to outside the 'if' stmt,
|
||||||
|
// causing the expression to be evaluated, even for the if (d) path, which
|
||||||
|
// could cause problems, if, for example, it caused a divide by zero. In
|
||||||
|
// general the problem this case is trying to solve is better addressed with
|
||||||
|
// PRE than GCSE.
|
||||||
|
//
|
||||||
|
|
||||||
|
#if 0
|
||||||
// Handle the most general case now. In this case, neither I dom Other nor
|
// Handle the most general case now. In this case, neither I dom Other nor
|
||||||
// Other dom I. Because we are in SSA form, we are guaranteed that the
|
// Other dom I. Because we are in SSA form, we are guaranteed that the
|
||||||
// operands of the two instructions both dominate the uses, so we _know_
|
// operands of the two instructions both dominate the uses, so we _know_
|
||||||
@ -215,6 +243,7 @@ void GCSE::CommonSubExpressionFound(Instruction *I, Instruction *Other) {
|
|||||||
|
|
||||||
// Eliminate 'Other' now.
|
// Eliminate 'Other' now.
|
||||||
ReplaceInstWithInst(I, Other);
|
ReplaceInstWithInst(I, Other);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user