1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=licm -S < %s | FileCheck %s 3 4;; C reproducer: 5;; void f(int *ptr, int n) { 6;; for (int i = 0; i < n; ++i) { 7;; int x = *ptr; 8;; if (x) 9;; break; 10;; 11;; *ptr = x + 1; 12;; } 13;; } 14 15define dso_local void @f(ptr nocapture %ptr, i32 %n) { 16; CHECK-LABEL: @f( 17; CHECK-NEXT: entry: 18; CHECK-NEXT: [[CMP7:%.*]] = icmp slt i32 0, [[N:%.*]] 19; CHECK-NEXT: br i1 [[CMP7]], label [[FOR_BODY_LR_PH:%.*]], label [[CLEANUP1:%.*]] 20; CHECK: for.body.lr.ph: 21; CHECK-NEXT: [[PTR_PROMOTED:%.*]] = load i32, ptr [[PTR:%.*]], align 4 22; CHECK-NEXT: br label [[FOR_BODY:%.*]] 23; CHECK: for.body: 24; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[PTR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ 1, [[IF_END:%.*]] ] 25; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END]] ] 26; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 27; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[FOR_BODY_CLEANUP1_CRIT_EDGE:%.*]] 28; CHECK: if.end: 29; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4 30; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 1 31; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], [[N]] 32; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP1_CRIT_EDGE:%.*]] 33; CHECK: for.body.cleanup1_crit_edge: 34; CHECK-NEXT: br label [[CLEANUP1]] 35; CHECK: for.cond.cleanup1_crit_edge: 36; CHECK-NEXT: br label [[CLEANUP1]] 37; CHECK: cleanup1: 38; CHECK-NEXT: ret void 39; 40entry: 41 %cmp7 = icmp slt i32 0, %n 42 br i1 %cmp7, label %for.body.lr.ph, label %cleanup1 43 44for.body.lr.ph: ; preds = %entry 45 br label %for.body 46 47for.body: ; preds = %for.body.lr.ph, %if.end 48 %i.08 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ] 49 %0 = load i32, ptr %ptr, align 4 50 %tobool.not = icmp eq i32 %0, 0 51 br i1 %tobool.not, label %if.end, label %for.body.cleanup1_crit_edge 52 53if.end: ; preds = %for.body 54 store i32 1, ptr %ptr, align 4 55 %inc = add nuw nsw i32 %i.08, 1 56 %cmp = icmp slt i32 %inc, %n 57 br i1 %cmp, label %for.body, label %for.cond.cleanup1_crit_edge 58 59for.body.cleanup1_crit_edge: ; preds = %for.body 60 br label %cleanup1 61 62for.cond.cleanup1_crit_edge: ; preds = %if.end 63 br label %cleanup1 64 65cleanup1: ; preds = %for.cond.cleanup1_crit_edge, %for.body.cleanup1_crit_edge, %entry 66 ret void 67} 68