From: Max Kazantsev Date: Fri, 25 Jan 2019 05:05:02 +0000 (+0000) Subject: [LoopSimplifyCFG] Fix inconsistency in blocks in loop markup X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e5647968411626620c3ab97c5732100b00e0589;p=llvm [LoopSimplifyCFG] Fix inconsistency in blocks in loop markup 2nd part of D57095 with the same reason, just in another place. We never fold branches that are not immediately in the current loop, but this check is missing in `IsEdgeLive` As result, it may think that the edge in subloop is dead while it's live. It's a pessimization in the current stance. Differential Revision: https://reviews.llvm.org/D57147 Reviewed By: rupprecht git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352170 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 669faf5aa18..85b6444d33d 100644 --- a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -239,7 +239,7 @@ private: if (!LiveLoopBlocks.count(From)) return false; BasicBlock *TheOnlySucc = getOnlyLiveSuccessor(From); - return !TheOnlySucc || TheOnlySucc == To; + return !TheOnlySucc || TheOnlySucc == To || LI.getLoopFor(From) != &L; }; // The loop will not be destroyed if its latch is live. diff --git a/test/Transforms/LoopSimplifyCFG/live_block_marking.ll b/test/Transforms/LoopSimplifyCFG/live_block_marking.ll index f15f626d5d3..344871c79ae 100644 --- a/test/Transforms/LoopSimplifyCFG/live_block_marking.ll +++ b/test/Transforms/LoopSimplifyCFG/live_block_marking.ll @@ -4,11 +4,13 @@ ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -passes='require,loop(indvars,simplify-cfg)' -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s ; RUN: opt -S -enable-loop-simplifycfg-term-folding=true -indvars -loop-simplifycfg -enable-mssa-loop-dependency=true -verify-memoryssa -debug-only=loop-simplifycfg -verify-loop-info -verify-dom-info -verify-loop-lcssa 2>&1 < %s | FileCheck %s -; This test demonstrates a bug in live blocks markup that is only catchable in -; inter-pass interaction. define void @test(i1 %c) { ; CHECK-LABEL: @test( ; CHECK-NEXT: entry: +; CHECK-NEXT: switch i32 0, label [[ENTRY_SPLIT:%.*]] [ +; CHECK-NEXT: i32 1, label [[DEAD_EXIT:%.*]] +; CHECK-NEXT: ] +; CHECK: entry-split: ; CHECK-NEXT: br label [[OUTER:%.*]] ; CHECK: outer: ; CHECK-NEXT: br i1 [[C:%.*]], label [[TO_FOLD:%.*]], label [[LATCH:%.*]] @@ -25,7 +27,7 @@ define void @test(i1 %c) { ; CHECK: latch.loopexit: ; CHECK-NEXT: br label [[LATCH]] ; CHECK: latch: -; CHECK-NEXT: br i1 true, label [[OUTER]], label [[DEAD_EXIT:%.*]] +; CHECK-NEXT: br label [[OUTER]] ; CHECK: dead_exit: ; CHECK-NEXT: ret void ;