diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-09-13 14:36:55 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-09-13 14:36:55 +0000 |
commit | b558ae21255e427b97b49e6490e9eeca0fecff48 (patch) | |
tree | 6a6434070d5a05940aae4b21ffe1d925a36af54c | |
parent | 10897f1807610802f9b5cdc0f6792adece7bfd3f (diff) | |
download | bcm5719-llvm-b558ae21255e427b97b49e6490e9eeca0fecff48.tar.gz bcm5719-llvm-b558ae21255e427b97b49e6490e9eeca0fecff48.zip |
[Hexagon] Clear the flow queue after visiting a single instruction
llvm-svn: 281339
-rw-r--r-- | llvm/lib/Target/Hexagon/BitTracker.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/bit-visit-flowq.ll | 47 |
2 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/BitTracker.cpp b/llvm/lib/Target/Hexagon/BitTracker.cpp index 29b2d9f9429..c0591c332de 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 00000000000..b44847dee68 --- /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 } |