summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2016-11-02 08:55:19 +0000
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2016-11-02 08:55:19 +0000
commit7424c8ccd17b3c8e28d048cd13322d665154bb7a (patch)
tree08df843a6994c6d950e1cb50008ad7be2cad72ff /llvm/test
parent50e59f3b60d05006fc08ecb0a31eacc57c6373ed (diff)
downloadbcm5719-llvm-7424c8ccd17b3c8e28d048cd13322d665154bb7a.tar.gz
bcm5719-llvm-7424c8ccd17b3c8e28d048cd13322d665154bb7a.zip
[Reassociate] Skip analysis of dead code to avoid infinite loop.
Summary: It was detected that the reassociate pass could enter an inifite loop when analysing dead code. Simply skipping to analyse basic blocks that are dead avoids such problems (and as a side effect we avoid spending time on optimising dead code). The solution is using the same Reverse Post Order ordering of the basic blocks when doing the optimisations, as when building the precalculated rank map. A nice side-effect of this solution is that we now know that we only try to do optimisations for blocks with ranked instructions. Fixes https://llvm.org/bugs/show_bug.cgi?id=30818 Reviewers: llvm-commits, davide, eli.friedman, mehdi_amini Subscribers: dberlin Differential Revision: https://reviews.llvm.org/D26154 llvm-svn: 285793
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/Reassociate/deadcode.ll37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Reassociate/deadcode.ll b/llvm/test/Transforms/Reassociate/deadcode.ll
new file mode 100644
index 00000000000..866cf64d2a1
--- /dev/null
+++ b/llvm/test/Transforms/Reassociate/deadcode.ll
@@ -0,0 +1,37 @@
+; RUN: opt < %s -reassociate -disable-output
+
+; It has been detected that dead loops like the one in this test case can be
+; created by -jump-threading (it was detected by a csmith generated program).
+;
+; According to -verify this is valid input (even if it could be discussed if
+; the dead loop really satisfies SSA form).
+;
+; The problem found was that the -reassociate pass ends up in an infinite loop
+; when analysing the 'deadloop1' basic block. See "Bugzilla - Bug 30818".
+define void @deadloop1() {
+ br label %endlabel
+
+deadloop1:
+ %1 = xor i32 %2, 7
+ %2 = xor i32 %1, 8
+ br label %deadloop1
+
+endlabel:
+ ret void
+}
+
+
+; Another example showing that dead code could result in infinite loops in
+; reassociate pass. See "Bugzilla - Bug 30818".
+define void @deadloop2() {
+ br label %endlabel
+
+deadloop2:
+ %1 = and i32 %2, 7
+ %2 = and i32 %3, 8
+ %3 = and i32 %1, 6
+ br label %deadloop2
+
+endlabel:
+ ret void
+}
OpenPOWER on IntegriCloud