[Reassociate] Canonicalize negative constants out of expressions.
This is a reapplication of r221171, but we only perform the transformation
on expressions which include a multiplication. We do not transform rem/div
operations as this doesn't appear to be safe in all cases.
llvm-svn: 221721
diff --git a/llvm/test/Transforms/Reassociate/basictest.ll b/llvm/test/Transforms/Reassociate/basictest.ll
index d70bfcb..0194ce2 100644
--- a/llvm/test/Transforms/Reassociate/basictest.ll
+++ b/llvm/test/Transforms/Reassociate/basictest.ll
@@ -203,7 +203,7 @@
; CHECK-LABEL: @test14
; CHECK-NEXT: sub i32 %X1, %X2
-; CHECK-NEXT: mul i32 %tmp, 47
+; CHECK-NEXT: mul i32 %B2, 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
new file mode 100644
index 0000000..5ac8a1f
--- /dev/null
+++ b/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll
@@ -0,0 +1,110 @@
+; RUN: opt -reassociate -gvn -S < %s | FileCheck %s
+
+; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)
+define double @test1(double %x, double %y) {
+; CHECK-LABEL: @test1
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fadd double %x, %mul
+; CHECK-NEXT: fsub double %x, %mul
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
+; CHECK-NEXT: ret double %mul
+
+ %mul = fmul double 1.234000e-01, %y
+ %add = fadd double %mul, %x
+ %mul1 = fmul double -1.234000e-01, %y
+ %add2 = fadd double %mul1, %x
+ %mul3 = fmul double %add, %add2
+ ret double %mul3
+}
+
+; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)
+define double @test2(double %x, double %y) {
+; CHECK-LABEL: @test2
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fsub double %x, %mul
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
+; CHECK-NEXT: ret double %mul
+
+ %mul = fmul double %y, -1.234000e-01
+ %add = fadd double %mul, %x
+ %mul1 = fmul double %y, -1.234000e-01
+ %add2 = fadd double %mul1, %x
+ %mul3 = fmul double %add, %add2
+ ret double %mul3
+}
+
+; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)
+define double @test3(double %x, double %y) {
+; CHECK-LABEL: @test3
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fadd double %x, %mul
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
+; CHECK-NEXT: ret double
+
+ %mul = fmul double %y, 1.234000e-01
+ %add = fadd double %mul, %x
+ %mul1 = fmul double %y, -1.234000e-01
+ %add2 = fsub double %x, %mul1
+ %mul3 = fmul double %add, %add2
+ 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
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fadd double %x, %mul
+; CHECK-NEXT: ret double
+
+ %mul = fmul double -1.234000e-01, %y
+ %sub = fsub double %x, %mul
+ ret double %sub
+}
+
+; Don't modify (-0.1234 * y - x)
+define double @test6(double %x, double %y) {
+; CHECK-LABEL: @test6
+; CHECK-NEXT: fmul double -1.234000e-01, %y
+; CHECK-NEXT: fsub double %mul, %x
+; CHECK-NEXT: ret double %sub
+
+ %mul = fmul double -1.234000e-01, %y
+ %sub = fsub double %mul, %x
+ ret double %sub
+}
+
+; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y)
+define double @test7(double %x, double %y) {
+; CHECK-LABEL: @test7
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fsub double %x, %mul
+; CHECK-NEXT: ret double %add
+
+ %mul = fmul double -1.234000e-01, %y
+ %add = fadd double %mul, %x
+ ret double %add
+}
+
+; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y)
+define double @test8(double %x, double %y) {
+; CHECK-LABEL: @test8
+; CHECK-NEXT: fmul double 1.234000e-01, %y
+; CHECK-NEXT: fsub double %x, %mul
+; CHECK-NEXT: ret double %add
+
+ %mul = fmul double %y, -1.234000e-01
+ %add = fadd double %mul, %x
+ ret double %add
+}
diff --git a/llvm/test/Transforms/Reassociate/liftsign.ll b/llvm/test/Transforms/Reassociate/liftsign.ll
deleted file mode 100644
index e8b728c..0000000
--- a/llvm/test/Transforms/Reassociate/liftsign.ll
+++ /dev/null
@@ -1,69 +0,0 @@
-; RUN: opt -reassociate -gvn -S < %s | FileCheck %s
-
-; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)
-; so CSE can simplify it further
-define double @lift_sign1(double %x, double %y) nounwind readnone ssp uwtable {
-; CHECK-LABEL: @lift_sign1(
- %mul = fmul double 1.234000e-01, %y
- %add = fadd double %mul, %x
- %mul1 = fmul double -1.234000e-01, %y
- %add2 = fadd double %mul1, %x
- %mul3 = fmul double %add, %add2
-; CHECK-NOT: %mul1 = fmul double -1.234000e-01, %y
-; CHECK-NOT: %add2 = fadd %mul1, %x
-; CHECK: %add2.repl = fsub double %x, %mul
-; CHECK: %mul3 = fmul double %add, %add2
-ret double %mul3
-}
-
-; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)
-; GVN can then rewrite it even further
-define double @lift_sign2(double %x, double %y) nounwind readnone ssp uwtable {
-; CHECK-LABEL: @lift_sign2(
- %mul = fmul double %y, -1.234000e-01
- %add = fadd double %mul, %x
- %mul1 = fmul double %y, -1.234000e-01
- %add2 = fadd double %mul1, %x
- %mul3 = fmul double %add, %add2
-; CHECK-NOT: %mul = fmul double %y, -1.234000e-01
-; CHECK-NOT: %add = fadd double %mul, %x
-; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01
-; CHECK-NOT: %add2 = fadd double %mul1, %x
-; CHECK-NOT: %mul3 = fmul double %add, %add2
-; CHECK: %mul = fmul double 1.234000e-01, %y
-; CHECK: %add.repl = fsub double %x, %mul
-; CHECK: %mul3 = fmul double %add.repl, %add.repl
- ret double %mul3
-}
-
-; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)
-define double @lift_sign3(double %x, double %y) nounwind readnone ssp uwtable {
-; CHECK-LABEL: @lift_sign3(
- %mul = fmul double %y, 1.234000e-01
- %add = fadd double %mul, %x
- %mul1 = fmul double %y, -1.234000e-01
- %add2 = fsub double %x, %mul1
- %mul3 = fmul double %add, %add2
-; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01
-; CHECK-NOT: %add2 = fsub double %x, %mul1
-; CHECK-NOT: %mul3 = fmul double %add, %add2
-; CHECK: %mul3 = fmul double %add, %add
- ret double %mul3
-}
-
-; (x + 0.1234 / y) * (x + -0.1234 / y) -> (x + 0.1234 / y) * (x - 0.1234 / y)
-; so CSE can simplify it further
-define double @lift_sign4(double %x, double %y) nounwind readnone ssp uwtable {
-; CHECK-LABEL: @lift_sign4(
- %div = fdiv double 1.234000e-01, %y
- %add = fadd double %div, %x
- %div1 = fdiv double -1.234000e-01, %y
- %add2 = fadd double %div1, %x
- %mul3 = fmul double %add, %add2
-; CHECK-NOT: %div1 = fdiv double -1.234000e-01, %y
-; CHECK-NOT: %add2 = fadd double %div1, %x
-; CHECK-NOT: %mul3 = fmul double %add, %add2
-; CHECK: %add2.repl = fsub double %x, %div
-; CHECK: %mul3 = fmul double %add, %add2.repl
- ret double %mul3
-}
diff --git a/llvm/test/Transforms/Reassociate/wrap-flags.ll b/llvm/test/Transforms/Reassociate/wrap-flags.ll
index 7483acd..e3304b6 100644
--- a/llvm/test/Transforms/Reassociate/wrap-flags.ll
+++ b/llvm/test/Transforms/Reassociate/wrap-flags.ll
@@ -5,7 +5,7 @@
; CHECK-LABEL: @shl_to_mul_nsw(
; CHECK: %mul = mul i32 %i, -2147483648
-; CHECK: %mul2 = add i32 %mul, 1
+; CHECK: add i32 %mul, 1
define i32 @shl_to_mul_nsw(i32 %i) {
entry:
%mul = shl nsw i32 %i, 31
@@ -15,7 +15,7 @@
; CHECK-LABEL: @shl_to_mul_nuw(
; CHECK: %mul = mul nuw i32 %i, 4
-; CHECK: %mul2 = add i32 %mul, 1
+; CHECK: add i32 %mul, 1
define i32 @shl_to_mul_nuw(i32 %i) {
entry:
%mul = shl nuw i32 %i, 2
@@ -25,7 +25,7 @@
; CHECK-LABEL: @shl_to_mul_nuw_nsw(
; CHECK: %mul = mul nuw nsw i32 %i, 4
-; CHECK: %mul2 = add i32 %mul, 1
+; CHECK: add i32 %mul, 1
define i32 @shl_to_mul_nuw_nsw(i32 %i) {
entry:
%mul = shl nuw nsw i32 %i, 2