summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2017-02-07 23:59:07 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2017-02-07 23:59:07 +0000
commitec892139bda15b4e86d953d8fd3e70ffca83902d (patch)
treeccfef68f851d6928238ee2bf5d05c5ae0e2bfd85 /llvm/test/Transforms
parent165088aa5c1c694cd4085cda14f9df254dd7d442 (diff)
downloadbcm5719-llvm-ec892139bda15b4e86d953d8fd3e70ffca83902d.tar.gz
bcm5719-llvm-ec892139bda15b4e86d953d8fd3e70ffca83902d.zip
[IRCE] Add a missing invariant check
Currently IRCE relies on the loops it transforms to be (semantically) of the form: for (i = START; i < END; i++) ... or for (i = START; i > END; i--) ... However, we were not verifying the presence of the START < END entry check (i.e. check before the first iteration). We were only verifying that the backedge was guarded by (i + 1) < END. Usually this would work "fine" since (especially in Java) most loops do actually have the START < END check, but of course that is not guaranteed. llvm-svn: 294375
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/IRCE/bad-loop-structure.ll45
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/test/Transforms/IRCE/bad-loop-structure.ll b/llvm/test/Transforms/IRCE/bad-loop-structure.ll
new file mode 100644
index 00000000000..9c2e4251423
--- /dev/null
+++ b/llvm/test/Transforms/IRCE/bad-loop-structure.ll
@@ -0,0 +1,45 @@
+; RUN: opt -S -irce -irce-print-changed-loops=true < %s | FileCheck %s
+
+; CHECK-NOT: irce
+
+define void @bad_loop_structure_increasing(i64 %iv.start) {
+entry:
+ br label %for.body
+
+for.body:
+ %indvars.iv = phi i64 [ %iv.start, %entry ], [ %indvars.iv.next, %for.inc ]
+ %cmp = icmp ult i64 %indvars.iv, 100
+ br i1 %cmp, label %switch.lookup, label %for.inc
+
+switch.lookup:
+ br label %for.inc
+
+for.inc:
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+ %cmp55 = icmp slt i64 %indvars.iv.next, 11
+ br i1 %cmp55, label %for.body, label %for.end
+
+for.end:
+ ret void
+}
+
+define void @bad_loop_structure_decreasing(i64 %iv.start) {
+entry:
+ br label %for.body
+
+for.body:
+ %indvars.iv = phi i64 [ %iv.start, %entry ], [ %indvars.iv.next, %for.inc ]
+ %cmp = icmp ult i64 %indvars.iv, 100
+ br i1 %cmp, label %switch.lookup, label %for.inc
+
+switch.lookup:
+ br label %for.inc
+
+for.inc:
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, -1
+ %cmp55 = icmp sgt i64 %indvars.iv.next, 11
+ br i1 %cmp55, label %for.body, label %for.end
+
+for.end:
+ ret void
+}
OpenPOWER on IntegriCloud