Skip to content

Commit 97ab69d

Browse files
committed
test update
Created using spr 1.3.7
1 parent aecd38d commit 97ab69d

File tree

2 files changed

+79
-6
lines changed

2 files changed

+79
-6
lines changed

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,10 +1720,7 @@ static bool crashingBBWithoutEffect(const BasicBlock &BB) {
17201720
// Now if the loop stored a non-nullptr to %a, we could cause a nullptr
17211721
// dereference by skipping over loop iterations.
17221722
if (const auto *CB = dyn_cast<CallBase>(&I)) {
1723-
if (CB->onlyAccessesInaccessibleMemory() &&
1724-
llvm::all_of(CB->args(), [](const llvm::Use &U) {
1725-
return isa<Constant>(U.get());
1726-
}))
1723+
if (CB->onlyAccessesInaccessibleMemory())
17271724
return true;
17281725
}
17291726
return isa<UnreachableInst>(I);

llvm/test/Transforms/IndVarSimplify/unreachable-exit.ll

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

419419
if.then: ; preds = %for.body
420-
call void @noreturn(ptr %foo_arr)
420+
call void @noreturn_with_argmem(ptr %foo_arr)
421421
unreachable
422422

423423
if.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+
659732
declare void @x(ptr noundef) local_unnamed_addr
660733
declare i1 @pred() local_unnamed_addr
661734

662735
; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write)
663736
declare void @llvm.trap() #0
664737
declare void @noreturn(ptr) #0
665738
declare void @noreturn_with_i32(i32) #0
739+
declare void @noreturn_with_i8(i8) #0
740+
declare void @noreturn_with_argmem(ptr) #1
666741

667742
attributes #0 = { cold noreturn nounwind memory(inaccessiblemem: write) }
743+
attributes #1 = { cold noreturn nounwind memory(argmem: read) }

0 commit comments

Comments
 (0)