summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorChen Zheng <shchenz@cn.ibm.com>2018-07-11 01:07:21 +0000
committerChen Zheng <shchenz@cn.ibm.com>2018-07-11 01:07:21 +0000
commitfb361d25258b7a9d2387344d0cff7e1722bc2589 (patch)
tree4d8a5f5fb04cc1d429e0bef503d16d5f735047b5 /llvm/test/Transforms
parent6d775a276ac2ea6f9e9def2be0d670e7b12cb586 (diff)
downloadbcm5719-llvm-fb361d25258b7a9d2387344d0cff7e1722bc2589.tar.gz
bcm5719-llvm-fb361d25258b7a9d2387344d0cff7e1722bc2589.zip
[test cases] add test cases for find more abs pattern
Differential Revision: https://reviews.llvm.org/D49123 llvm-svn: 336752
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/abs-1.ll87
1 files changed, 87 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/abs-1.ll b/llvm/test/Transforms/InstCombine/abs-1.ll
index 17b06909ac8..c5e39af34b2 100644
--- a/llvm/test/Transforms/InstCombine/abs-1.ll
+++ b/llvm/test/Transforms/InstCombine/abs-1.ll
@@ -131,6 +131,50 @@ define i32 @abs_canonical_5(i8 %x) {
ret i32 %abs
}
+define i32 @abs_canonical_6(i32 %a, i32 %b) {
+; CHECK-LABEL: @abs_canonical_6(
+; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
+; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]], [[A]]
+; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP1]], i32 [[TMP2]]
+; CHECK-NEXT: ret i32 [[ABS]]
+;
+ %tmp1 = sub i32 %a, %b
+ %cmp = icmp sgt i32 %tmp1, -1
+ %tmp2 = sub i32 %b, %a
+ %abs = select i1 %cmp, i32 %tmp1, i32 %tmp2
+ ret i32 %abs
+}
+
+define <2 x i8> @abs_canonical_7(<2 x i8> %a, <2 x i8 > %b) {
+; CHECK-LABEL: @abs_canonical_7(
+; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[TMP1]], <i8 -1, i8 -1>
+; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> [[B]], [[A]]
+; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP1]], <2 x i8> [[TMP2]]
+; CHECK-NEXT: ret <2 x i8> [[ABS]]
+;
+
+ %tmp1 = sub <2 x i8> %a, %b
+ %cmp = icmp sgt <2 x i8> %tmp1, <i8 -1, i8 -1>
+ %tmp2 = sub <2 x i8> %b, %a
+ %abs = select <2 x i1> %cmp, <2 x i8> %tmp1, <2 x i8> %tmp2
+ ret <2 x i8> %abs
+}
+
+define i32 @abs_canonical_8(i32 %a) {
+; CHECK-LABEL: @abs_canonical_8(
+; CHECK-NEXT: [[TMP:%.*]] = sub i32 0, [[A:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP]], 0
+; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[TMP]]
+; CHECK-NEXT: ret i32 [[ABS]]
+;
+ %tmp = sub i32 0, %a
+ %cmp = icmp slt i32 %tmp, 0
+ %abs = select i1 %cmp, i32 %a, i32 %tmp
+ ret i32 %abs
+}
+
; We have a canonical form of nabs to make CSE easier.
define i8 @nabs_canonical_1(i8 %x) {
@@ -219,6 +263,49 @@ define i32 @nabs_canonical_5(i8 %x) {
ret i32 %abs
}
+define i32 @nabs_canonical_6(i32 %a, i32 %b) {
+; CHECK-LABEL: @nabs_canonical_6(
+; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], -1
+; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[B]], [[A]]
+; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP2]], i32 [[TMP1]]
+; CHECK-NEXT: ret i32 [[ABS]]
+;
+ %tmp1 = sub i32 %a, %b
+ %cmp = icmp sgt i32 %tmp1, -1
+ %tmp2 = sub i32 %b, %a
+ %abs = select i1 %cmp, i32 %tmp2, i32 %tmp1
+ ret i32 %abs
+}
+
+define <2 x i8> @nabs_canonical_7(<2 x i8> %a, <2 x i8 > %b) {
+; CHECK-LABEL: @nabs_canonical_7(
+; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[TMP1]], <i8 -1, i8 -1>
+; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i8> [[B]], [[A]]
+; CHECK-NEXT: [[ABS:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[TMP2]], <2 x i8> [[TMP1]]
+; CHECK-NEXT: ret <2 x i8> [[ABS]]
+;
+ %tmp1 = sub <2 x i8> %a, %b
+ %cmp = icmp sgt <2 x i8> %tmp1, <i8 -1, i8 -1>
+ %tmp2 = sub <2 x i8> %b, %a
+ %abs = select <2 x i1> %cmp, <2 x i8> %tmp2, <2 x i8> %tmp1
+ ret <2 x i8> %abs
+}
+
+define i32 @nabs_canonical_8(i32 %a) {
+; CHECK-LABEL: @nabs_canonical_8(
+; CHECK-NEXT: [[TMP:%.*]] = sub i32 0, [[A:%.*]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP]], 0
+; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[TMP]], i32 [[A]]
+; CHECK-NEXT: ret i32 [[ABS]]
+;
+ %tmp = sub i32 0, %a
+ %cmp = icmp slt i32 %tmp, 0
+ %abs = select i1 %cmp, i32 %tmp, i32 %a
+ ret i32 %abs
+}
+
; The following 5 tests use a shift+add+xor to implement abs():
; B = ashr i8 A, 7 -- smear the sign bit.
; xor (add A, B), B -- add -1 and flip bits if negative
OpenPOWER on IntegriCloud