@@ -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+
89191declare void @f (ptr )
0 commit comments