@@ -186,7 +186,7 @@ entry:
186186 ret i32 %c
187187}
188188
189- ; FIXME: Should preserve metadata on loads, except !noundef and !invariant.load .
189+ ; FIXME: Should preserve none-UB metadata on loads.
190190define ptr @preserve_load_metadata_after_select_transform1 (i1 %c , ptr dereferenceable (8 ) %a , ptr dereferenceable (8 ) %b ) {
191191; CHECK-LABEL: @preserve_load_metadata_after_select_transform1(
192192; CHECK-NEXT: entry:
@@ -197,10 +197,25 @@ define ptr @preserve_load_metadata_after_select_transform1(i1 %c, ptr dereferenc
197197;
198198entry:
199199 %ptr.sel = select i1 %c , ptr %b , ptr %a
200- %l.sel = load ptr , ptr %ptr.sel , align 1 , !tbaa !0 , !llvm.access.group !7 , !dereferenceable !9 , !noundef !{}, !invariant.load !7
200+ %l.sel = load ptr , ptr %ptr.sel , align 1 , !tbaa !0 , !llvm.access.group !7 , !dereferenceable !9 , !noundef !{}, !invariant.load !7 , !align !9 , !nonnull !{}
201201 ret ptr %l.sel
202202}
203203
204+ ; FIXME: Should preserve none-UB metadata on loads.
205+ define i32 @preserve_load_metadata_after_select_transform_range (i1 %c , ptr dereferenceable (8 ) %a , ptr dereferenceable (8 ) %b ) {
206+ ; CHECK-LABEL: @preserve_load_metadata_after_select_transform_range(
207+ ; CHECK-NEXT: entry:
208+ ; CHECK-NEXT: [[B_VAL:%.*]] = load i32, ptr [[B:%.*]], align 1
209+ ; CHECK-NEXT: [[A_VAL:%.*]] = load i32, ptr [[A:%.*]], align 1
210+ ; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[C:%.*]], i32 [[B_VAL]], i32 [[A_VAL]]
211+ ; CHECK-NEXT: ret i32 [[L_SEL]]
212+ ;
213+ entry:
214+ %ptr.sel = select i1 %c , ptr %b , ptr %a
215+ %l.sel = load i32 , ptr %ptr.sel , align 1 , !tbaa !0 , !llvm.access.group !7 , !invariant.load !7 , !noundef !{}, !range !6
216+ ret i32 %l.sel
217+ }
218+
204219define double @preserve_load_metadata_after_select_transform2 (ptr %a , ptr %b ) {
205220; CHECK-LABEL: @preserve_load_metadata_after_select_transform2(
206221; CHECK-NEXT: entry:
0 commit comments