Skip to content

Commit d97f49b

Browse files
committed
[X86] Add pointer mask test coverage for implicit NSW/NUW adds
promoteExtBeforeAdd currently relies on a NSW/NUW flag, which have been lost by previous folds.
1 parent 0701ee6 commit d97f49b

File tree

1 file changed

+50
-3
lines changed

1 file changed

+50
-3
lines changed

llvm/test/CodeGen/X86/addr-mode-matcher-3.ll

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,63 @@
22
; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86
33
; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
44

5-
define i32 @mask_offset_scale_i32_i64(ptr %base, i32 %i) {
6-
; X86-LABEL: mask_offset_scale_i32_i64:
5+
define i32 @mask_add_sext_i32_i64(ptr %base, i32 %i) {
6+
; X86-LABEL: mask_add_sext_i32_i64:
7+
; X86: # %bb.0:
8+
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
9+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
10+
; X86-NEXT: movl 12(%ecx,%eax,4), %eax
11+
; X86-NEXT: retl
12+
;
13+
; X64-LABEL: mask_add_sext_i32_i64:
14+
; X64: # %bb.0:
15+
; X64-NEXT: sarl $24, %esi
16+
; X64-NEXT: addl $3, %esi
17+
; X64-NEXT: movslq %esi, %rax
18+
; X64-NEXT: movl (%rdi,%rax,4), %eax
19+
; X64-NEXT: retq
20+
%mask = ashr i32 %i, 24
21+
%offset = add i32 %mask, 3
22+
%sext = sext i32 %offset to i64
23+
%gep = getelementptr i32, ptr %base, i64 %sext
24+
%ret = load i32, ptr %gep
25+
ret i32 %ret
26+
}
27+
28+
define i32 @mask_add_zext_i32_i64(ptr %base, i32 %i) {
29+
; X86-LABEL: mask_add_zext_i32_i64:
30+
; X86: # %bb.0:
31+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
32+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
33+
; X86-NEXT: andl $15, %ecx
34+
; X86-NEXT: movl 12(%eax,%ecx,4), %eax
35+
; X86-NEXT: retl
36+
;
37+
; X64-LABEL: mask_add_zext_i32_i64:
38+
; X64: # %bb.0:
39+
; X64-NEXT: # kill: def $esi killed $esi def $rsi
40+
; X64-NEXT: andl $15, %esi
41+
; X64-NEXT: addl $3, %esi
42+
; X64-NEXT: movl (%rdi,%rsi,4), %eax
43+
; X64-NEXT: retq
44+
%mask = and i32 %i, 15
45+
%offset = add i32 %mask, 3
46+
%zext = zext i32 %offset to i64
47+
%gep = getelementptr i32, ptr %base, i64 %zext
48+
%ret = load i32, ptr %gep
49+
ret i32 %ret
50+
}
51+
52+
define i32 @mask_offset_scale_zext_i32_i64(ptr %base, i32 %i) {
53+
; X86-LABEL: mask_offset_scale_zext_i32_i64:
754
; X86: # %bb.0:
855
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
956
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
1057
; X86-NEXT: shll $11, %ecx
1158
; X86-NEXT: movl 48(%eax,%ecx), %eax
1259
; X86-NEXT: retl
1360
;
14-
; X64-LABEL: mask_offset_scale_i32_i64:
61+
; X64-LABEL: mask_offset_scale_zext_i32_i64:
1562
; X64: # %bb.0:
1663
; X64-NEXT: # kill: def $esi killed $esi def $rsi
1764
; X64-NEXT: andl $65280, %esi # imm = 0xFF00

0 commit comments

Comments
 (0)