[PATCH] D43758: [CGP] Fix the remove of matched phis in complex addressing mode

Serguei Katkov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 26 02:25:43 PST 2018


skatkov created this revision.
skatkov added reviewers: john.brawn, reames.

When we replace the Phi we created with matched ones it is possible that
there are two identical phi nodes in IR. And matcher is smart enough to find that
new created phi matches both of them. So we try to replace our phi node with
matched ones twice and what is bad we delete our phi node twice causing a crash.

As soon as we found that we have two identical Phi nodes it makes sense to do
a clean-up and replace one phi node by other one.
The patch implements it.


https://reviews.llvm.org/D43758

Files:
  lib/CodeGen/CodeGenPrepare.cpp
  test/Transforms/CodeGenPrepare/X86/sink-addrmode-two-phi.ll


Index: test/Transforms/CodeGenPrepare/X86/sink-addrmode-two-phi.ll
===================================================================
--- /dev/null
+++ test/Transforms/CodeGenPrepare/X86/sink-addrmode-two-phi.ll
@@ -0,0 +1,27 @@
+; RUN: opt -S -codegenprepare -disable-complex-addr-modes=false  %s | FileCheck %s --check-prefix=CHECK
+target datalayout =
+"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @test() {
+entry:
+  %0 = getelementptr inbounds i64, i64 * null, i64 undef
+  br label %start
+
+start:
+  %val1 = phi i64 * [ %0, %entry ], [ %val4, %exit ]
+  %val2 = phi i64 * [ null, %entry ], [ %val5, %exit ]
+  br i1 false, label %slowpath, label %exit
+
+slowpath:
+  %elem1 = getelementptr inbounds i64, i64 * undef, i64 undef
+  br label %exit
+
+exit:
+; CHECK: sunkaddr
+  %val3 = phi i64 * [ undef, %slowpath ], [ %val2, %start ]
+  %val4 = phi i64 * [ %elem1, %slowpath ], [ %val1, %start ]
+  %val5 = phi i64 * [ undef, %slowpath ], [ %val2, %start ]
+  %loadx = load i64, i64 * %val4, align 8
+  br label %start
+}
Index: lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- lib/CodeGen/CodeGenPrepare.cpp
+++ lib/CodeGen/CodeGenPrepare.cpp
@@ -2947,11 +2947,20 @@
       }
       if (IsMatched) {
         // Replace all matched values and erase them.
+        DenseMap<PHINode *, PHINode *> DoneMatched;
         for (auto MV : Matched) {
+          auto AlreadyMatched = DoneMatched.find(MV.first);
+          if (AlreadyMatched != DoneMatched.end()) {
+            // We have phi node which matches to different
+            // but identiacal phis. So make a simplification then.
+            MV.first = MV.second;
+            MV.second = AlreadyMatched->second;
+          }
           MV.first->replaceAllUsesWith(MV.second);
           PhiNodesToMatch.erase(MV.first);
           ST.Put(MV.first, MV.second);
           MV.first->eraseFromParent();
+          DoneMatched.insert({ MV.first, MV.second });
         }
         Matched.clear();
         continue;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43758.135876.patch
Type: text/x-patch
Size: 2182 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180226/6cea20f6/attachment.bin>


More information about the llvm-commits mailing list