Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / xro-addressing-mode-constant.mir
blob58cc627f5485dda4e03cfaf1446f791d9728b33d
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 using the xro addressing mode with immediates. This should be done for
5 # wide constants which are preferably selected using a mov rather than an add.
7 ...
8 ---
9 name:            use_xro_cannot_encode_add_lsl
10 alignment:       4
11 legalized:       true
12 regBankSelected: true
13 tracksRegLiveness: true
14 body:             |
15   bb.0:
16     liveins: $x0
17     ; Check that we use the XRO addressing mode when the constant cannot be
18     ; represented using an add + lsl.
19     ;
20     ; cst = 0000000111000000
21     ; cst & 000fffffff000000 != 0
22     ;
23     ; CHECK-LABEL: name: use_xro_cannot_encode_add_lsl
24     ; CHECK: liveins: $x0
25     ; CHECK-NEXT: {{  $}}
26     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
27     ; CHECK-NEXT: %cst:gpr64 = MOVi64imm 4580179968
28     ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))
29     ; CHECK-NEXT: RET_ReallyLR
30     %copy:gpr(p0) = COPY $x0
31     %cst:gpr(s64) = G_CONSTANT i64 4580179968
32     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
33     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
34     RET_ReallyLR
36 ...
37 ---
38 name:            use_xro_preferred_mov
39 alignment:       4
40 legalized:       true
41 regBankSelected: true
42 tracksRegLiveness: true
43 body:             |
44   bb.0:
45     liveins: $x0
46     ; Check that we use the XRO addressing mode when the constant can be
47     ; represented using a single movk.
48     ;
49     ; cst = 000000000000f000
50     ; cst & 000fffffff000000 == 0
51     ; cst & ffffffffffff0fff != 0
52     ;
53     ; CHECK-LABEL: name: use_xro_preferred_mov
54     ; CHECK: liveins: $x0
55     ; CHECK-NEXT: {{  $}}
56     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
57     ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 61440
58     ; CHECK-NEXT: %cst:gpr64 = SUBREG_TO_REG 0, [[MOVi32imm]], %subreg.sub_32
59     ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))
60     ; CHECK-NEXT: RET_ReallyLR
61     %copy:gpr(p0) = COPY $x0
62     %cst:gpr(s64) = G_CONSTANT i64 61440
63     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
64     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
65     RET_ReallyLR
67 ...
68 ---
69 name:            use_xro_negative_imm
70 alignment:       4
71 legalized:       true
72 regBankSelected: true
73 tracksRegLiveness: true
74 body:             |
75   bb.0:
76     liveins: $x0
77     ; Check that this works even if we have a negative immediate.
78     ;
79     ; CHECK-LABEL: name: use_xro_negative_imm
80     ; CHECK: liveins: $x0
81     ; CHECK-NEXT: {{  $}}
82     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
83     ; CHECK-NEXT: %cst:gpr64 = MOVi64imm -61440
84     ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))
85     ; CHECK-NEXT: RET_ReallyLR
86     %copy:gpr(p0) = COPY $x0
87     %cst:gpr(s64) = G_CONSTANT i64 -61440
88     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
89     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
90     RET_ReallyLR
92 ...
93 ---
94 name:            dont_use_xro_selectable_imm
95 alignment:       4
96 legalized:       true
97 regBankSelected: true
98 tracksRegLiveness: true
99 body:             |
100   bb.0:
101     liveins: $x0
102     ; Immediates that can be encoded in a LDRXui should be skipped.
103     ;
104     ; CHECK-LABEL: name: dont_use_xro_selectable_imm
105     ; CHECK: liveins: $x0
106     ; CHECK-NEXT: {{  $}}
107     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
108     ; CHECK-NEXT: %load:gpr64 = LDRXui %copy, 2 :: (volatile load (s64))
109     ; CHECK-NEXT: RET_ReallyLR
110     %copy:gpr(p0) = COPY $x0
111     %cst:gpr(s64) = G_CONSTANT i64 16
112     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
113     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
114     RET_ReallyLR
118 name:            dont_use_xro_selectable_negative_imm
119 alignment:       4
120 legalized:       true
121 regBankSelected: true
122 tracksRegLiveness: true
123 body:             |
124   bb.0:
125     liveins: $x0
126     ; Immediates that can be encoded in a LDRXui should be skipped.
127     ;
128     ; CHECK-LABEL: name: dont_use_xro_selectable_negative_imm
129     ; CHECK: liveins: $x0
130     ; CHECK-NEXT: {{  $}}
131     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
132     ; CHECK-NEXT: %load:gpr64 = LDURXi %copy, -16 :: (volatile load (s64))
133     ; CHECK-NEXT: RET_ReallyLR
134     %copy:gpr(p0) = COPY $x0
135     %cst:gpr(s64) = G_CONSTANT i64 -16
136     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
137     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
138     RET_ReallyLR
142 name:            dont_use_xro_zero
143 alignment:       4
144 legalized:       true
145 regBankSelected: true
146 tracksRegLiveness: true
147 body:             |
148   bb.0:
149     liveins: $x0
150     ; Immediates that can be encoded in a LDRXui should be skipped.
151     ;
152     ; CHECK-LABEL: name: dont_use_xro_zero
153     ; CHECK: liveins: $x0
154     ; CHECK-NEXT: {{  $}}
155     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
156     ; CHECK-NEXT: %load:gpr64 = LDRXui %copy, 0 :: (volatile load (s64))
157     ; CHECK-NEXT: RET_ReallyLR
158     %copy:gpr(p0) = COPY $x0
159     %cst:gpr(s64) = G_CONSTANT i64 0
160     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
161     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
162     RET_ReallyLR
166 name:            dont_use_xro_in_range
167 alignment:       4
168 legalized:       true
169 regBankSelected: true
170 tracksRegLiveness: true
171 body:             |
172   bb.0:
173     liveins: $x0
174     ; Check that we skip constants which can be encoded in an add.
175     ; 17 is in [0x0, 0xfff]
176     ;
177     ; CHECK-LABEL: name: dont_use_xro_in_range
178     ; CHECK: liveins: $x0
179     ; CHECK-NEXT: {{  $}}
180     ; CHECK-NEXT: %copy:gpr64sp = COPY $x0
181     ; CHECK-NEXT: %load:gpr64 = LDURXi %copy, 17 :: (volatile load (s64))
182     ; CHECK-NEXT: RET_ReallyLR
183     %copy:gpr(p0) = COPY $x0
184     %cst:gpr(s64) = G_CONSTANT i64 17
185     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
186     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
187     RET_ReallyLR
191 name:            dont_use_xro_add_lsl
192 alignment:       4
193 legalized:       true
194 regBankSelected: true
195 tracksRegLiveness: true
196 body:             |
197   bb.0:
198     liveins: $x0
199     ; Check that we skip when we have an add with an lsl which cannot be
200     ; represented as a movk.
201     ;
202     ; cst = 0x0000000000111000
203     ; cst & 000fffffff000000 = 0
204     ; cst & ffffffffff00ffff != 0
205     ; cst & ffffffffffff0fff != 0
206     ;
207     ; CHECK-LABEL: name: dont_use_xro_add_lsl
208     ; CHECK: liveins: $x0
209     ; CHECK-NEXT: {{  $}}
210     ; CHECK-NEXT: %copy:gpr64 = COPY $x0
211     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY %copy
212     ; CHECK-NEXT: %addr:gpr64sp = ADDXri [[COPY]], 273, 12
213     ; CHECK-NEXT: %load:gpr64 = LDRXui %addr, 0 :: (volatile load (s64))
214     ; CHECK-NEXT: RET_ReallyLR
215     %copy:gpr(p0) = COPY $x0
216     %cst:gpr(s64) = G_CONSTANT i64 1118208
217     %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
218     %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))
219     RET_ReallyLR