diff options
author | Chris Lattner <sabre@nondot.org> | 2002-08-02 18:06:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-08-02 18:06:01 +0000 |
commit | be1ecf605074ab035dacf40ce4cf01434fe24edc (patch) | |
tree | 68b30ec247924dff2c5697456ab25a8f2d9fbeda /lib/Transforms | |
parent | 9ce231f3aecec46902ac9a108c5721a4d9c62a61 (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.cpp | 29 |
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 } } |