1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -S -passes=loop-predication < %s 2>&1 | FileCheck %s 3 4; Do not convert branch in loop_outer block on the widenable_cond11 to a 5; loop-varying one. 6; It will result in a miscompile. 7; deopt9 will have incorrect deopt state (it currently uses init_val because 8; indvars identified that if that exit is taken, it will be taken on first 9; iteration, since widenable_cond11 is a loop-invariant condition). 10define i32 @foo(ptr addrspace(1) %arg) { 11; CHECK-LABEL: define i32 @foo 12; CHECK-SAME: (ptr addrspace(1) [[ARG:%.*]]) { 13; CHECK-NEXT: entry: 14; CHECK-NEXT: [[INIT_VAL:%.*]] = load i32, ptr addrspace(1) [[ARG]], align 4 15; CHECK-NEXT: [[WIDENABLE_COND11:%.*]] = call i1 @llvm.experimental.widenable.condition() 16; CHECK-NEXT: br label [[LOOP_OUTER:%.*]] 17; CHECK: loop_outer: 18; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[PHI36:%.*]], [[OUTER_LOOP_LATCH:%.*]] ], [ 42, [[ENTRY:%.*]] ] 19; CHECK-NEXT: [[PHI21:%.*]] = phi i32 [ [[ADD39:%.*]], [[OUTER_LOOP_LATCH]] ], [ [[INIT_VAL]], [[ENTRY]] ] 20; CHECK-NEXT: [[ADD27:%.*]] = add i32 [[IV]], 1 21; CHECK-NEXT: [[ICMP28:%.*]] = icmp eq i32 [[ADD27]], 60 22; CHECK-NEXT: br i1 [[WIDENABLE_COND11]], label [[INNER_LOOP_PH:%.*]], label [[DEOPT9:%.*]] 23; CHECK: inner_loop_ph: 24; CHECK-NEXT: store atomic i32 606, ptr addrspace(1) [[ARG]] unordered, align 4 25; CHECK-NEXT: br label [[INNER_LOOP:%.*]] 26; CHECK: inner_loop: 27; CHECK-NEXT: [[PHI43:%.*]] = phi i32 [ 1, [[INNER_LOOP_PH]] ], [ [[ADD55:%.*]], [[INNER_LOOP_LATCH:%.*]] ] 28; CHECK-NEXT: [[PHI44:%.*]] = phi i32 [ [[ADD27]], [[INNER_LOOP_PH]] ], [ [[ADD48:%.*]], [[INNER_LOOP_LATCH]] ] 29; CHECK-NEXT: [[ADD48]] = add i32 [[PHI44]], 1 30; CHECK-NEXT: [[ICMP49:%.*]] = icmp eq i32 [[ADD48]], 0 31; CHECK-NEXT: br i1 [[ICMP49]], label [[DEOPT57:%.*]], label [[INNER_LOOP_LATCH]] 32; CHECK: inner_loop_latch: 33; CHECK-NEXT: store atomic i32 606, ptr addrspace(1) [[ARG]] unordered, align 4 34; CHECK-NEXT: [[ADD55]] = add nuw nsw i32 [[PHI43]], 1 35; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[ADD55]], 10 36; CHECK-NEXT: br i1 [[EXITCOND]], label [[OUTER_LOOP_LATCH]], label [[INNER_LOOP]] 37; CHECK: outer_loop_latch: 38; CHECK-NEXT: [[PHI36]] = phi i32 [ [[ADD48]], [[INNER_LOOP_LATCH]] ] 39; CHECK-NEXT: [[ADD39]] = add i32 [[PHI21]], 1 40; CHECK-NEXT: br label [[LOOP_OUTER]] 41; CHECK: deopt9: 42; CHECK-NEXT: [[LCSSA:%.*]] = phi i32 [ [[INIT_VAL]], [[LOOP_OUTER]] ] 43; CHECK-NEXT: [[CALL53:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 13) [ "deopt"(i32 606, i32 [[LCSSA]]) ] 44; CHECK-NEXT: ret i32 [[CALL53]] 45; CHECK: deopt57: 46; CHECK-NEXT: [[CALL62:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 12) [ "deopt"(i32 7) ] 47; CHECK-NEXT: ret i32 [[CALL62]] 48; 49entry: 50 %init_val = load i32, ptr addrspace(1) %arg, align 4 51 %widenable_cond11 = call i1 @llvm.experimental.widenable.condition() 52 br label %loop_outer 53 54loop_outer: ; preds = %outer_loop_latch, %entry 55 %iv = phi i32 [ %phi36, %outer_loop_latch ], [ 42, %entry ] 56 %phi21 = phi i32 [ %add39, %outer_loop_latch ], [ %init_val, %entry ] 57 %add27 = add i32 %iv, 1 58 %icmp28 = icmp eq i32 %add27, 60 59 br i1 %widenable_cond11, label %inner_loop_ph, label %deopt9 60 61inner_loop_ph: ; preds = %loop_outer 62 store atomic i32 606, ptr addrspace(1) %arg unordered, align 4 63 br label %inner_loop 64 65inner_loop: ; preds = %inner_loop_latch, %inner_loop_ph 66 %phi43 = phi i32 [ 1, %inner_loop_ph ], [ %add55, %inner_loop_latch ] 67 %phi44 = phi i32 [ %add27, %inner_loop_ph ], [ %add48, %inner_loop_latch ] 68 %add48 = add i32 %phi44, 1 69 %icmp49 = icmp eq i32 %add48, 0 70 br i1 %icmp49, label %deopt57, label %inner_loop_latch 71 72inner_loop_latch: ; preds = %inner_loop 73 store atomic i32 606, ptr addrspace(1) %arg unordered, align 4 74 %add55 = add nuw nsw i32 %phi43, 1 75 %exitcond = icmp eq i32 %add55, 10 76 br i1 %exitcond, label %outer_loop_latch, label %inner_loop 77 78outer_loop_latch: ; preds = %inner_loop_latch 79 %phi36 = phi i32 [ %add48, %inner_loop_latch ] 80 %add39 = add i32 %phi21, 1 81 br label %loop_outer 82 83deopt9: ; preds = %loop_outer 84 %lcssa = phi i32 [ %init_val, %loop_outer ] 85 %call53 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 13) [ "deopt"(i32 606, i32 %lcssa) ] 86 ret i32 %call53 87 88deopt57: ; preds = %inner_loop 89 %call62 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 12) [ "deopt"(i32 7) ] 90 ret i32 %call62 91} 92 93declare i32 @llvm.experimental.deoptimize.i32(...) 94 95; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) 96declare noundef i1 @llvm.experimental.widenable.condition() 97