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)