Skip to content

Commit 772aa05

Browse files
committed
[X86] Add tests showing the failure to merge SHL/ADD through AND masks into LEA
1 parent 43c90f9 commit 772aa05

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

llvm/test/CodeGen/X86/lea-dagdag.ll

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,51 @@ define i64 @and_i32_shl_zext_add_i64(i64 %t0, i32 %t1) {
150150
ret i64 %t6
151151
}
152152

153+
define i64 @shl_and_i8_zext_add_i64(i64 %t0, i8 %t1) {
154+
; CHECK-LABEL: shl_and_i8_zext_add_i64:
155+
; CHECK: # %bb.0:
156+
; CHECK-NEXT: shlb $2, %sil
157+
; CHECK-NEXT: andb $60, %sil
158+
; CHECK-NEXT: movzbl %sil, %eax
159+
; CHECK-NEXT: addq %rdi, %rax
160+
; CHECK-NEXT: retq
161+
%s = shl i8 %t1, 2
162+
%m = and i8 %s, 60
163+
%z = zext i8 %m to i64
164+
%a = add i64 %t0, %z
165+
ret i64 %a
166+
}
167+
168+
define i64 @shl_and_i16_zext_add_i64(i64 %t0, i16 %t1) {
169+
; CHECK-LABEL: shl_and_i16_zext_add_i64:
170+
; CHECK: # %bb.0:
171+
; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
172+
; CHECK-NEXT: leal (%rsi,%rsi), %eax
173+
; CHECK-NEXT: andl $16, %eax
174+
; CHECK-NEXT: addq %rdi, %rax
175+
; CHECK-NEXT: retq
176+
%s = shl i16 %t1, 1
177+
%m = and i16 %s, 17
178+
%z = zext i16 %m to i64
179+
%a = add i64 %t0, %z
180+
ret i64 %a
181+
}
182+
183+
define i64 @shl_and_i32_zext_add_i64(i64 %t0, i32 %t1) {
184+
; CHECK-LABEL: shl_and_i32_zext_add_i64:
185+
; CHECK: # %bb.0:
186+
; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
187+
; CHECK-NEXT: leal (,%rsi,8), %eax
188+
; CHECK-NEXT: andl $5992, %eax # imm = 0x1768
189+
; CHECK-NEXT: addq %rdi, %rax
190+
; CHECK-NEXT: retq
191+
%s = shl i32 %t1, 3
192+
%m = and i32 %s, 5999
193+
%z = zext i32 %m to i64
194+
%a = add i64 %t0, %z
195+
ret i64 %a
196+
}
197+
153198
; Negative test - shift can't be converted to scale factor.
154199

155200
define i64 @and_i32_zext_shl_add_i64_overshift(i64 %t0, i32 %t1) {

0 commit comments

Comments
 (0)