Index: llvm/lib/Transforms/Utils/BasicBlockUtils.cpp =================================================================== --- llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -152,7 +152,7 @@ SmallVector<Value *, 4> IncomingValues; if (isa<PHINode>(BB->front())) { for (PHINode &PN : BB->phis()) - if (PN.getIncomingValue(0) != &PN) + if (!isa<PHINode>(PN.getIncomingValue(0))) IncomingValues.push_back(PN.getIncomingValue(0)); FoldSingleEntryPHINodes(BB, MemDep); } Index: llvm/test/Transforms/SimplifyCFG/fold-debug-info.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/SimplifyCFG/fold-debug-info.ll @@ -0,0 +1,547 @@ +; RUN: opt %s -S -simplifycfg | FileCheck %s + +; CHECK: %inc24.us = phi i32 [ %inc.us, %for.body.us ], [ %g.promoted, %for.body.preheader ] +; CHECK-NEXT: %k.0.us = phi i32 [ %conv15.us.us, %for.body.us ], [ 0, %for.body.preheader ], !dbg !49 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %k.0.us, metadata !36, metadata !DIExpression()), !dbg !49 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %k.0.us, metadata !36, metadata !DIExpression()), !dbg !49 + +@c = common local_unnamed_addr global i32 0, align 4, !dbg !0 +@e = internal unnamed_addr global i1 false, align 4, !dbg !24 +@b = internal unnamed_addr constant [7 x [9 x i32]] [[9 x i32] [i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], [9 x i32] zeroinitializer, [9 x i32] zeroinitializer, [9 x i32] zeroinitializer, [9 x i32] zeroinitializer, [9 x i32] zeroinitializer, [9 x i32] zeroinitializer], align 16, !dbg !18 +@h = common local_unnamed_addr global i32 0, align 4, !dbg !16 +@g = common local_unnamed_addr global i32 0, align 4, !dbg !14 +@d = common local_unnamed_addr global i32 0, align 4, !dbg !12 +@a = common local_unnamed_addr global i16 0, align 2, !dbg !6 + +; Function Attrs: nounwind ssp uwtable +define void @f() local_unnamed_addr #0 !dbg !30 { +entry: + call void @llvm.dbg.value(metadata i32 0, metadata !35, metadata !DIExpression()), !dbg !39 + %0 = load i32, i32* @c, align 4, !tbaa !40 + %tobool = icmp eq i32 %0, 0 + %1 = load i32, i32* @h, align 4 + %tobool7 = icmp eq i32 %1, 0 + %2 = load i16, i16* @a, align 2 + %conv = sext i16 %2 to i32 + br label %L, !dbg !44 + +L.loopexit.us-lcssa: ; preds = %cleanup + %t.5.lcssa.ph = phi i32 [ %t.5, %cleanup ] + br label %L.loopexit, !dbg !45 + +L.loopexit: ; preds = %L.loopexit.us-lcssa.us, %L.loopexit.us-lcssa + %t.5.lcssa = phi i32 [ %t.5.lcssa.ph, %L.loopexit.us-lcssa ], [ %t.5.lcssa.ph.us, %L.loopexit.us-lcssa.us ] + call void @llvm.dbg.value(metadata i32 %t.5.lcssa, metadata !35, metadata !DIExpression()), !dbg !39 + br label %L, !dbg !45 + +L: ; preds = %L.loopexit, %entry + %t.0 = phi i32 [ 0, %entry ], [ %t.5.lcssa, %L.loopexit ], !dbg !39 + call void @llvm.dbg.value(metadata i32 %t.0, metadata !35, metadata !DIExpression()), !dbg !39 + br i1 %tobool, label %if.end, label %if.then, !dbg !47 + +if.then: ; preds = %L + store i1 true, i1* @e, align 4 + br label %if.end, !dbg !48 + +if.end: ; preds = %L, %if.then + %.b = load i1, i1* @e, align 4 + br i1 %tobool, label %if.end.while.end.split_crit_edge, label %if.end.if.end.split_crit_edge, !dbg !49 + +if.end.if.end.split_crit_edge: ; preds = %if.end + br label %if.end.split, !dbg !49 + +if.end.while.end.split_crit_edge: ; preds = %if.end + br label %while.end.split, !dbg !49 + +if.end.split: ; preds = %if.end.if.end.split_crit_edge + br i1 %.b, label %if.end.split.split.us, label %if.end.split.if.end.split.split_crit_edge, !dbg !49 + +if.end.split.if.end.split.split_crit_edge: ; preds = %if.end.split + br label %if.end.split.split, !dbg !49 + +if.end.split.split.us: ; preds = %if.end.split + br label %while.cond.us, !dbg !49 + +while.cond.us: ; preds = %cleanup.us, %if.end.split.split.us + %t.1.us = phi i32 [ %t.0, %if.end.split.split.us ], [ %t.5.us, %cleanup.us ], !dbg !39 + call void @llvm.dbg.value(metadata i32 %t.1.us, metadata !35, metadata !DIExpression()), !dbg !39 + br i1 false, label %while.end.us-lcssa.us, label %while.body.us, !dbg !49 + +while.body.us: ; preds = %while.cond.us + call void @llvm.dbg.value(metadata i32 0, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 0, metadata !38, metadata !DIExpression()), !dbg !51 + br i1 true, label %cleanup.us, label %if.end4.us, !dbg !52 + +if.end4.us: ; preds = %while.body.us + %3 = load i32, i32* @g, align 4, !dbg !53 + %tobool9.us = icmp ne i32 %3, 0, !dbg !57 + %or.cond.us = and i1 %tobool7, %tobool9.us, !dbg !58 + br i1 %or.cond.us, label %for.body.preheader.us, label %cleanup.us, !dbg !58 + +for.body.us37: ; preds = %for.body.preheader.split.us70, %for.inc.us40 + %inc24.us38 = phi i32 [ %inc.us43, %for.inc.us40 ], [ %g.promoted.us, %for.body.preheader.split.us70 ] + %k.0.us39 = phi i32 [ %k.1.lcssa.us41, %for.inc.us40 ], [ 0, %for.body.preheader.split.us70 ], !dbg !50 + call void @llvm.dbg.value(metadata i32 %k.0.us39, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body.split.us.us65, label %for.body.for.body.split_crit_edge.us69, !dbg !59 + +for.inc.us40: ; preds = %for.inc.us-lcssa.us.us66, %for.inc.us-lcssa.us54 + %k.1.lcssa.us41 = phi i32 [ %k.1.lcssa.ph.us55, %for.inc.us-lcssa.us54 ], [ %k.1.lcssa.ph.us.us67, %for.inc.us-lcssa.us.us66 ] + %t.3.lcssa.us42 = phi i32 [ %t.3.lcssa.ph.us56, %for.inc.us-lcssa.us54 ], [ %t.3.lcssa.ph.us.us68, %for.inc.us-lcssa.us.us66 ] + call void @llvm.dbg.value(metadata i32 %k.1.lcssa.us41, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa.us42, metadata !35, metadata !DIExpression()), !dbg !39 + %inc.us43 = add nsw i32 %inc24.us38, 1, !dbg !61 + %tobool9.old.us44 = icmp eq i32 %inc.us43, 0, !dbg !57 + br i1 %tobool9.old.us44, label %cleanup.loopexit.us-lcssa.us71, label %for.body.us37, !dbg !57 + +for.body11.us45: ; preds = %for.body.split.us53, %cond.end.us49 + %k.123.us46 = phi i32 [ %k.0.us39, %for.body.split.us53 ], [ %conv15.us52, %cond.end.us49 ] + call void @llvm.dbg.value(metadata i32 %k.123.us46, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %cond.false.us47, label %cond.end.us49, !dbg !62 + +cond.false.us47: ; preds = %for.body11.us45 + %div.us48 = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us49, !dbg !62 + +cond.end.us49: ; preds = %cond.false.us47, %for.body11.us45 + %cond.us50 = phi i32 [ %div.us48, %cond.false.us47 ], [ %conv, %for.body11.us45 ], !dbg !62 + %sext.us51 = shl i32 %cond.us50, 16, !dbg !66 + %conv15.us52 = ashr exact i32 %sext.us51, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us46, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us52, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us45, label %for.inc.us-lcssa.us54, !dbg !59, !llvm.loop !67 + +cleanup.us: ; preds = %cleanup.loopexit.us, %if.end4.us, %while.body.us + %t.5.us = phi i32 [ %t.1.us, %while.body.us ], [ %t.1.us, %if.end4.us ], [ %t.3.lcssa.lcssa.us, %cleanup.loopexit.us ], !dbg !39 + %cleanup.dest.slot.0.us = phi i1 [ false, %while.body.us ], [ true, %if.end4.us ], [ true, %cleanup.loopexit.us ] + call void @llvm.dbg.value(metadata i32 %t.5.us, metadata !35, metadata !DIExpression()), !dbg !39 + br i1 %cleanup.dest.slot.0.us, label %while.cond.us, label %L.loopexit.us-lcssa.us, !llvm.loop !69 + +for.body.preheader.us: ; preds = %if.end4.us + %g.promoted.us = load i32, i32* @g, align 4, !dbg !61, !tbaa !40 + br i1 %tobool7, label %for.body.preheader.split.us.us, label %for.body.preheader.for.body.preheader.split_crit_edge.us, !dbg !71 + +cleanup.loopexit.us: ; preds = %cleanup.loopexit.us-lcssa.us.us, %cleanup.loopexit.us-lcssa.us71 + %inc.lcssa.us = phi i32 [ %inc.lcssa.ph.us72, %cleanup.loopexit.us-lcssa.us71 ], [ %inc.lcssa.ph.us.us, %cleanup.loopexit.us-lcssa.us.us ] + %t.3.lcssa.lcssa.us = phi i32 [ %t.3.lcssa.lcssa.ph.us73, %cleanup.loopexit.us-lcssa.us71 ], [ %t.3.lcssa.lcssa.ph.us.us, %cleanup.loopexit.us-lcssa.us.us ] + store i32 14, i32* @d, align 4, !dbg !72, !tbaa !40 + store i32 %inc.lcssa.us, i32* @g, align 4, !dbg !61, !tbaa !40 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa.lcssa.us, metadata !35, metadata !DIExpression()), !dbg !39 + br label %cleanup.us + +for.body.split.us53: ; preds = %for.body.for.body.split_crit_edge.us69 + br label %for.body11.us45, !dbg !59 + +for.inc.us-lcssa.us54: ; preds = %cond.end.us49 + %k.1.lcssa.ph.us55 = phi i32 [ %conv15.us52, %cond.end.us49 ] + %t.3.lcssa.ph.us56 = phi i32 [ %k.123.us46, %cond.end.us49 ] + br label %for.inc.us40, !dbg !72 + +for.body11.us.us57: ; preds = %for.body.split.us.us65, %cond.end.us.us61 + %k.123.us.us58 = phi i32 [ %k.0.us39, %for.body.split.us.us65 ], [ %conv15.us.us64, %cond.end.us.us61 ] + call void @llvm.dbg.value(metadata i32 %k.123.us.us58, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %cond.false.us.us59, label %cond.end.us.us61, !dbg !62 + +cond.false.us.us59: ; preds = %for.body11.us.us57 + %div.us.us60 = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us.us61, !dbg !62 + +cond.end.us.us61: ; preds = %cond.false.us.us59, %for.body11.us.us57 + %cond.us.us62 = phi i32 [ %div.us.us60, %cond.false.us.us59 ], [ %conv, %for.body11.us.us57 ], !dbg !62 + %sext.us.us63 = shl i32 %cond.us.us62, 16, !dbg !66 + %conv15.us.us64 = ashr exact i32 %sext.us.us63, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us.us58, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us.us64, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us.us57, label %for.inc.us-lcssa.us.us66, !dbg !59, !llvm.loop !67 + +for.body.split.us.us65: ; preds = %for.body.us37 + br label %for.body11.us.us57, !dbg !59 + +for.inc.us-lcssa.us.us66: ; preds = %cond.end.us.us61 + %k.1.lcssa.ph.us.us67 = phi i32 [ %conv15.us.us64, %cond.end.us.us61 ] + %t.3.lcssa.ph.us.us68 = phi i32 [ %k.123.us.us58, %cond.end.us.us61 ] + br label %for.inc.us40, !dbg !72 + +for.body.for.body.split_crit_edge.us69: ; preds = %for.body.us37 + br label %for.body.split.us53, !dbg !59 + +for.body.preheader.split.us70: ; preds = %for.body.preheader.for.body.preheader.split_crit_edge.us + br label %for.body.us37, !dbg !71 + +cleanup.loopexit.us-lcssa.us71: ; preds = %for.inc.us40 + %inc.lcssa.ph.us72 = phi i32 [ %inc.us43, %for.inc.us40 ] + %t.3.lcssa.lcssa.ph.us73 = phi i32 [ %t.3.lcssa.us42, %for.inc.us40 ] + br label %cleanup.loopexit.us, !dbg !72 + +for.body.us.us: ; preds = %for.body.preheader.split.us.us, %for.inc.us.us + %inc24.us.us = phi i32 [ %inc.us.us, %for.inc.us.us ], [ %g.promoted.us, %for.body.preheader.split.us.us ] + %k.0.us.us = phi i32 [ %k.1.lcssa.us.us, %for.inc.us.us ], [ 0, %for.body.preheader.split.us.us ], !dbg !50 + call void @llvm.dbg.value(metadata i32 %k.0.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %for.body.split.us.us.us, label %for.body.for.body.split_crit_edge.us.us, !dbg !59 + +for.inc.us.us: ; preds = %for.inc.us-lcssa.us.us.us, %for.inc.us-lcssa.us34.us + %k.1.lcssa.us.us = phi i32 [ %k.1.lcssa.ph.us35.us, %for.inc.us-lcssa.us34.us ], [ %k.1.lcssa.ph.us.us.us, %for.inc.us-lcssa.us.us.us ] + %t.3.lcssa.us.us = phi i32 [ %t.3.lcssa.ph.us36.us, %for.inc.us-lcssa.us34.us ], [ %t.3.lcssa.ph.us.us.us, %for.inc.us-lcssa.us.us.us ] + call void @llvm.dbg.value(metadata i32 %k.1.lcssa.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa.us.us, metadata !35, metadata !DIExpression()), !dbg !39 + %inc.us.us = add nsw i32 %inc24.us.us, 1, !dbg !61 + %tobool9.old.us.us = icmp eq i32 %inc.us.us, 0, !dbg !57 + br i1 %tobool9.old.us.us, label %cleanup.loopexit.us-lcssa.us.us, label %for.body.us.us, !dbg !57 + +for.body.split.us33.us: ; preds = %for.body.for.body.split_crit_edge.us.us + br label %for.body11.us25.us, !dbg !59 + +for.inc.us-lcssa.us34.us: ; preds = %cond.end.us29.us + %k.1.lcssa.ph.us35.us = phi i32 [ %conv15.us32.us, %cond.end.us29.us ] + %t.3.lcssa.ph.us36.us = phi i32 [ %k.123.us26.us, %cond.end.us29.us ] + br label %for.inc.us.us, !dbg !72 + +for.body.split.us.us.us: ; preds = %for.body.us.us + br label %for.body11.us.us.us, !dbg !59 + +for.inc.us-lcssa.us.us.us: ; preds = %cond.end.us.us.us + %k.1.lcssa.ph.us.us.us = phi i32 [ %conv15.us.us.us, %cond.end.us.us.us ] + %t.3.lcssa.ph.us.us.us = phi i32 [ %k.123.us.us.us, %cond.end.us.us.us ] + br label %for.inc.us.us, !dbg !72 + +for.body.for.body.split_crit_edge.us.us: ; preds = %for.body.us.us + br label %for.body.split.us33.us, !dbg !59 + +for.body11.us25.us: ; preds = %cond.end.us29.us, %for.body.split.us33.us + %k.123.us26.us = phi i32 [ %k.0.us.us, %for.body.split.us33.us ], [ %conv15.us32.us, %cond.end.us29.us ] + call void @llvm.dbg.value(metadata i32 %k.123.us26.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %cond.false.us27.us, label %cond.end.us29.us, !dbg !62 + +cond.false.us27.us: ; preds = %for.body11.us25.us + %div.us28.us = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us29.us, !dbg !62 + +cond.end.us29.us: ; preds = %cond.false.us27.us, %for.body11.us25.us + %cond.us30.us = phi i32 [ %div.us28.us, %cond.false.us27.us ], [ %conv, %for.body11.us25.us ], !dbg !62 + %sext.us31.us = shl i32 %cond.us30.us, 16, !dbg !66 + %conv15.us32.us = ashr exact i32 %sext.us31.us, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us26.us, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us32.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us25.us, label %for.inc.us-lcssa.us34.us, !dbg !59, !llvm.loop !67 + +for.body11.us.us.us: ; preds = %cond.end.us.us.us, %for.body.split.us.us.us + %k.123.us.us.us = phi i32 [ %k.0.us.us, %for.body.split.us.us.us ], [ %conv15.us.us.us, %cond.end.us.us.us ] + call void @llvm.dbg.value(metadata i32 %k.123.us.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %cond.false.us.us.us, label %cond.end.us.us.us, !dbg !62 + +cond.false.us.us.us: ; preds = %for.body11.us.us.us + %div.us.us.us = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us.us.us, !dbg !62 + +cond.end.us.us.us: ; preds = %cond.false.us.us.us, %for.body11.us.us.us + %cond.us.us.us = phi i32 [ %div.us.us.us, %cond.false.us.us.us ], [ %conv, %for.body11.us.us.us ], !dbg !62 + %sext.us.us.us = shl i32 %cond.us.us.us, 16, !dbg !66 + %conv15.us.us.us = ashr exact i32 %sext.us.us.us, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us.us.us, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us.us.us, label %for.inc.us-lcssa.us.us.us, !dbg !59, !llvm.loop !67 + +for.body.preheader.split.us.us: ; preds = %for.body.preheader.us + br label %for.body.us.us, !dbg !71 + +cleanup.loopexit.us-lcssa.us.us: ; preds = %for.inc.us.us + %inc.lcssa.ph.us.us = phi i32 [ %inc.us.us, %for.inc.us.us ] + %t.3.lcssa.lcssa.ph.us.us = phi i32 [ %t.3.lcssa.us.us, %for.inc.us.us ] + br label %cleanup.loopexit.us, !dbg !72 + +for.body.preheader.for.body.preheader.split_crit_edge.us: ; preds = %for.body.preheader.us + br label %for.body.preheader.split.us70, !dbg !71 + +while.end.us-lcssa.us: ; preds = %while.cond.us + br label %while.end, !dbg !73 + +L.loopexit.us-lcssa.us: ; preds = %cleanup.us + %t.5.lcssa.ph.us = phi i32 [ %t.5.us, %cleanup.us ] + br label %L.loopexit, !dbg !45 + +if.end.split.split: ; preds = %if.end.split.if.end.split.split_crit_edge + br label %while.cond, !dbg !49 + +while.cond: ; preds = %cleanup, %if.end.split.split + %t.1 = phi i32 [ %t.0, %if.end.split.split ], [ %t.5, %cleanup ], !dbg !39 + call void @llvm.dbg.value(metadata i32 %t.1, metadata !35, metadata !DIExpression()), !dbg !39 + br i1 false, label %while.end.us-lcssa, label %while.body, !dbg !49 + +while.body: ; preds = %while.cond + call void @llvm.dbg.value(metadata i32 0, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 0, metadata !38, metadata !DIExpression()), !dbg !51 + br i1 false, label %cleanup, label %if.end4, !dbg !52 + +if.end4: ; preds = %while.body + %4 = load i32, i32* @g, align 4, !dbg !53 + %tobool9 = icmp ne i32 %4, 0, !dbg !57 + %or.cond = and i1 %tobool7, %tobool9, !dbg !58 + br i1 %or.cond, label %for.body.preheader, label %cleanup, !dbg !58 + +for.body.preheader: ; preds = %if.end4 + %g.promoted = load i32, i32* @g, align 4, !dbg !61, !tbaa !40 + br i1 %tobool7, label %for.body.preheader.split.us, label %for.body.preheader.for.body.preheader.split_crit_edge, !dbg !71 + +for.body.preheader.for.body.preheader.split_crit_edge: ; preds = %for.body.preheader + br label %for.body.preheader.split, !dbg !71 + +for.body.preheader.split.us: ; preds = %for.body.preheader + br label %for.body.us, !dbg !71 + +for.body.us: ; preds = %for.inc.us, %for.body.preheader.split.us + %inc24.us = phi i32 [ %inc.us, %for.inc.us ], [ %g.promoted, %for.body.preheader.split.us ] + %k.0.us = phi i32 [ %k.1.lcssa.us, %for.inc.us ], [ 0, %for.body.preheader.split.us ], !dbg !50 + call void @llvm.dbg.value(metadata i32 %k.0.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %for.body.split.us.us, label %for.body.for.body.split_crit_edge.us, !dbg !59 + +for.inc.us: ; preds = %for.inc.us-lcssa.us.us, %for.inc.us-lcssa.us34 + %k.1.lcssa.us = phi i32 [ %k.1.lcssa.ph.us35, %for.inc.us-lcssa.us34 ], [ %k.1.lcssa.ph.us.us, %for.inc.us-lcssa.us.us ] + %t.3.lcssa.us = phi i32 [ %t.3.lcssa.ph.us36, %for.inc.us-lcssa.us34 ], [ %t.3.lcssa.ph.us.us, %for.inc.us-lcssa.us.us ] + call void @llvm.dbg.value(metadata i32 %k.1.lcssa.us, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa.us, metadata !35, metadata !DIExpression()), !dbg !39 + %inc.us = add nsw i32 %inc24.us, 1, !dbg !61 + %tobool9.old.us = icmp eq i32 %inc.us, 0, !dbg !57 + br i1 %tobool9.old.us, label %cleanup.loopexit.us-lcssa.us, label %for.body.us, !dbg !57 + +for.body11.us25: ; preds = %for.body.split.us33, %cond.end.us29 + %k.123.us26 = phi i32 [ %k.0.us, %for.body.split.us33 ], [ %conv15.us32, %cond.end.us29 ] + call void @llvm.dbg.value(metadata i32 %k.123.us26, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %cond.false.us27, label %cond.end.us29, !dbg !62 + +cond.false.us27: ; preds = %for.body11.us25 + %div.us28 = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us29, !dbg !62 + +cond.end.us29: ; preds = %cond.false.us27, %for.body11.us25 + %cond.us30 = phi i32 [ %div.us28, %cond.false.us27 ], [ %conv, %for.body11.us25 ], !dbg !62 + %sext.us31 = shl i32 %cond.us30, 16, !dbg !66 + %conv15.us32 = ashr exact i32 %sext.us31, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us26, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us32, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us25, label %for.inc.us-lcssa.us34, !dbg !59, !llvm.loop !67 + +for.body.split.us33: ; preds = %for.body.for.body.split_crit_edge.us + br label %for.body11.us25, !dbg !59 + +for.inc.us-lcssa.us34: ; preds = %cond.end.us29 + %k.1.lcssa.ph.us35 = phi i32 [ %conv15.us32, %cond.end.us29 ] + %t.3.lcssa.ph.us36 = phi i32 [ %k.123.us26, %cond.end.us29 ] + br label %for.inc.us, !dbg !72 + +for.body11.us.us: ; preds = %for.body.split.us.us, %cond.end.us.us + %k.123.us.us = phi i32 [ %k.0.us, %for.body.split.us.us ], [ %conv15.us.us, %cond.end.us.us ] + call void @llvm.dbg.value(metadata i32 %k.123.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %cond.false.us.us, label %cond.end.us.us, !dbg !62 + +cond.false.us.us: ; preds = %for.body11.us.us + %div.us.us = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us.us, !dbg !62 + +cond.end.us.us: ; preds = %cond.false.us.us, %for.body11.us.us + %cond.us.us = phi i32 [ %div.us.us, %cond.false.us.us ], [ %conv, %for.body11.us.us ], !dbg !62 + %sext.us.us = shl i32 %cond.us.us, 16, !dbg !66 + %conv15.us.us = ashr exact i32 %sext.us.us, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us.us, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us.us, label %for.inc.us-lcssa.us.us, !dbg !59, !llvm.loop !67 + +for.body.split.us.us: ; preds = %for.body.us + br label %for.body11.us.us, !dbg !59 + +for.inc.us-lcssa.us.us: ; preds = %cond.end.us.us + %k.1.lcssa.ph.us.us = phi i32 [ %conv15.us.us, %cond.end.us.us ] + %t.3.lcssa.ph.us.us = phi i32 [ %k.123.us.us, %cond.end.us.us ] + br label %for.inc.us, !dbg !72 + +for.body.for.body.split_crit_edge.us: ; preds = %for.body.us + br label %for.body.split.us33, !dbg !59 + +cleanup.loopexit.us-lcssa.us: ; preds = %for.inc.us + %inc.lcssa.ph.us = phi i32 [ %inc.us, %for.inc.us ] + %t.3.lcssa.lcssa.ph.us = phi i32 [ %t.3.lcssa.us, %for.inc.us ] + br label %cleanup.loopexit, !dbg !72 + +for.body.preheader.split: ; preds = %for.body.preheader.for.body.preheader.split_crit_edge + br label %for.body, !dbg !71 + +for.body: ; preds = %for.body.preheader.split, %for.inc + %inc24 = phi i32 [ %inc, %for.inc ], [ %g.promoted, %for.body.preheader.split ] + %k.0 = phi i32 [ %k.1.lcssa, %for.inc ], [ 0, %for.body.preheader.split ], !dbg !50 + call void @llvm.dbg.value(metadata !4, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %k.0, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body.split.us, label %for.body.for.body.split_crit_edge, !dbg !59 + +for.body.for.body.split_crit_edge: ; preds = %for.body + br label %for.body.split, !dbg !59 + +for.body.split.us: ; preds = %for.body + br label %for.body11.us, !dbg !59 + +for.body11.us: ; preds = %cond.end.us, %for.body.split.us + %k.123.us = phi i32 [ %k.0, %for.body.split.us ], [ %conv15.us, %cond.end.us ] + call void @llvm.dbg.value(metadata i32 %k.123.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 true, label %cond.false.us, label %cond.end.us, !dbg !62 + +cond.false.us: ; preds = %for.body11.us + %div.us = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end.us, !dbg !62 + +cond.end.us: ; preds = %cond.false.us, %for.body11.us + %cond.us = phi i32 [ %div.us, %cond.false.us ], [ %conv, %for.body11.us ], !dbg !62 + %sext.us = shl i32 %cond.us, 16, !dbg !66 + %conv15.us = ashr exact i32 %sext.us, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123.us, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15.us, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11.us, label %for.inc.us-lcssa.us, !dbg !59, !llvm.loop !67 + +for.inc.us-lcssa.us: ; preds = %cond.end.us + %k.1.lcssa.ph.us = phi i32 [ %conv15.us, %cond.end.us ] + %t.3.lcssa.ph.us = phi i32 [ %k.123.us, %cond.end.us ] + br label %for.inc, !dbg !72 + +for.body.split: ; preds = %for.body.for.body.split_crit_edge + br label %for.body11, !dbg !59 + +for.body11: ; preds = %for.body.split, %cond.end + %k.123 = phi i32 [ %k.0, %for.body.split ], [ %conv15, %cond.end ] + call void @llvm.dbg.value(metadata i32 %k.123, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %cond.false, label %cond.end, !dbg !62 + +cond.false: ; preds = %for.body11 + %div = sdiv i32 %conv, %1, !dbg !65 + br label %cond.end, !dbg !62 + +cond.end: ; preds = %for.body11, %cond.false + %cond = phi i32 [ %div, %cond.false ], [ %conv, %for.body11 ], !dbg !62 + %sext = shl i32 %cond, 16, !dbg !66 + %conv15 = ashr exact i32 %sext, 16, !dbg !66 + call void @llvm.dbg.value(metadata i32 %k.123, metadata !35, metadata !DIExpression()), !dbg !39 + call void @llvm.dbg.value(metadata i32 %conv15, metadata !36, metadata !DIExpression()), !dbg !50 + br i1 false, label %for.body11, label %for.inc.us-lcssa, !dbg !59, !llvm.loop !67 + +for.inc.us-lcssa: ; preds = %cond.end + %k.1.lcssa.ph = phi i32 [ %conv15, %cond.end ] + %t.3.lcssa.ph = phi i32 [ %k.123, %cond.end ] + br label %for.inc, !dbg !72 + +for.inc: ; preds = %for.inc.us-lcssa.us, %for.inc.us-lcssa + %k.1.lcssa = phi i32 [ %k.1.lcssa.ph, %for.inc.us-lcssa ], [ %k.1.lcssa.ph.us, %for.inc.us-lcssa.us ] + %t.3.lcssa = phi i32 [ %t.3.lcssa.ph, %for.inc.us-lcssa ], [ %t.3.lcssa.ph.us, %for.inc.us-lcssa.us ] + call void @llvm.dbg.value(metadata i32 %k.1.lcssa, metadata !36, metadata !DIExpression()), !dbg !50 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa, metadata !35, metadata !DIExpression()), !dbg !39 + %inc = add nsw i32 %inc24, 1, !dbg !61 + %tobool9.old = icmp eq i32 %inc, 0, !dbg !57 + br i1 %tobool9.old, label %cleanup.loopexit.us-lcssa, label %for.body, !dbg !57 + +cleanup.loopexit.us-lcssa: ; preds = %for.inc + %inc.lcssa.ph = phi i32 [ %inc, %for.inc ] + %t.3.lcssa.lcssa.ph = phi i32 [ %t.3.lcssa, %for.inc ] + br label %cleanup.loopexit, !dbg !72 + +cleanup.loopexit: ; preds = %cleanup.loopexit.us-lcssa.us, %cleanup.loopexit.us-lcssa + %inc.lcssa = phi i32 [ %inc.lcssa.ph, %cleanup.loopexit.us-lcssa ], [ %inc.lcssa.ph.us, %cleanup.loopexit.us-lcssa.us ] + %t.3.lcssa.lcssa = phi i32 [ %t.3.lcssa.lcssa.ph, %cleanup.loopexit.us-lcssa ], [ %t.3.lcssa.lcssa.ph.us, %cleanup.loopexit.us-lcssa.us ] + store i32 14, i32* @d, align 4, !dbg !72, !tbaa !40 + store i32 %inc.lcssa, i32* @g, align 4, !dbg !61, !tbaa !40 + call void @llvm.dbg.value(metadata i32 %t.3.lcssa.lcssa, metadata !35, metadata !DIExpression()), !dbg !39 + br label %cleanup + +cleanup: ; preds = %cleanup.loopexit, %if.end4, %while.body + %t.5 = phi i32 [ %t.1, %while.body ], [ %t.1, %if.end4 ], [ %t.3.lcssa.lcssa, %cleanup.loopexit ], !dbg !39 + %cleanup.dest.slot.0 = phi i1 [ false, %while.body ], [ true, %if.end4 ], [ true, %cleanup.loopexit ] + call void @llvm.dbg.value(metadata i32 %t.5, metadata !35, metadata !DIExpression()), !dbg !39 + br i1 %cleanup.dest.slot.0, label %while.cond, label %L.loopexit.us-lcssa, !llvm.loop !69 + +while.end.us-lcssa: ; preds = %while.cond + br label %while.end, !dbg !73 + +while.end: ; preds = %while.end.us-lcssa.us, %while.end.us-lcssa + br label %while.end.split, !dbg !73 + +while.end.split: ; preds = %if.end.while.end.split_crit_edge, %while.end + ret void, !dbg !73 +} + +; Function Attrs: nounwind readnone speculatable +declare void @llvm.dbg.value(metadata, metadata, metadata) #1 + +attributes #0 = { nounwind ssp uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone speculatable } + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!25, !26, !27, !28} +!llvm.ident = !{!29} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "c", scope: !2, file: !3, line: 3, type: !11, isLocal: false, isDefinition: true) +!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 7.0.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5) +!3 = !DIFile(filename: "blah.c", directory: "/Users/davide/work/llvm-monorepo/build-release/bin") +!4 = !{} +!5 = !{!6, !9, !0, !12, !14, !16, !18} +!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) +!7 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 1, type: !8, isLocal: false, isDefinition: true) +!8 = !DIBasicType(name: "short", size: 16, encoding: DW_ATE_signed) +!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression()) +!10 = distinct !DIGlobalVariable(name: "e", scope: !2, file: !3, line: 2, type: !11, isLocal: true, isDefinition: true) +!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!12 = !DIGlobalVariableExpression(var: !13, expr: !DIExpression()) +!13 = distinct !DIGlobalVariable(name: "d", scope: !2, file: !3, line: 3, type: !11, isLocal: false, isDefinition: true) +!14 = !DIGlobalVariableExpression(var: !15, expr: !DIExpression()) +!15 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 3, type: !11, isLocal: false, isDefinition: true) +!16 = !DIGlobalVariableExpression(var: !17, expr: !DIExpression()) +!17 = distinct !DIGlobalVariable(name: "h", scope: !2, file: !3, line: 3, type: !11, isLocal: false, isDefinition: true) +!18 = !DIGlobalVariableExpression(var: !19, expr: !DIExpression()) +!19 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 2, type: !20, isLocal: true, isDefinition: true) +!20 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 2016, elements: !21) +!21 = !{!22, !23} +!22 = !DISubrange(count: 7) +!23 = !DISubrange(count: 9) +!24 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression(DW_OP_deref, DW_OP_constu, 8, DW_OP_mul, DW_OP_constu, 0, DW_OP_plus, DW_OP_stack_value)) +!25 = !{i32 2, !"Dwarf Version", i32 4} +!26 = !{i32 2, !"Debug Info Version", i32 3} +!27 = !{i32 1, !"wchar_size", i32 4} +!28 = !{i32 7, !"PIC Level", i32 2} +!29 = !{!"clang version 7.0.0 "} +!30 = distinct !DISubprogram(name: "f", scope: !3, file: !3, line: 5, type: !31, isLocal: false, isDefinition: true, scopeLine: 6, isOptimized: true, unit: !2, variables: !33) +!31 = !DISubroutineType(types: !32) +!32 = !{null} +!33 = !{!34, !35, !36, !38} +!34 = !DILocalVariable(name: "j", scope: !30, file: !3, line: 7, type: !8) +!35 = !DILocalVariable(name: "t", scope: !30, file: !3, line: 8, type: !11) +!36 = !DILocalVariable(name: "k", scope: !37, file: !3, line: 15, type: !11) +!37 = distinct !DILexicalBlock(scope: !30, file: !3, line: 14, column: 5) +!38 = !DILocalVariable(name: "i", scope: !37, file: !3, line: 15, type: !11) +!39 = !DILocation(line: 8, column: 7, scope: !30) +!40 = !{!41, !41, i64 0} +!41 = !{!"int", !42, i64 0} +!42 = !{!"omnipotent char", !43, i64 0} +!43 = !{!"Simple C/C++ TBAA"} +!44 = !DILocation(line: 8, column: 3, scope: !30) +!45 = !DILocation(line: 10, column: 7, scope: !46) +!46 = distinct !DILexicalBlock(scope: !30, file: !3, line: 10, column: 7) +!47 = !DILocation(line: 10, column: 7, scope: !30) +!48 = !DILocation(line: 11, column: 5, scope: !46) +!49 = !DILocation(line: 13, column: 3, scope: !30) +!50 = !DILocation(line: 15, column: 11, scope: !37) +!51 = !DILocation(line: 15, column: 18, scope: !37) +!52 = !DILocation(line: 16, column: 11, scope: !37) +!53 = !DILocation(line: 19, column: 10, scope: !54) +!54 = distinct !DILexicalBlock(scope: !55, file: !3, line: 19, column: 3) +!55 = distinct !DILexicalBlock(scope: !56, file: !3, line: 19, column: 3) +!56 = distinct !DILexicalBlock(scope: !37, file: !3, line: 18, column: 11) +!57 = !DILocation(line: 19, column: 3, scope: !55) +!58 = !DILocation(line: 18, column: 11, scope: !37) +!59 = !DILocation(line: 20, column: 5, scope: !60) +!60 = distinct !DILexicalBlock(scope: !54, file: !3, line: 20, column: 5) +!61 = !DILocation(line: 19, column: 14, scope: !54) +!62 = !DILocation(line: 23, column: 13, scope: !63) +!63 = distinct !DILexicalBlock(scope: !64, file: !3, line: 21, column: 7) +!64 = distinct !DILexicalBlock(scope: !60, file: !3, line: 20, column: 5) +!65 = !DILocation(line: 23, column: 23, scope: !63) +!66 = !DILocation(line: 24, column: 13, scope: !63) +!67 = distinct !{!67, !59, !68} +!68 = !DILocation(line: 26, column: 7, scope: !60) +!69 = distinct !{!69, !49, !70} +!70 = !DILocation(line: 27, column: 5, scope: !30) +!71 = !DILocation(line: 20, column: 10, scope: !60) +!72 = !DILocation(line: 0, scope: !63) +!73 = !DILocation(line: 28, column: 1, scope: !30)