1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[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

llvm-svn: 320956
This commit is contained in:
Serguei Katkov 2017-12-18 04:25:07 +00:00
parent 2b28c31ebe
commit fb3e2e6057
2 changed files with 23 additions and 2 deletions

View File

@ -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);

View File

@ -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
}