diff options
| author | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2018-11-09 11:09:40 +0000 |
|---|---|---|
| committer | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2018-11-09 11:09:40 +0000 |
| commit | e15c982f6d6ae355d8fbf9c9272ac549785b68e2 (patch) | |
| tree | c71b0cd236625b81cd79828b2ddb2cff38606b63 /llvm/test | |
| parent | 52578f95c9fcf7b85beea921d401f49b2f6e9d1d (diff) | |
| download | bcm5719-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.ll | 54 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb/branchless-cmp.ll | 16 |
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) { |

