summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2019-12-04 15:48:19 +0300
committerRoman Lebedev <lebedev.ri@gmail.com>2019-12-04 15:49:36 +0300
commitcd04e8349bde1a528e726e75041cbe58b73fdf99 (patch)
tree24630c27ec8f3430dbb7a05d914103a2bd4733cb
parente6522a96f56ce0257ab8cc6fca77bf9ea4462fa6 (diff)
downloadbcm5719-llvm-cd04e8349bde1a528e726e75041cbe58b73fdf99.tar.gz
bcm5719-llvm-cd04e8349bde1a528e726e75041cbe58b73fdf99.zip
[NFC][InstCombine] Update sub-of-negatible.ll test
-rw-r--r--llvm/test/Transforms/InstCombine/sub-of-negatible.ll159
1 files changed, 122 insertions, 37 deletions
diff --git a/llvm/test/Transforms/InstCombine/sub-of-negatible.ll b/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
index 2d991035268..01084312c9f 100644
--- a/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
+++ b/llvm/test/Transforms/InstCombine/sub-of-negatible.ll
@@ -155,51 +155,28 @@ define i8 @n8(i8 %x, i1 %y, i8 %z) {
ret i8 %t2
}
-; Subtraction can be negated if the first operand can be negated
-; x - (y - z) -> x - y + z -> x + (-y) + z
-define i8 @t9(i8 %x, i8 %y, i8 %z) {
+; Subtraction can be negated by swapping its operands.
+; x - (y - z) -> x - y + z -> x + (z - y)
+define i8 @t9(i8 %x, i8 %y) {
; CHECK-LABEL: @t9(
-; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Z:%.*]]
-; CHECK-NEXT: call void @use8(i8 [[T0]])
-; CHECK-NEXT: [[T11:%.*]] = add i8 [[Y:%.*]], [[Z]]
-; CHECK-NEXT: [[T2:%.*]] = add i8 [[T11]], [[X:%.*]]
-; CHECK-NEXT: ret i8 [[T2]]
+; CHECK-NEXT: [[T01:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: ret i8 [[T01]]
;
- %t0 = sub i8 0, %z
- call void @use8(i8 %t0)
- %t1 = sub i8 %t0, %y
- %t2 = sub i8 %x, %t1
- ret i8 %t2
+ %t0 = sub i8 %y, %x
+ %t1 = sub i8 0, %t0
+ ret i8 %t1
}
define i8 @n10(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: @n10(
-; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Z:%.*]]
-; CHECK-NEXT: call void @use8(i8 [[T0]])
-; CHECK-NEXT: [[T1:%.*]] = sub i8 [[T0]], [[Y:%.*]]
-; CHECK-NEXT: call void @use8(i8 [[T1]])
-; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
-; CHECK-NEXT: ret i8 [[T2]]
-;
- %t0 = sub i8 0, %z
- call void @use8(i8 %t0)
- %t1 = sub i8 %t0, %y
- call void @use8(i8 %t1)
- %t2 = sub i8 %x, %t1
- ret i8 %t2
-}
-define i8 @n11(i8 %x, i8 %y, i8 %z) {
-; CHECK-LABEL: @n11(
-; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Z:%.*]]
+; CHECK-NEXT: [[T0:%.*]] = sub i8 [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: call void @use8(i8 [[T0]])
-; CHECK-NEXT: [[T1:%.*]] = add i8 [[Y:%.*]], [[Z]]
-; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
-; CHECK-NEXT: ret i8 [[T2]]
+; CHECK-NEXT: [[T1:%.*]] = sub i8 0, [[T0]]
+; CHECK-NEXT: ret i8 [[T1]]
;
- %t0 = sub i8 0, %z
+ %t0 = sub i8 %y, %x
call void @use8(i8 %t0)
- %t1 = sub i8 %y, %t0
- %t2 = sub i8 %x, %t1
- ret i8 %t2
+ %t1 = sub i8 0, %t0
+ ret i8 %t1
}
; Addition can be negated if both operands can be negated
@@ -290,3 +267,111 @@ define i8 @n16(i8 %x, i8 %y, i8 %z) {
%t2 = sub i8 %x, %t1
ret i8 %t2
}
+
+; Phi can be negated if all incoming values can be negated
+define i8 @t16(i1 %c, i8 %x) {
+; CHECK-LABEL: @t16(
+; CHECK-NEXT: begin:
+; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK: then:
+; CHECK-NEXT: br label [[END:%.*]]
+; CHECK: else:
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: [[Z:%.*]] = phi i8 [ [[X:%.*]], [[THEN]] ], [ 42, [[ELSE]] ]
+; CHECK-NEXT: ret i8 [[Z]]
+;
+begin:
+ br i1 %c, label %then, label %else
+then:
+ %y = sub i8 0, %x
+ br label %end
+else:
+ br label %end
+end:
+ %z = phi i8 [ %y, %then], [ -42, %else ]
+ %n = sub i8 0, %z
+ ret i8 %n
+}
+define i8 @n17(i1 %c, i8 %x) {
+; CHECK-LABEL: @n17(
+; CHECK-NEXT: begin:
+; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK: then:
+; CHECK-NEXT: [[Y:%.*]] = sub i8 0, [[X:%.*]]
+; CHECK-NEXT: br label [[END:%.*]]
+; CHECK: else:
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: [[Z:%.*]] = phi i8 [ [[Y]], [[THEN]] ], [ -42, [[ELSE]] ]
+; CHECK-NEXT: call void @use8(i8 [[Z]])
+; CHECK-NEXT: [[N:%.*]] = sub i8 0, [[Z]]
+; CHECK-NEXT: ret i8 [[N]]
+;
+begin:
+ br i1 %c, label %then, label %else
+then:
+ %y = sub i8 0, %x
+ br label %end
+else:
+ br label %end
+end:
+ %z = phi i8 [ %y, %then], [ -42, %else ]
+ call void @use8(i8 %z)
+ %n = sub i8 0, %z
+ ret i8 %n
+}
+define i8 @n19(i1 %c, i8 %x, i8 %y) {
+; CHECK-LABEL: @n19(
+; CHECK-NEXT: begin:
+; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK: then:
+; CHECK-NEXT: [[Z:%.*]] = sub i8 0, [[X:%.*]]
+; CHECK-NEXT: br label [[END:%.*]]
+; CHECK: else:
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: [[R:%.*]] = phi i8 [ [[Z]], [[THEN]] ], [ [[Y:%.*]], [[ELSE]] ]
+; CHECK-NEXT: [[N:%.*]] = sub i8 0, [[R]]
+; CHECK-NEXT: ret i8 [[N]]
+;
+begin:
+ br i1 %c, label %then, label %else
+then:
+ %z = sub i8 0, %x
+ br label %end
+else:
+ br label %end
+end:
+ %r = phi i8 [ %z, %then], [ %y, %else ]
+ %n = sub i8 0, %r
+ ret i8 %n
+}
+
+; truncation can be negated if it's operand can be negated
+define i8 @t20(i8 %x, i16 %y) {
+; CHECK-LABEL: @t20(
+; CHECK-NEXT: [[T0:%.*]] = shl i16 -42, [[Y:%.*]]
+; CHECK-NEXT: [[T1:%.*]] = trunc i16 [[T0]] to i8
+; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
+; CHECK-NEXT: ret i8 [[T2]]
+;
+ %t0 = shl i16 -42, %y
+ %t1 = trunc i16 %t0 to i8
+ %t2 = sub i8 %x, %t1
+ ret i8 %t2
+}
+define i8 @n21(i8 %x, i16 %y) {
+; CHECK-LABEL: @n21(
+; CHECK-NEXT: [[T0:%.*]] = shl i16 -42, [[Y:%.*]]
+; CHECK-NEXT: [[T1:%.*]] = trunc i16 [[T0]] to i8
+; CHECK-NEXT: call void @use8(i8 [[T1]])
+; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
+; CHECK-NEXT: ret i8 [[T2]]
+;
+ %t0 = shl i16 -42, %y
+ %t1 = trunc i16 %t0 to i8
+ call void @use8(i8 %t1)
+ %t2 = sub i8 %x, %t1
+ ret i8 %t2
+}
OpenPOWER on IntegriCloud