68 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=licm -S < %s | FileCheck %s3 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 422; 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]], 027; 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 430; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 131; 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 void39;40entry:41 %cmp7 = icmp slt i32 0, %n42 br i1 %cmp7, label %for.body.lr.ph, label %cleanup143 44for.body.lr.ph: ; preds = %entry45 br label %for.body46 47for.body: ; preds = %for.body.lr.ph, %if.end48 %i.08 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ]49 %0 = load i32, ptr %ptr, align 450 %tobool.not = icmp eq i32 %0, 051 br i1 %tobool.not, label %if.end, label %for.body.cleanup1_crit_edge52 53if.end: ; preds = %for.body54 store i32 1, ptr %ptr, align 455 %inc = add nuw nsw i32 %i.08, 156 %cmp = icmp slt i32 %inc, %n57 br i1 %cmp, label %for.body, label %for.cond.cleanup1_crit_edge58 59for.body.cleanup1_crit_edge: ; preds = %for.body60 br label %cleanup161 62for.cond.cleanup1_crit_edge: ; preds = %if.end63 br label %cleanup164 65cleanup1: ; preds = %for.cond.cleanup1_crit_edge, %for.body.cleanup1_crit_edge, %entry66 ret void67}68