1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
4 # Test that we can produce a TBNZ when we have a slt compare against 0.
6 # The bit tested should be the size of the test register minus 1.
16 ; CHECK-LABEL: name: tbnzx_slt
18 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000)
19 ; CHECK: %copy:gpr64 = COPY $x0
20 ; CHECK: TBNZX %copy, 63, %bb.1
25 successors: %bb.0, %bb.1
27 %copy:gpr(s64) = COPY $x0
28 %zero:gpr(s64) = G_CONSTANT i64 0
29 %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s64), %zero
30 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
31 G_BRCOND %cmp_trunc(s1), %bb.1
43 ; CHECK-LABEL: name: tbnzw_slt
45 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000)
46 ; CHECK: %copy:gpr32 = COPY $w0
47 ; CHECK: TBNZW %copy, 31, %bb.1
52 successors: %bb.0, %bb.1
54 %copy:gpr(s32) = COPY $w0
55 %zero:gpr(s32) = G_CONSTANT i32 0
56 %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s32), %zero
57 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
58 G_BRCOND %cmp_trunc(s1), %bb.1
65 name: no_tbnz_not_zero
70 ; CHECK-LABEL: name: no_tbnz_not_zero
72 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000)
73 ; CHECK: %copy:gpr32sp = COPY $w0
74 ; CHECK: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri %copy, 1, 0, implicit-def $nzcv
75 ; CHECK: Bcc 11, %bb.1, implicit $nzcv
80 successors: %bb.0, %bb.1
82 %copy:gpr(s32) = COPY $w0
83 %one:gpr(s32) = G_CONSTANT i32 1
84 %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s32), %one
85 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
86 G_BRCOND %cmp_trunc(s1), %bb.1
98 ; CHECK-LABEL: name: dont_fold_and
100 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000)
101 ; CHECK: %copy:gpr64 = COPY $x0
102 ; CHECK: [[ANDSXri:%[0-9]+]]:gpr64 = ANDSXri %copy, 8000, implicit-def $nzcv
103 ; CHECK: Bcc 11, %bb.1, implicit $nzcv
106 ; CHECK: RET_ReallyLR
108 successors: %bb.0, %bb.1
110 %copy:gpr(s64) = COPY $x0
111 %bit:gpr(s64) = G_CONSTANT i64 8
112 %zero:gpr(s64) = G_CONSTANT i64 0
113 %c:gpr(s64) = G_CONSTANT i64 8
114 %and:gpr(s64) = G_AND %copy, %bit
115 %cmp:gpr(s32) = G_ICMP intpred(slt), %and(s64), %zero
116 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
117 G_BRCOND %cmp_trunc(s1), %bb.1
127 regBankSelected: true
129 ; CHECK-LABEL: name: dont_commute
131 ; CHECK: successors: %bb.0(0x40000000), %bb.1(0x40000000)
132 ; CHECK: %copy:gpr64 = COPY $x0
133 ; CHECK: %zero:gpr64 = COPY $xzr
134 ; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %zero, %copy, implicit-def $nzcv
135 ; CHECK: Bcc 11, %bb.1, implicit $nzcv
138 ; CHECK: RET_ReallyLR
140 successors: %bb.0, %bb.1
142 %copy:gpr(s64) = COPY $x0
143 %zero:gpr(s64) = G_CONSTANT i64 0
144 %cmp:gpr(s32) = G_ICMP intpred(slt), %zero, %copy(s64)
145 %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
146 G_BRCOND %cmp_trunc(s1), %bb.1