@@ -128,6 +128,61 @@ define i32 @test_trunc_add(i64 %x) {
128128 ret i32 %conv
129129}
130130
131+ define i32 @test_trunc_sub (i64 %x ) {
132+ ; X64-LABEL: test_trunc_sub:
133+ ; X64: # %bb.0:
134+ ; X64-NEXT: shrq $48, %rdi
135+ ; X64-NEXT: addl $65522, %edi # imm = 0xFFF2
136+ ; X64-NEXT: movzwl %di, %eax
137+ ; X64-NEXT: retq
138+ %sub = sub i64 %x , 3940649673949184
139+ %shr = lshr i64 %sub , 48
140+ %conv = trunc i64 %shr to i32
141+ ret i32 %conv
142+ }
143+
144+ define i32 @test_trunc_and (i64 %x ) {
145+ ; X64-LABEL: test_trunc_and:
146+ ; X64: # %bb.0:
147+ ; X64-NEXT: movq %rdi, %rax
148+ ; X64-NEXT: shrq $48, %rax
149+ ; X64-NEXT: andl $14, %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 , 48
154+ %conv = trunc i64 %shr to i32
155+ ret i32 %conv
156+ }
157+
158+ define i32 @test_trunc_or (i64 %x ) {
159+ ; X64-LABEL: test_trunc_or:
160+ ; X64: # %bb.0:
161+ ; X64-NEXT: movabsq $3940649673949184, %rax # imm = 0xE000000000000
162+ ; X64-NEXT: orq %rdi, %rax
163+ ; X64-NEXT: shrq $48, %rax
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 , 48
168+ %conv = trunc i64 %shr to i32
169+ ret i32 %conv
170+ }
171+
172+ define i32 @test_trunc_xor (i64 %x ) {
173+ ; X64-LABEL: test_trunc_xor:
174+ ; X64: # %bb.0:
175+ ; X64-NEXT: movabsq $3940649673949184, %rax # imm = 0xE000000000000
176+ ; X64-NEXT: xorq %rdi, %rax
177+ ; X64-NEXT: shrq $48, %rax
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 , 48
182+ %conv = trunc i64 %shr to i32
183+ ret i32 %conv
184+ }
185+
131186; Make sure we don't crash on this test case.
132187
133188define i32 @pr128158 (i64 %x ) {
@@ -137,10 +192,10 @@ define i32 @pr128158(i64 %x) {
137192; X64-NEXT: addq %rdi, %rax
138193; X64-NEXT: shrq $32, %rax
139194; X64-NEXT: .p2align 4
140- ; X64-NEXT: .LBB9_1 : # %for.body
195+ ; X64-NEXT: .LBB13_1 : # %for.body
141196; X64-NEXT: # =>This Inner Loop Header: Depth=1
142197; X64-NEXT: cmpl $9, %eax
143- ; X64-NEXT: jb .LBB9_1
198+ ; X64-NEXT: jb .LBB13_1
144199; X64-NEXT: # %bb.2: # %exit
145200; X64-NEXT: xorl %eax, %eax
146201; X64-NEXT: retq
0 commit comments