[llvm] r320956 - [CGP] Fix the handling select inst in complex addressing mode

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 17 20:25:07 PST 2017


Author: skatkov
Date: Sun Dec 17 20:25:07 2017
New Revision: 320956

URL: http://llvm.org/viewvc/llvm-project?rev=320956&view=rev
Log:
[CGP] Fix the handling select inst in complex addressing mode

When we put the value in select placeholder we must pass
the value through simplification tracker due to the value might
be already simplified and erased.

This is a fix for PR35658.

Reviewers: john.brawn, uabelho
Reviewed By: john.brawn
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D41251

Added:
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll
Modified:
    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp

Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=320956&r1=320955&r2=320956&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Sun Dec 17 20:25:07 2017
@@ -2988,13 +2988,13 @@ private:
                                               ? CurrentBlock
                                               : nullptr };
         assert(Map.find(TrueItem) != Map.end() && "No True Value!");
-        Select->setTrueValue(Map[TrueItem]);
+        Select->setTrueValue(ST.Get(Map[TrueItem]));
         auto *FalseValue = CurrentSelect->getFalseValue();
         ValueInBB FalseItem = { FalseValue, isa<Instruction>(FalseValue)
                                                 ? CurrentBlock
                                                 : nullptr };
         assert(Map.find(FalseItem) != Map.end() && "No False Value!");
-        Select->setFalseValue(Map[FalseItem]);
+        Select->setFalseValue(ST.Get(Map[FalseItem]));
       } else {
         // Must be a Phi node then.
         PHINode *PHI = cast<PHINode>(V);

Added: llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll?rev=320956&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll (added)
+++ llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll Sun Dec 17 20:25:07 2017
@@ -0,0 +1,21 @@
+; RUN: opt -S -codegenprepare -disable-complex-addr-modes=false -addr-sink-new-phis=true -addr-sink-new-select=true  %s | FileCheck %s
+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 @f2() {
+entry:
+  %arraydecay = getelementptr inbounds [2 x i16], [2 x i16]* undef, i16 0, i16 0
+  %arrayidx1 = getelementptr inbounds [2 x i16], [2 x i16]* undef, i16 0, i16 1
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %e.03 = phi i16* [ %arraydecay, %entry ], [ %arrayidx1, %for.body ]
+  %tobool = icmp eq i16 undef, 0
+  br i1 undef, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+; CHECK: sunkaddr
+  %e.1.le = select i1 %tobool, i16* %arrayidx1, i16* %e.03
+  store i16 0, i16* %e.1.le, align 1
+  ret void
+}




More information about the llvm-commits mailing list