summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LCSSA
diff options
context:
space:
mode:
authorDaniil Suchkov <suc-daniil@yandex.ru>2019-11-21 17:56:02 +0700
committerDaniil Suchkov <suc-daniil@yandex.ru>2019-12-06 13:21:49 +0700
commitc4d8c6319f576a7540017168db2f0440691914f4 (patch)
tree33303d59ca13b28272bb005b4273688a30ae1385 /llvm/test/Transforms/LCSSA
parentda650094b187ee3c8017d74f63c885663faca1d8 (diff)
downloadbcm5719-llvm-c4d8c6319f576a7540017168db2f0440691914f4.tar.gz
bcm5719-llvm-c4d8c6319f576a7540017168db2f0440691914f4.zip
[LCSSA] Don't use VH callbacks to invalidate SCEV when creating LCSSA phis
In general ValueHandleBase::ValueIsRAUWd shouldn't be called when not all uses of the value were actually replaced, though, currently formLCSSAForInstructions calls it when it inserts LCSSA-phis. Calls of ValueHandleBase::ValueIsRAUWd were added to LCSSA specifically to update/invalidate SCEV. In the best case these calls duplicate some of the work already done by SE->forgetValue, though in case when SCEV of the value is SCEVUnknown, SCEV replaces the underlying value of SCEVUnknown with the new value (i.e. acts like LCSSA-phi actually fully replaces the value it is created for), which leads to SCEV being corrupted because LCSSA-phi rarely dominates all uses of its inputs. Fixes bug https://bugs.llvm.org/show_bug.cgi?id=44058. Reviewers: fhahn, efriedma, reames, sanjoy.google Reviewed By: fhahn Subscribers: hiraditya, javed.absar, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70593
Diffstat (limited to 'llvm/test/Transforms/LCSSA')
-rw-r--r--llvm/test/Transforms/LCSSA/pr44058.ll37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LCSSA/pr44058.ll b/llvm/test/Transforms/LCSSA/pr44058.ll
new file mode 100644
index 00000000000..b6fa92ab7cb
--- /dev/null
+++ b/llvm/test/Transforms/LCSSA/pr44058.ll
@@ -0,0 +1,37 @@
+; RUN: opt -passes="verify<scalar-evolution>,lcssa,verify<scalar-evolution>" -verify-scev-strict -S %s
+
+; The first SCEV verification is required because it queries SCEV and populates
+; SCEV caches. Second SCEV verification checks if the caches are in valid state.
+
+; Check that the second SCEV verification doesn't fail.
+define void @foo(i32* %arg, i32* %arg1, i1 %arg2) {
+bb:
+ br label %bb3
+
+bb3: ; preds = %bb13, %bb
+ %tmp = load i32, i32* %arg
+ %tmp4 = load i32, i32* %arg1
+ %tmp5 = add i32 %tmp4, %tmp
+ %tmp6 = icmp sgt i32 %tmp5, %tmp
+ br i1 %tmp6, label %bb7, label %bb11
+
+bb7: ; preds = %bb3
+ br i1 %arg2, label %bb10, label %bb8
+
+bb8: ; preds = %bb7
+ %tmp9 = add nsw i32 %tmp, 1
+ ret void
+
+bb10: ; preds = %bb7
+ br label %bb11
+
+bb11: ; preds = %bb10, %bb3
+ %tmp12 = phi i32 [ 0, %bb3 ], [ %tmp4, %bb10 ]
+ br label %bb13
+
+bb13: ; preds = %bb13, %bb11
+ %tmp14 = phi i32 [ %tmp15, %bb13 ], [ 0, %bb11 ]
+ %tmp15 = add nuw nsw i32 %tmp14, 1
+ %tmp16 = icmp slt i32 %tmp15, %tmp12
+ br i1 %tmp16, label %bb13, label %bb3
+}
OpenPOWER on IntegriCloud