1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -passes="print<assumptions>,gvn-sink,loop-unroll" -unroll-count=3 | FileCheck %s 3; 4; This crashed because the cached assumption was replaced and the replacement 5; was then in the cache twice. 6; 7; PR49043 8 9@g = external global i32 10 11define void @main() { 12; CHECK-LABEL: @main( 13; CHECK-NEXT: bb: 14; CHECK-NEXT: br label [[BB4_I:%.*]] 15; CHECK: bb4.i: 16; CHECK-NEXT: [[I1_I:%.*]] = load volatile i32, ptr @g, align 4 17; CHECK-NEXT: [[I32_I:%.*]] = icmp eq i32 [[I1_I]], 0 18; CHECK-NEXT: call void @llvm.assume(i1 [[I32_I]]) 19; CHECK-NEXT: [[I1_I_1:%.*]] = load volatile i32, ptr @g, align 4 20; CHECK-NEXT: [[I32_I_1:%.*]] = icmp eq i32 [[I1_I_1]], 0 21; CHECK-NEXT: call void @llvm.assume(i1 [[I32_I_1]]) 22; CHECK-NEXT: [[I1_I_2:%.*]] = load volatile i32, ptr @g, align 4 23; CHECK-NEXT: [[I32_I_2:%.*]] = icmp eq i32 [[I1_I_2]], 0 24; CHECK-NEXT: call void @llvm.assume(i1 [[I32_I_2]]) 25; CHECK-NEXT: br label [[BB4_I]], !llvm.loop [[LOOP0:![0-9]+]] 26; CHECK: func_1.exit: 27; CHECK-NEXT: unreachable 28; 29bb: 30 %i1.i = load volatile i32, ptr @g 31 %i32.i = icmp eq i32 %i1.i, 0 32 call void @llvm.assume(i1 %i32.i) #3 33 br label %bb4.i 34 35bb4.i: ; preds = %bb4.i, %bb 36 %i.i = load volatile i32, ptr @g 37 %i3.i = icmp eq i32 %i.i, 0 38 call void @llvm.assume(i1 %i3.i) #3 39 br label %bb4.i 40 41func_1.exit: ; No predecessors! 42 unreachable 43} 44 45declare void @llvm.assume(i1) 46