@@ -141,8 +141,8 @@ define i32 @test_trunc_sub(i64 %x) {
141141 ret i32 %conv
142142}
143143
144- define i32 @test_trunc_and (i64 %x ) {
145- ; X64-LABEL: test_trunc_and :
144+ define i32 @test_trunc_and_1 (i64 %x ) {
145+ ; X64-LABEL: test_trunc_and_1 :
146146; X64: # %bb.0:
147147; X64-NEXT: movq %rdi, %rax
148148; X64-NEXT: shrq $48, %rax
@@ -155,8 +155,8 @@ define i32 @test_trunc_and(i64 %x) {
155155 ret i32 %conv
156156}
157157
158- define i32 @test_trunc_or (i64 %x ) {
159- ; X64-LABEL: test_trunc_or :
158+ define i32 @test_trunc_or_1 (i64 %x ) {
159+ ; X64-LABEL: test_trunc_or_1 :
160160; X64: # %bb.0:
161161; X64-NEXT: movq %rdi, %rax
162162; X64-NEXT: shrq $48, %rax
@@ -169,8 +169,8 @@ define i32 @test_trunc_or(i64 %x) {
169169 ret i32 %conv
170170}
171171
172- define i32 @test_trunc_xor (i64 %x ) {
173- ; X64-LABEL: test_trunc_xor :
172+ define i32 @test_trunc_xor_1 (i64 %x ) {
173+ ; X64-LABEL: test_trunc_xor_1 :
174174; X64: # %bb.0:
175175; X64-NEXT: movq %rdi, %rax
176176; X64-NEXT: shrq $48, %rax
@@ -183,6 +183,48 @@ define i32 @test_trunc_xor(i64 %x) {
183183 ret i32 %conv
184184}
185185
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 $48, %rax
191+ ; X64-NEXT: andl $13, %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 , 48
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 $48, %rax
205+ ; X64-NEXT: orl $13, %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 , 48
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 $48, %rax
219+ ; X64-NEXT: xorl $13, %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 , 48
224+ %conv = trunc i64 %shr to i32
225+ ret i32 %conv
226+ }
227+
186228; Make sure we don't crash on this test case.
187229
188230define i32 @pr128158 (i64 %x ) {
@@ -192,10 +234,10 @@ define i32 @pr128158(i64 %x) {
192234; X64-NEXT: addq %rdi, %rax
193235; X64-NEXT: shrq $32, %rax
194236; X64-NEXT: .p2align 4
195- ; X64-NEXT: .LBB13_1 : # %for.body
237+ ; X64-NEXT: .LBB16_1 : # %for.body
196238; X64-NEXT: # =>This Inner Loop Header: Depth=1
197239; X64-NEXT: cmpl $9, %eax
198- ; X64-NEXT: jb .LBB13_1
240+ ; X64-NEXT: jb .LBB16_1
199241; X64-NEXT: # %bb.2: # %exit
200242; X64-NEXT: xorl %eax, %eax
201243; X64-NEXT: retq
0 commit comments