@@ -382,7 +382,7 @@ define void @no_optimize_arbitrary_call(i32 %block_size) {
382382; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
383383; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
384384; CHECK: [[IF_THEN]]:
385- ; CHECK-NEXT: call void @noreturn (ptr [[FOO_ARR]])
385+ ; CHECK-NEXT: call void @noreturn_with_argmem (ptr [[FOO_ARR]])
386386; CHECK-NEXT: unreachable
387387; CHECK: [[IF_END4]]:
388388; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
@@ -417,7 +417,7 @@ for.body: ; preds = %for.body.preheader,
417417 br i1 %cmp1 , label %if.then , label %if.end4
418418
419419if.then: ; preds = %for.body
420- call void @noreturn (ptr %foo_arr )
420+ call void @noreturn_with_argmem (ptr %foo_arr )
421421 unreachable
422422
423423if.end4: ; preds = %for.body
@@ -656,12 +656,88 @@ if.end4: ; preds = %for.body
656656 br i1 %cmp , label %for.body , label %for.cond.cleanup.loopexit
657657}
658658
659+ define void @no_optimize_depdendent_load_trap (i32 %block_size ) {
660+ ; CHECK-LABEL: define void @no_optimize_depdendent_load_trap(
661+ ; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
662+ ; CHECK-NEXT: [[ENTRY:.*:]]
663+ ; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
664+ ; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
665+ ; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
666+ ; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
667+ ; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
668+ ; CHECK: [[FOR_BODY_PREHEADER]]:
669+ ; CHECK-NEXT: br label %[[FOR_BODY:.*]]
670+ ; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
671+ ; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
672+ ; CHECK: [[FOR_COND_CLEANUP]]:
673+ ; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
674+ ; CHECK-NEXT: ret void
675+ ; CHECK: [[FOR_BODY]]:
676+ ; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
677+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
678+ ; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
679+ ; CHECK: [[IF_THEN]]:
680+ ; CHECK-NEXT: [[I_015_LCSSA:%.*]] = load i8, ptr [[FOO_ARR]], align 1
681+ ; CHECK-NEXT: call void @noreturn_with_i8(i8 [[I_015_LCSSA]])
682+ ; CHECK-NEXT: unreachable
683+ ; CHECK: [[IF_END4]]:
684+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
685+ ; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
686+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
687+ ; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
688+ ; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
689+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
690+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
691+ ; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
692+ ;
693+ entry:
694+ %foo_arr = alloca [2 x i8 ], align 16
695+ %bar_arr = alloca [2 x i8 ], align 16
696+ call void @x (ptr nonnull %foo_arr )
697+ %cmp14.not = icmp eq i32 %block_size , 0
698+ br i1 %cmp14.not , label %for.cond.cleanup , label %for.body.preheader
699+
700+ for.body.preheader: ; preds = %entry
701+ br label %for.body
702+
703+ for.cond.cleanup.loopexit: ; preds = %if.end4
704+ br label %for.cond.cleanup
705+
706+ for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
707+ call void @x (ptr nonnull %bar_arr )
708+ ret void
709+
710+ for.body: ; preds = %for.body.preheader, %if.end4
711+ %i.015 = phi i32 [ %inc , %if.end4 ], [ 0 , %for.body.preheader ]
712+ %cmp1 = icmp samesign ugt i32 %i.015 , 2
713+ br i1 %cmp1 , label %if.then , label %if.end4
714+
715+ if.then: ; preds = %for.body
716+ %r = load i8 , ptr %foo_arr , align 1
717+ call void @noreturn_with_i8 (i8 %r )
718+ unreachable
719+
720+ if.end4: ; preds = %for.body
721+ %arrayidx = getelementptr inbounds nuw [1024 x i8 ], ptr %foo_arr , i64 0 , i32 %i.015
722+ %0 = load i8 , ptr %arrayidx , align 1
723+ %1 = xor i8 %0 , 54
724+ %arrayidx7 = getelementptr inbounds nuw [1025 x i8 ], ptr %bar_arr , i64 0 , i32 %i.015
725+ store i8 %1 , ptr %arrayidx7 , align 1
726+ %inc = add nuw nsw i32 %i.015 , 1
727+ %cmp = icmp ult i32 %inc , %block_size
728+ br i1 %cmp , label %for.body , label %for.cond.cleanup.loopexit
729+ }
730+
731+
659732declare void @x (ptr noundef) local_unnamed_addr
660733declare i1 @pred () local_unnamed_addr
661734
662735; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write)
663736declare void @llvm.trap () #0
664737declare void @noreturn (ptr ) #0
665738declare void @noreturn_with_i32 (i32 ) #0
739+ declare void @noreturn_with_i8 (i8 ) #0
740+ declare void @noreturn_with_argmem (ptr ) #1
666741
667742attributes #0 = { cold noreturn nounwind memory(inaccessiblemem: write) }
743+ attributes #1 = { cold noreturn nounwind memory(argmem: read) }
0 commit comments