7d45abd8152cc0df9c648a0d8b7d47f1c409e614
[platform/upstream/llvm.git] / llvm / test / CodeGen / AArch64 / GlobalISel / tbnz-slt.mir
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
3 #
4 # Test that we can produce a TBNZ when we have a slt compare against 0.
5 #
6 # The bit tested should be the size of the test register minus 1.
7 #
8
9 ...
10 ---
11 name:            tbnzx_slt
12 alignment:       4
13 legalized:       true
14 regBankSelected: true
15 body:             |
16   ; CHECK-LABEL: name: tbnzx_slt
17   ; CHECK: bb.0:
18   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
19   ; CHECK-NEXT: {{  $}}
20   ; CHECK-NEXT:   %copy:gpr64 = COPY $x0
21   ; CHECK-NEXT:   TBNZX %copy, 63, %bb.1
22   ; CHECK-NEXT:   B %bb.0
23   ; CHECK-NEXT: {{  $}}
24   ; CHECK-NEXT: bb.1:
25   ; CHECK-NEXT:   RET_ReallyLR
26   bb.0:
27     successors: %bb.0, %bb.1
28     liveins: $x0
29     %copy:gpr(s64) = COPY $x0
30     %zero:gpr(s64) = G_CONSTANT i64 0
31     %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s64), %zero
32     %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
33     G_BRCOND %cmp_trunc(s1), %bb.1
34     G_BR %bb.0
35   bb.1:
36     RET_ReallyLR
37
38 ...
39 ---
40 name:            tbnzw_slt
41 alignment:       4
42 legalized:       true
43 regBankSelected: true
44 body:             |
45   ; CHECK-LABEL: name: tbnzw_slt
46   ; CHECK: bb.0:
47   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
48   ; CHECK-NEXT: {{  $}}
49   ; CHECK-NEXT:   %copy:gpr32 = COPY $w0
50   ; CHECK-NEXT:   TBNZW %copy, 31, %bb.1
51   ; CHECK-NEXT:   B %bb.0
52   ; CHECK-NEXT: {{  $}}
53   ; CHECK-NEXT: bb.1:
54   ; CHECK-NEXT:   RET_ReallyLR
55   bb.0:
56     successors: %bb.0, %bb.1
57     liveins: $x0
58     %copy:gpr(s32) = COPY $w0
59     %zero:gpr(s32) = G_CONSTANT i32 0
60     %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s32), %zero
61     %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
62     G_BRCOND %cmp_trunc(s1), %bb.1
63     G_BR %bb.0
64   bb.1:
65     RET_ReallyLR
66
67 ...
68 ---
69 name:            no_tbnz_not_zero
70 alignment:       4
71 legalized:       true
72 regBankSelected: true
73 body:             |
74   ; CHECK-LABEL: name: no_tbnz_not_zero
75   ; CHECK: bb.0:
76   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
77   ; CHECK-NEXT: {{  $}}
78   ; CHECK-NEXT:   %copy:gpr32sp = COPY $w0
79   ; CHECK-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri %copy, 1, 0, implicit-def $nzcv
80   ; CHECK-NEXT:   Bcc 11, %bb.1, implicit $nzcv
81   ; CHECK-NEXT:   B %bb.0
82   ; CHECK-NEXT: {{  $}}
83   ; CHECK-NEXT: bb.1:
84   ; CHECK-NEXT:   RET_ReallyLR
85   bb.0:
86     successors: %bb.0, %bb.1
87     liveins: $x0
88     %copy:gpr(s32) = COPY $w0
89     %one:gpr(s32) = G_CONSTANT i32 1
90     %cmp:gpr(s32) = G_ICMP intpred(slt), %copy(s32), %one
91     %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
92     G_BRCOND %cmp_trunc(s1), %bb.1
93     G_BR %bb.0
94   bb.1:
95     RET_ReallyLR
96
97 ...
98 ---
99 name:            dont_fold_and
100 alignment:       4
101 legalized:       true
102 regBankSelected: true
103 body:             |
104   ; CHECK-LABEL: name: dont_fold_and
105   ; CHECK: bb.0:
106   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
107   ; CHECK-NEXT: {{  $}}
108   ; CHECK-NEXT:   %copy:gpr64 = COPY $x0
109   ; CHECK-NEXT:   [[ANDSXri:%[0-9]+]]:gpr64 = ANDSXri %copy, 8000, implicit-def $nzcv
110   ; CHECK-NEXT:   Bcc 11, %bb.1, implicit $nzcv
111   ; CHECK-NEXT:   B %bb.0
112   ; CHECK-NEXT: {{  $}}
113   ; CHECK-NEXT: bb.1:
114   ; CHECK-NEXT:   RET_ReallyLR
115   bb.0:
116     successors: %bb.0, %bb.1
117     liveins: $x0
118     %copy:gpr(s64) = COPY $x0
119     %bit:gpr(s64) = G_CONSTANT i64 8
120     %zero:gpr(s64) = G_CONSTANT i64 0
121     %c:gpr(s64) = G_CONSTANT i64 8
122     %and:gpr(s64) = G_AND %copy, %bit
123     %cmp:gpr(s32) = G_ICMP intpred(slt), %and(s64), %zero
124     %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
125     G_BRCOND %cmp_trunc(s1), %bb.1
126     G_BR %bb.0
127   bb.1:
128     RET_ReallyLR
129
130 ...
131 ---
132 name:            dont_commute
133 alignment:       4
134 legalized:       true
135 regBankSelected: true
136 body:             |
137   ; CHECK-LABEL: name: dont_commute
138   ; CHECK: bb.0:
139   ; CHECK-NEXT:   successors: %bb.0(0x40000000), %bb.1(0x40000000)
140   ; CHECK-NEXT: {{  $}}
141   ; CHECK-NEXT:   %copy:gpr64 = COPY $x0
142   ; CHECK-NEXT:   %zero:gpr64 = COPY $xzr
143   ; CHECK-NEXT:   [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr %zero, %copy, implicit-def $nzcv
144   ; CHECK-NEXT:   Bcc 11, %bb.1, implicit $nzcv
145   ; CHECK-NEXT:   B %bb.0
146   ; CHECK-NEXT: {{  $}}
147   ; CHECK-NEXT: bb.1:
148   ; CHECK-NEXT:   RET_ReallyLR
149   bb.0:
150     successors: %bb.0, %bb.1
151     liveins: $x0
152     %copy:gpr(s64) = COPY $x0
153     %zero:gpr(s64) = G_CONSTANT i64 0
154     %cmp:gpr(s32) = G_ICMP intpred(slt), %zero, %copy(s64)
155     %cmp_trunc:gpr(s1) = G_TRUNC %cmp(s32)
156     G_BRCOND %cmp_trunc(s1), %bb.1
157     G_BR %bb.0
158   bb.1:
159     RET_ReallyLR