Skip to content

Commit 6e36859

Browse files
committed
[BasicAA] Extend test coverage for GEP modulo logic.
Add a few additional test cases which combine multiplies with powers-of-2, different wrapping flags.
1 parent 6415f42 commit 6e36859

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

llvm/test/Analysis/BasicAA/gep-modulo.ll

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,97 @@ define void @may_overflow_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
8181
ret void
8282
}
8383

84+
define void @nuw_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
85+
; CHECK-LABEL: Function: nuw_nsw_mul_sub_i64: 3 pointers, 0 call sites
86+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
87+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
88+
; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
89+
;
90+
%mul = mul nuw nsw i64 %idx, 5
91+
%sub = sub nuw nsw i64 %mul, 1
92+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
93+
store i8 0, i8* %gep.idx, align 1
94+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
95+
store i8 1, i8* %gep.3, align 1
96+
ret void
97+
}
98+
99+
define void @only_nsw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
100+
; CHECK-LABEL: Function: only_nsw_mul_sub_i64: 3 pointers, 0 call sites
101+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
102+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
103+
; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
104+
;
105+
%mul = mul nsw i64 %idx, 5
106+
%sub = sub nsw i64 %mul, 1
107+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
108+
store i8 0, i8* %gep.idx, align 1
109+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
110+
store i8 1, i8* %gep.3, align 1
111+
ret void
112+
}
113+
114+
define void @only_nuw_mul_sub_i64([16 x i8]* %ptr, i64 %idx) {
115+
; CHECK-LABEL: Function: only_nuw_mul_sub_i64: 3 pointers, 0 call sites
116+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
117+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
118+
; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
119+
;
120+
%mul = mul nuw i64 %idx, 5
121+
%sub = sub nuw i64 %mul, 1
122+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
123+
store i8 0, i8* %gep.idx, align 1
124+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
125+
store i8 1, i8* %gep.3, align 1
126+
ret void
127+
}
128+
129+
define void @may_overflow_mul_pow2_sub_i64([16 x i8]* %ptr, i64 %idx) {
130+
; CHECK-LABEL: Function: may_overflow_mul_pow2_sub_i64: 3 pointers, 0 call sites
131+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
132+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
133+
; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
134+
;
135+
%mul = mul i64 %idx, 8
136+
%sub = sub i64 %mul, 1
137+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
138+
store i8 0, i8* %gep.idx, align 1
139+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
140+
store i8 1, i8* %gep.3, align 1
141+
ret void
142+
}
143+
144+
; Multiplies by power-of-2 preserves modulo and the sub does not wrap.
145+
define void @mul_pow2_sub_nsw_nuw_i64([16 x i8]* %ptr, i64 %idx) {
146+
; CHECK-LABEL: Function: mul_pow2_sub_nsw_nuw_i64: 3 pointers, 0 call sites
147+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
148+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
149+
; CHECK-NEXT: NoAlias: i8* %gep.3, i8* %gep.idx
150+
;
151+
%mul = mul i64 %idx, 8
152+
%sub = sub nuw nsw i64 %mul, 1
153+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
154+
store i8 0, i8* %gep.idx, align 1
155+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
156+
store i8 1, i8* %gep.3, align 1
157+
ret void
158+
}
159+
160+
define void @may_overflow_shl_sub_i64([16 x i8]* %ptr, i64 %idx) {
161+
; CHECK-LABEL: Function: may_overflow_shl_sub_i64: 3 pointers, 0 call sites
162+
; CHECK-NEXT: MayAlias: [16 x i8]* %ptr, i8* %gep.idx
163+
; CHECK-NEXT: PartialAlias: [16 x i8]* %ptr, i8* %gep.3
164+
; CHECK-NEXT: MayAlias: i8* %gep.3, i8* %gep.idx
165+
;
166+
%mul = shl i64 %idx, 2
167+
%sub = sub i64 %mul, 1
168+
%gep.idx = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 %sub
169+
store i8 0, i8* %gep.idx, align 1
170+
%gep.3 = getelementptr [16 x i8], [16 x i8]* %ptr, i32 0, i64 3
171+
store i8 1, i8* %gep.3, align 1
172+
ret void
173+
}
174+
84175
; %gep.idx and %gep.3 must-alias if %mul overflows (e.g. %idx == 110).
85176
define void @may_overflow_i32_sext([16 x i8]* %ptr, i32 %idx) {
86177
; CHECK-LABEL: Function: may_overflow_i32_sext: 3 pointers, 0 call sites

0 commit comments

Comments
 (0)