mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Avoid creating a cycle when folding load / op with flag / store. PR11451474. rdar://11451474
llvm-svn: 156896
This commit is contained in:
parent
f5812a8109
commit
9a33fc17be
@ -1905,6 +1905,20 @@ static bool isLoadIncOrDecStore(StoreSDNode *StoreNode, unsigned Opc,
|
||||
ChainCheck = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Make sure using Op as part of the chain would not cause a cycle here.
|
||||
// In theory, we could check whether the chain node is a predecessor of
|
||||
// the load. But that can be very expensive. Instead visit the uses and
|
||||
// make sure they all have smaller node id than the load.
|
||||
int LoadId = LoadNode->getNodeId();
|
||||
for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
|
||||
UE = UI->use_end(); UI != UE; ++UI) {
|
||||
if (UI.getUse().getResNo() != 0)
|
||||
continue;
|
||||
if (UI->getNodeId() > LoadId)
|
||||
return false;
|
||||
}
|
||||
|
||||
ChainOps.push_back(Op);
|
||||
}
|
||||
|
||||
|
@ -177,3 +177,49 @@ if.end4:
|
||||
return:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Deal with TokenFactor chain
|
||||
; rdar://11236106
|
||||
@foo = external global i64*, align 8
|
||||
|
||||
define void @test3() nounwind ssp {
|
||||
entry:
|
||||
; CHECK: test3:
|
||||
; CHECK: decq 16(%rax)
|
||||
%0 = load i64** @foo, align 8
|
||||
%arrayidx = getelementptr inbounds i64* %0, i64 2
|
||||
%1 = load i64* %arrayidx, align 8
|
||||
%dec = add i64 %1, -1
|
||||
store i64 %dec, i64* %arrayidx, align 8
|
||||
%cmp = icmp eq i64 %dec, 0
|
||||
br i1 %cmp, label %if.then, label %if.end
|
||||
|
||||
if.then:
|
||||
tail call void @baz() nounwind
|
||||
br label %if.end
|
||||
|
||||
if.end:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @baz()
|
||||
|
||||
; Avoid creating a cycle in the DAG which would trigger an assert in the
|
||||
; scheduler.
|
||||
; PR12565
|
||||
; rdar://11451474
|
||||
@x = external global i32, align 4
|
||||
@y = external global i32, align 4
|
||||
@z = external global i32, align 4
|
||||
|
||||
define void @test4() nounwind uwtable ssp {
|
||||
entry:
|
||||
%0 = load i32* @x, align 4
|
||||
%1 = load i32* @y, align 4
|
||||
%dec = add nsw i32 %1, -1
|
||||
store i32 %dec, i32* @y, align 4
|
||||
%tobool.i = icmp ne i32 %dec, 0
|
||||
%cond.i = select i1 %tobool.i, i32 %0, i32 0
|
||||
store i32 %cond.i, i32* @z, align 4
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user