@@ -128,6 +128,103 @@ define i32 @test_trunc_add(i64 %x) {
128
128
ret i32 %conv
129
129
}
130
130
131
+ define i32 @test_trunc_sub (i64 %x ) {
132
+ ; X64-LABEL: test_trunc_sub:
133
+ ; X64: # %bb.0:
134
+ ; X64-NEXT: shrq $49, %rdi
135
+ ; X64-NEXT: leal 32762(%rdi), %eax
136
+ ; X64-NEXT: andl $32767, %eax # imm = 0x7FFF
137
+ ; X64-NEXT: retq
138
+ %sub = sub i64 %x , 3377699720527872
139
+ %shr = lshr i64 %sub , 49
140
+ %conv = trunc i64 %shr to i32
141
+ ret i32 %conv
142
+ }
143
+
144
+ define i32 @test_trunc_and_1 (i64 %x ) {
145
+ ; X64-LABEL: test_trunc_and_1:
146
+ ; X64: # %bb.0:
147
+ ; X64-NEXT: movq %rdi, %rax
148
+ ; X64-NEXT: shrq $50, %rax
149
+ ; X64-NEXT: andl $3, %eax
150
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
151
+ ; X64-NEXT: retq
152
+ %and = and i64 %x , 3940649673949184
153
+ %shr = lshr i64 %and , 50
154
+ %conv = trunc i64 %shr to i32
155
+ ret i32 %conv
156
+ }
157
+
158
+ define i32 @test_trunc_or_1 (i64 %x ) {
159
+ ; X64-LABEL: test_trunc_or_1:
160
+ ; X64: # %bb.0:
161
+ ; X64-NEXT: movq %rdi, %rax
162
+ ; X64-NEXT: shrq $50, %rax
163
+ ; X64-NEXT: orl $3, %eax
164
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
165
+ ; X64-NEXT: retq
166
+ %or = or i64 %x , 3940649673949184
167
+ %shr = lshr i64 %or , 50
168
+ %conv = trunc i64 %shr to i32
169
+ ret i32 %conv
170
+ }
171
+
172
+ define i32 @test_trunc_xor_1 (i64 %x ) {
173
+ ; X64-LABEL: test_trunc_xor_1:
174
+ ; X64: # %bb.0:
175
+ ; X64-NEXT: movq %rdi, %rax
176
+ ; X64-NEXT: shrq $50, %rax
177
+ ; X64-NEXT: xorl $3, %eax
178
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
179
+ ; X64-NEXT: retq
180
+ %xor = xor i64 %x , 3940649673949184
181
+ %shr = lshr i64 %xor , 50
182
+ %conv = trunc i64 %shr to i32
183
+ ret i32 %conv
184
+ }
185
+
186
+ define i32 @test_trunc_and_2 (i64 %x ) {
187
+ ; X64-LABEL: test_trunc_and_2:
188
+ ; X64: # %bb.0:
189
+ ; X64-NEXT: movq %rdi, %rax
190
+ ; X64-NEXT: shrq $45, %rax
191
+ ; X64-NEXT: andl $111, %eax
192
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
193
+ ; X64-NEXT: retq
194
+ %and = and i64 %x , 3940649673949183
195
+ %shr = lshr i64 %and , 45
196
+ %conv = trunc i64 %shr to i32
197
+ ret i32 %conv
198
+ }
199
+
200
+ define i32 @test_trunc_or_2 (i64 %x ) {
201
+ ; X64-LABEL: test_trunc_or_2:
202
+ ; X64: # %bb.0:
203
+ ; X64-NEXT: movq %rdi, %rax
204
+ ; X64-NEXT: shrq $45, %rax
205
+ ; X64-NEXT: orl $111, %eax
206
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
207
+ ; X64-NEXT: retq
208
+ %or = or i64 %x , 3940649673949183
209
+ %shr = lshr i64 %or , 45
210
+ %conv = trunc i64 %shr to i32
211
+ ret i32 %conv
212
+ }
213
+
214
+ define i32 @test_trunc_xor_2 (i64 %x ) {
215
+ ; X64-LABEL: test_trunc_xor_2:
216
+ ; X64: # %bb.0:
217
+ ; X64-NEXT: movq %rdi, %rax
218
+ ; X64-NEXT: shrq $45, %rax
219
+ ; X64-NEXT: xorl $111, %eax
220
+ ; X64-NEXT: # kill: def $eax killed $eax killed $rax
221
+ ; X64-NEXT: retq
222
+ %xor = xor i64 %x , 3940649673949183
223
+ %shr = lshr i64 %xor , 45
224
+ %conv = trunc i64 %shr to i32
225
+ ret i32 %conv
226
+ }
227
+
131
228
; Make sure we don't crash on this test case.
132
229
133
230
define i32 @pr128158 (i64 %x ) {
@@ -137,10 +234,10 @@ define i32 @pr128158(i64 %x) {
137
234
; X64-NEXT: addq %rdi, %rax
138
235
; X64-NEXT: shrq $32, %rax
139
236
; X64-NEXT: .p2align 4
140
- ; X64-NEXT: .LBB9_1 : # %for.body
237
+ ; X64-NEXT: .LBB16_1 : # %for.body
141
238
; X64-NEXT: # =>This Inner Loop Header: Depth=1
142
239
; X64-NEXT: cmpl $9, %eax
143
- ; X64-NEXT: jb .LBB9_1
240
+ ; X64-NEXT: jb .LBB16_1
144
241
; X64-NEXT: # %bb.2: # %exit
145
242
; X64-NEXT: xorl %eax, %eax
146
243
; X64-NEXT: retq
0 commit comments