@@ -86,4 +86,102 @@ 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: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]
135+ ; CHECK-NEXT: call void @f(ptr nonnull [[GEP]])
136+ ; CHECK-NEXT: ret void
137+ ;
138+ %ptr = select i1 %cond , ptr null , ptr %p
139+ %gep = getelementptr inbounds i8 , ptr %ptr , i64 %off
140+ call void @f (ptr nonnull %gep )
141+ ret void
142+ }
143+
144+ define void @nonnull_dereferenceable_call_gep (i1 %cond , ptr %p , i64 %off ) {
145+ ; CHECK-LABEL: @nonnull_dereferenceable_call_gep(
146+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]
147+ ; CHECK-NEXT: call void @f(ptr dereferenceable(1) [[GEP]])
148+ ; CHECK-NEXT: ret void
149+ ;
150+ %ptr = select i1 %cond , ptr null , ptr %p
151+ %gep = getelementptr i8 , ptr %ptr , i64 %off
152+ call void @f (ptr dereferenceable (1 ) %gep )
153+ ret void
154+ }
155+
156+ define nonnull ptr @nonnull_ret_gep (i1 %cond , ptr %p , i64 %off ) {
157+ ; CHECK-LABEL: @nonnull_ret_gep(
158+ ; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
159+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[OFF:%.*]]
160+ ; CHECK-NEXT: ret ptr [[GEP]]
161+ ;
162+ %ptr = select i1 %cond , ptr null , ptr %p
163+ %gep = getelementptr i8 , ptr %ptr , i64 %off
164+ ret ptr %gep
165+ }
166+
167+ define nonnull ptr @nonnull_ret_gep_inbounds (i1 %cond , ptr %p , i64 %off ) {
168+ ; CHECK-LABEL: @nonnull_ret_gep_inbounds(
169+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]
170+ ; CHECK-NEXT: ret ptr [[GEP]]
171+ ;
172+ %ptr = select i1 %cond , ptr null , ptr %p
173+ %gep = getelementptr inbounds i8 , ptr %ptr , i64 %off
174+ ret ptr %gep
175+ }
176+
177+ define dereferenceable (1 ) ptr @nonnull_dereferenceable_ret_gep (i1 %cond , ptr %p , i64 %off ) {
178+ ; CHECK-LABEL: @nonnull_dereferenceable_ret_gep(
179+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[PTR:%.*]], i64 [[OFF:%.*]]
180+ ; CHECK-NEXT: ret ptr [[GEP]]
181+ ;
182+ %ptr = select i1 %cond , ptr null , ptr %p
183+ %gep = getelementptr i8 , ptr %ptr , i64 %off
184+ ret ptr %gep
185+ }
186+
89187declare void @f (ptr )
0 commit comments