Skip to content

Commit a202d77

Browse files
committed
[InstCombine] Add pre-commit tests. NFC.
1 parent 876174f commit a202d77

File tree

3 files changed

+128
-0
lines changed

3 files changed

+128
-0
lines changed

llvm/test/Transforms/InstCombine/load.ll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,3 +439,16 @@ define i4 @test_vector_load_i4_non_byte_sized() {
439439
%res0 = load i4, ptr %ptr0, align 1
440440
ret i4 %res0
441441
}
442+
443+
define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) {
444+
; CHECK-LABEL: @load_select_with_null_gep(
445+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
446+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 [[OFF:%.*]]
447+
; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[GEP]], align 4
448+
; CHECK-NEXT: ret i32 [[RES]]
449+
;
450+
%sel = select i1 %cond, ptr %p, ptr null
451+
%gep = getelementptr i8, ptr %sel, i64 %off
452+
%res = load i32, ptr %gep, align 4
453+
ret i32 %res
454+
}

llvm/test/Transforms/InstCombine/nonnull-select.ll

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,106 @@ define void @nonnull_noundef_call2(i1 %cond, ptr %p) {
8686
ret void
8787
}
8888

89+
define void @nonnull_call_gep(i1 %cond, ptr %p, i64 %off) {
90+
; CHECK-LABEL: @nonnull_call_gep(
91+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
92+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]
93+
; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
94+
; CHECK-NEXT: ret void
95+
;
96+
%ptr = select i1 %cond, ptr null, ptr %p
97+
%gep = getelementptr i8, ptr %ptr, i64 %off
98+
call void @f(ptr nonnull %gep)
99+
ret void
100+
}
101+
102+
define void @nonnull_call_gep_multiuse(i1 %cond, ptr %p, i64 %off) {
103+
; CHECK-LABEL: @nonnull_call_gep_multiuse(
104+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
105+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]
106+
; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
107+
; CHECK-NEXT: call void @f(ptr [[GEP]])
108+
; CHECK-NEXT: ret void
109+
;
110+
%ptr = select i1 %cond, ptr null, ptr %p
111+
%gep = getelementptr inbounds i8, ptr %ptr, i64 %off
112+
call void @f(ptr nonnull %gep)
113+
call void @f(ptr %gep)
114+
ret void
115+
}
116+
117+
define void @all_nonnull_call_gep_multiuse(i1 %cond, ptr %p, i64 %off) {
118+
; CHECK-LABEL: @all_nonnull_call_gep_multiuse(
119+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
120+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]
121+
; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
122+
; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
123+
; CHECK-NEXT: ret void
124+
;
125+
%ptr = select i1 %cond, ptr null, ptr %p
126+
%gep = getelementptr inbounds i8, ptr %ptr, i64 %off
127+
call void @f(ptr nonnull %gep)
128+
call void @f(ptr nonnull %gep)
129+
ret void
130+
}
131+
132+
define void @nonnull_call_gep_inbounds(i1 %cond, ptr %p, i64 %off) {
133+
; CHECK-LABEL: @nonnull_call_gep_inbounds(
134+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
135+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]
136+
; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
137+
; CHECK-NEXT: ret void
138+
;
139+
%ptr = select i1 %cond, ptr null, ptr %p
140+
%gep = getelementptr inbounds i8, ptr %ptr, i64 %off
141+
call void @f(ptr nonnull %gep)
142+
ret void
143+
}
144+
145+
define void @nonnull_dereferenceable_call_gep(i1 %cond, ptr %p, i64 %off) {
146+
; CHECK-LABEL: @nonnull_dereferenceable_call_gep(
147+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
148+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]
149+
; CHECK-NEXT: call void @f(ptr dereferenceable(1) [[GEP]])
150+
; CHECK-NEXT: ret void
151+
;
152+
%ptr = select i1 %cond, ptr null, ptr %p
153+
%gep = getelementptr i8, ptr %ptr, i64 %off
154+
call void @f(ptr dereferenceable(1) %gep)
155+
ret void
156+
}
157+
158+
define nonnull ptr @nonnull_ret_gep(i1 %cond, ptr %p, i64 %off) {
159+
; CHECK-LABEL: @nonnull_ret_gep(
160+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
161+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]
162+
; CHECK-NEXT: ret ptr [[GEP]]
163+
;
164+
%ptr = select i1 %cond, ptr null, ptr %p
165+
%gep = getelementptr i8, ptr %ptr, i64 %off
166+
ret ptr %gep
167+
}
168+
169+
define nonnull ptr @nonnull_ret_gep_inbounds(i1 %cond, ptr %p, i64 %off) {
170+
; CHECK-LABEL: @nonnull_ret_gep_inbounds(
171+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
172+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFF:%.*]]
173+
; CHECK-NEXT: ret ptr [[GEP]]
174+
;
175+
%ptr = select i1 %cond, ptr null, ptr %p
176+
%gep = getelementptr inbounds i8, ptr %ptr, i64 %off
177+
ret ptr %gep
178+
}
179+
180+
define dereferenceable(1) ptr @nonnull_dereferenceable_ret_gep(i1 %cond, ptr %p, i64 %off) {
181+
; CHECK-LABEL: @nonnull_dereferenceable_ret_gep(
182+
; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
183+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]
184+
; CHECK-NEXT: ret ptr [[GEP]]
185+
;
186+
%ptr = select i1 %cond, ptr null, ptr %p
187+
%gep = getelementptr i8, ptr %ptr, i64 %off
188+
ret ptr %gep
189+
}
190+
89191
declare void @f(ptr)

llvm/test/Transforms/InstCombine/store.ll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,19 @@ define void @store_select_with_unknown(i1 %cond, ptr %p, ptr %p2) {
387387
ret void
388388
}
389389

390+
define void @store_select_with_null_gep(i1 %cond, ptr %p, i64 %off) {
391+
; CHECK-LABEL: @store_select_with_null_gep(
392+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
393+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 [[OFF:%.*]]
394+
; CHECK-NEXT: store i32 0, ptr [[GEP]], align 4
395+
; CHECK-NEXT: ret void
396+
;
397+
%sel = select i1 %cond, ptr %p, ptr null
398+
%gep = getelementptr i8, ptr %sel, i64 %off
399+
store i32 0, ptr %gep, align 4
400+
ret void
401+
}
402+
390403
!0 = !{!4, !4, i64 0}
391404
!1 = !{!"omnipotent char", !2}
392405
!2 = !{!"Simple C/C++ TBAA"}

0 commit comments

Comments
 (0)