summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorAlexandros Lamprineas <alexandros.lamprineas@arm.com>2018-11-09 11:09:40 +0000
committerAlexandros Lamprineas <alexandros.lamprineas@arm.com>2018-11-09 11:09:40 +0000
commite15c982f6d6ae355d8fbf9c9272ac549785b68e2 (patch)
treec71b0cd236625b81cd79828b2ddb2cff38606b63 /llvm/test
parent52578f95c9fcf7b85beea921d401f49b2f6e9d1d (diff)
downloadbcm5719-llvm-e15c982f6d6ae355d8fbf9c9272ac549785b68e2.tar.gz
bcm5719-llvm-e15c982f6d6ae355d8fbf9c9272ac549785b68e2.zip
[SelectionDAG] swap select_cc operands to enable folding
The DAGCombiner tries to SimplifySelectCC as follows: select_cc(x, y, 16, 0, cc) -> shl(zext(set_cc(x, y, cc)), 4) It can't cope with the situation of reordered operands: select_cc(x, y, 0, 16, cc) In that case we just need to swap the operands and invert the Condition Code: select_cc(x, y, 16, 0, ~cc) Differential Revision: https://reviews.llvm.org/D53236 llvm-svn: 346484
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/AArch64/select_cc.ll54
-rw-r--r--llvm/test/CodeGen/Thumb/branchless-cmp.ll16
2 files changed, 59 insertions, 11 deletions
diff --git a/llvm/test/CodeGen/AArch64/select_cc.ll b/llvm/test/CodeGen/AArch64/select_cc.ll
new file mode 100644
index 00000000000..785e6b800ed
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/select_cc.ll
@@ -0,0 +1,54 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=aarch64 | FileCheck %s
+
+define i64 @select_ogt_float(float %a, float %b) {
+; CHECK-LABEL: select_ogt_float:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: fcmp s0, s1
+; CHECK-NEXT: cset w8, gt
+; CHECK-NEXT: lsl x0, x8, #2
+; CHECK-NEXT: ret
+entry:
+ %cc = fcmp ogt float %a, %b
+ %sel = select i1 %cc, i64 4, i64 0
+ ret i64 %sel
+}
+
+define i64 @select_ule_float_inverse(float %a, float %b) {
+; CHECK-LABEL: select_ule_float_inverse:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: fcmp s0, s1
+; CHECK-NEXT: cset w8, gt
+; CHECK-NEXT: lsl x0, x8, #2
+; CHECK-NEXT: ret
+entry:
+ %cc = fcmp ule float %a, %b
+ %sel = select i1 %cc, i64 0, i64 4
+ ret i64 %sel
+}
+
+define i64 @select_eq_i32(i32 %a, i32 %b) {
+; CHECK-LABEL: select_eq_i32:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: cmp w0, w1
+; CHECK-NEXT: cset w8, eq
+; CHECK-NEXT: lsl x0, x8, #2
+; CHECK-NEXT: ret
+entry:
+ %cc = icmp eq i32 %a, %b
+ %sel = select i1 %cc, i64 4, i64 0
+ ret i64 %sel
+}
+
+define i64 @select_ne_i32_inverse(i32 %a, i32 %b) {
+; CHECK-LABEL: select_ne_i32_inverse:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: cmp w0, w1
+; CHECK-NEXT: cset w8, eq
+; CHECK-NEXT: lsl x0, x8, #2
+; CHECK-NEXT: ret
+entry:
+ %cc = icmp ne i32 %a, %b
+ %sel = select i1 %cc, i64 0, i64 4
+ ret i64 %sel
+}
diff --git a/llvm/test/CodeGen/Thumb/branchless-cmp.ll b/llvm/test/CodeGen/Thumb/branchless-cmp.ll
index ed34d630733..40c5b8853da 100644
--- a/llvm/test/CodeGen/Thumb/branchless-cmp.ll
+++ b/llvm/test/CodeGen/Thumb/branchless-cmp.ll
@@ -74,23 +74,17 @@ entry:
; CHECK-NEXT: lsls r0, r1, #2
}
-; FIXME: This one hasn't changed actually
-; but could look like test3b
define i32 @test4a(i32 %a, i32 %b) {
entry:
%cmp = icmp ne i32 %a, %b
%cond = select i1 %cmp, i32 0, i32 4
ret i32 %cond
; CHECK-LABEL: test4a:
-; CHECK: bb.0:
-; CHECK-NEXT: cmp r0, r1
-; CHECK-NEXT: bne .LBB6_2
-; CHECK-NEXT: bb.1:
-; CHECK-NEXT: movs r0, #4
-; CHECK-NEXT: bx lr
-; CHECK-NEXT: .LBB6_2:
-; CHECK-NEXT: movs r0, #0
-; CHECK-NEXT: bx lr
+; CHECK-NOT: b{{(ne)|(eq)}}
+; CHECK: subs r0, r0, r1
+; CHECK-NEXT: rsbs r1, r0, #0
+; CHECK-NEXT: adcs r1, r0
+; CHECK-NEXT: lsls r0, r1, #2
}
define i32 @test4b(i32 %a, i32 %b) {
OpenPOWER on IntegriCloud