diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-05-28 06:16:39 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-05-28 06:16:39 +0000 |
| commit | 587336d2ad2f4ff7570e7dbd03d635a826186586 (patch) | |
| tree | 8dc9a4b8087d0448f820c8c271a011dccb4ecb75 /llvm/test | |
| parent | c2a014697a6a6c30f7ea11fc500f03fbfb4ad432 (diff) | |
| download | bcm5719-llvm-587336d2ad2f4ff7570e7dbd03d635a826186586.tar.gz bcm5719-llvm-587336d2ad2f4ff7570e7dbd03d635a826186586.zip | |
[Reassociate] Canonicalizing 'x [+-] (-Constant * y)' isn't always a win
Canonicalizing 'x [+-] (-Constant * y)' is not a win if we don't *know*
we will open up CSE opportunities.
If the multiply was 'nsw', then negating 'y' requires us to clear the
'nsw' flag. If this is actually worth pursuing, it is probably more
appropriate to do so in GVN or EarlyCSE.
This fixes PR23675.
llvm-svn: 238397
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/Reassociate/basictest.ll | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll | 22 |
2 files changed, 12 insertions, 14 deletions
diff --git a/llvm/test/Transforms/Reassociate/basictest.ll b/llvm/test/Transforms/Reassociate/basictest.ll index 015d3b0bee9..caaf7726514 100644 --- a/llvm/test/Transforms/Reassociate/basictest.ll +++ b/llvm/test/Transforms/Reassociate/basictest.ll @@ -202,8 +202,8 @@ define i32 @test14(i32 %X1, i32 %X2) { ret i32 %D ; CHECK-LABEL: @test14 -; CHECK-NEXT: sub i32 %X1, %X2 -; CHECK-NEXT: mul i32 %B2, 47 +; CHECK-NEXT: %[[SUB:.*]] = sub i32 %X1, %X2 +; CHECK-NEXT: mul i32 %[[SUB]], 47 ; CHECK-NEXT: ret i32 } diff --git a/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll b/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll index e85a963f6dd..465460cb53b 100644 --- a/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll +++ b/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll @@ -49,18 +49,6 @@ define double @test3(double %x, double %y) { ret double %mul3 } -; Canonicalize (x - -1234 * y) -define i64 @test4(i64 %x, i64 %y) { -; CHECK-LABEL: @test4 -; CHECK-NEXT: mul i64 %y, 1234 -; CHECK-NEXT: add i64 %mul, %x -; CHECK-NEXT: ret i64 %sub - - %mul = mul i64 %y, -1234 - %sub = sub i64 %x, %mul - ret i64 %sub -} - ; Canonicalize (x - -0.1234 * y) define double @test5(double %x, double %y) { ; CHECK-LABEL: @test5 @@ -156,3 +144,13 @@ define double @test12(double %x, double %y) { %add = fadd double %div, %x ret double %add } + +; Don't create an NSW violation +define i4 @test13(i4 %x) { +; CHECK-LABEL: @test13 +; CHECK-NEXT: %[[mul:.*]] = mul nsw i4 %x, -2 +; CHECK-NEXT: %[[add:.*]] = add i4 %[[mul]], 3 + %mul = mul nsw i4 %x, -2 + %add = add i4 %mul, 3 + ret i4 %add +} |

