aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-08-02 18:06:01 +0000
committerChris Lattner <sabre@nondot.org>2002-08-02 18:06:01 +0000
commitbe1ecf605074ab035dacf40ce4cf01434fe24edc (patch)
tree68b30ec247924dff2c5697456ab25a8f2d9fbeda /lib/Transforms
parent9ce231f3aecec46902ac9a108c5721a4d9c62a61 (diff)
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
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/GCSE.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/GCSE.cpp b/lib/Transforms/Scalar/GCSE.cpp
index c8f8775976..6aca922811 100644
--- a/lib/Transforms/Scalar/GCSE.cpp
+++ b/lib/Transforms/Scalar/GCSE.cpp
@@ -192,6 +192,34 @@ void GCSE::CommonSubExpressionFound(Instruction *I, Instruction *Other) {
} else if (DomSetInfo->dominates(BB2, BB1)) { // Other dom I?
ReplaceInstWithInst(Other, I);
} 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
// 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_
@@ -215,6 +243,7 @@ void GCSE::CommonSubExpressionFound(Instruction *I, Instruction *Other) {
// Eliminate 'Other' now.
ReplaceInstWithInst(I, Other);
+#endif
}
}