[PATCH] D47139: [NaryReassociate] Detect deleted instr with WeakTrackingVH
Karl-Johan Karlsson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 23 00:23:42 PDT 2018
Ka-Ka updated this revision to Diff 148166.
Ka-Ka marked 2 inline comments as done.
Ka-Ka added a comment.
The reason for me to use WeakTrackingVH instead of WeakVH from the beginning was only that it was used elsewhere in the file. However as you point out WeakVH should be fine as RAUW is not used in RecursivelyDeleteTriviallyDeadInstructions(). I adjust the code to use WeakVH.
I did considered using the lazy approach. I actually tried it out, but it seems like the algorithm used here actually require RecursivelyDeleteTriviallyDeadInstructions to be used in the loop. I end up with infinite loops when trying the lazy approach. As I'm not really familiar with the the algorithm used, I instead made this minimal change to fix the problem I saw in pr37539.
I updated the testcase according to what was suggested in the review.
Repository:
rL LLVM
https://reviews.llvm.org/D47139
Files:
lib/Transforms/Scalar/NaryReassociate.cpp
test/Transforms/NaryReassociate/pr37539.ll
Index: test/Transforms/NaryReassociate/pr37539.ll
===================================================================
--- /dev/null
+++ test/Transforms/NaryReassociate/pr37539.ll
@@ -0,0 +1,29 @@
+; RUN: opt < %s -nary-reassociate -S -o - | FileCheck %s
+
+; The test check that compilation does not segv (see pr37539).
+
+define void @f1() {
+; CHECK-LABEL: @f1(
+; CHECK-NEXT: br label %[[BB1:.*]]
+; CHECK: [[BB1]]
+; CHECK-NEXT: [[P1:%.*]] = phi i16 [ 0, [[TMP0:%.*]] ], [ [[A1:%.*]], %[[BB1]] ]
+; CHECK-NEXT: [[SCEVGEP_OFFS:%.*]] = add i16 2, 0
+; CHECK-NEXT: [[A1]] = add i16 [[P1]], [[SCEVGEP_OFFS]]
+; CHECK-NEXT: br i1 false, label %[[BB1]], label %[[BB7:.*]]
+; CHECK: [[BB7]]
+; CHECK-NEXT: ret void
+;
+ br label %bb1
+
+bb1:
+ %p1 = phi i16 [ 0, %0 ], [ %a1, %bb1 ]
+ %p2 = phi i16 [ 0, %0 ], [ %a2, %bb1 ]
+ %scevgep.offs = add i16 2, 0
+ %a1 = add i16 %p1, %scevgep.offs
+ %scevgep.offs5 = add i16 2, 0
+ %a2 = add i16 %p2, %scevgep.offs5
+ br i1 false, label %bb1, label %bb7
+
+bb7:
+ ret void
+}
Index: lib/Transforms/Scalar/NaryReassociate.cpp
===================================================================
--- lib/Transforms/Scalar/NaryReassociate.cpp
+++ lib/Transforms/Scalar/NaryReassociate.cpp
@@ -240,10 +240,17 @@
Changed = true;
SE->forgetValue(&*I);
I->replaceAllUsesWith(NewI);
- // If SeenExprs constains I's WeakTrackingVH, that entry will be
- // replaced with
- // nullptr.
+ WeakVH NewIExist = NewI;
+ // If SeenExprs/NewIExist contains I's WeakTrackingVH/WeakVH, that
+ // entry will be replaced with nullptr if deleted.
RecursivelyDeleteTriviallyDeadInstructions(&*I, TLI);
+ if (!NewIExist) {
+ // Rare occation where the new instruction (NewI) have been removed,
+ // probably due to parts of the input code was dead from the
+ // beginning, reset the iterator and start over from the beginning
+ I = BB->begin();
+ continue;
+ }
I = NewI->getIterator();
}
// Add the rewritten instruction to SeenExprs; the original instruction
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47139.148166.patch
Type: text/x-patch
Size: 2216 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180523/1c8c333b/attachment.bin>
More information about the llvm-commits
mailing list