From: Krzysztof Parzyszek Date: Tue, 13 Sep 2016 14:36:55 +0000 (+0000) Subject: [Hexagon] Clear the flow queue after visiting a single instruction X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b558ae21255e427b97b49e6490e9eeca0fecff48;p=platform%2Fupstream%2Fllvm.git [Hexagon] Clear the flow queue after visiting a single instruction llvm-svn: 281339 --- diff --git a/llvm/lib/Target/Hexagon/BitTracker.cpp b/llvm/lib/Target/Hexagon/BitTracker.cpp index 29b2d9f..c0591c3 100644 --- a/llvm/lib/Target/Hexagon/BitTracker.cpp +++ b/llvm/lib/Target/Hexagon/BitTracker.cpp @@ -1054,6 +1054,11 @@ void BT::visit(const MachineInstr &MI) { assert(!MI.isBranch() && "Only non-branches are allowed"); InstrExec.insert(&MI); visitNonBranch(MI); + // The call to visitNonBranch could propagate the changes until a branch + // is actually visited. This could result in adding CFG edges to the flow + // queue. Since the queue won't be processed, clear it. + while (!FlowQ.empty()) + FlowQ.pop(); } diff --git a/llvm/test/CodeGen/Hexagon/bit-visit-flowq.ll b/llvm/test/CodeGen/Hexagon/bit-visit-flowq.ll new file mode 100644 index 0000000..b44847d --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/bit-visit-flowq.ll @@ -0,0 +1,47 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s +; REQUIRES: asserts + +; Check that we don't crash. +; CHECK: call bar + +target triple = "hexagon" + +@debug = external hidden unnamed_addr global i1, align 4 + +; Function Attrs: nounwind +define void @foo() local_unnamed_addr #0 { +entry: + br label %if.end5 + +if.end5: ; preds = %entry + br i1 undef, label %if.then12, label %if.end13 + +if.then12: ; preds = %if.end5 + unreachable + +if.end13: ; preds = %if.end5 + br label %for.cond + +for.cond: ; preds = %if.end13 + %or.cond288 = or i1 undef, undef + br i1 undef, label %if.then44, label %if.end51 + +if.then44: ; preds = %for.cond + tail call void @bar() #0 + br label %if.end51 + +if.end51: ; preds = %if.then44, %for.cond + %.b433 = load i1, i1* @debug, align 4 + %or.cond290 = and i1 %or.cond288, %.b433 + br i1 %or.cond290, label %if.then55, label %if.end63 + +if.then55: ; preds = %if.end51 + unreachable + +if.end63: ; preds = %if.end51 + unreachable +} + +declare void @bar() local_unnamed_addr #0 + +attributes #0 = { nounwind }