Fix the predicate which checks for non-sensical formulae which have
authorDan Gohman <gohman@apple.com>
Tue, 18 May 2010 23:48:08 +0000 (23:48 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 18 May 2010 23:48:08 +0000 (23:48 +0000)
constants in registers which partially cancel out their immediate fields.

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

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 6bab98bab770227db3a1122cabeadee0e42e14d9..921f0b9638bbfd1de2fde4026ed066df15fd2086 100644 (file)
@@ -2572,10 +2572,11 @@ void LSRInstance::GenerateCrossUseConstantOffsets() {
                J = NewF.BaseRegs.begin(), JE = NewF.BaseRegs.end();
                J != JE; ++J)
             if (const SCEVConstant *C = dyn_cast<SCEVConstant>(*J))
-              if (C->getValue()->getValue().isNegative() !=
-                    (NewF.AM.BaseOffs < 0) &&
-                  C->getValue()->getValue().abs()
-                    .ule(abs64(NewF.AM.BaseOffs)))
+              if ((C->getValue()->getValue() + NewF.AM.BaseOffs).abs().slt(
+                   abs64(NewF.AM.BaseOffs)) &&
+                  (C->getValue()->getValue() +
+                   NewF.AM.BaseOffs).countTrailingZeros() >=
+                   CountTrailingZeros_64(NewF.AM.BaseOffs))
                 goto skip_formula;
 
           // Ok, looks good.