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

Allow merging multiple store sequences on the same chain.

llvm-svn: 169111
This commit is contained in:
Nadav Rotem 2012-12-02 17:14:09 +00:00
parent 4e6d511382
commit 201348aa5e
2 changed files with 46 additions and 2 deletions

View File

@ -8157,8 +8157,21 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
// Only perform this optimization before the types are legal, because we // Only perform this optimization before the types are legal, because we
// don't want to perform this optimization on every DAGCombine invocation. // don't want to perform this optimization on every DAGCombine invocation.
if (!LegalTypes && MergeConsecutiveStores(ST)) if (!LegalTypes) {
return SDValue(N, 0); bool EverChanged = false;
do {
// There can be multiple store sequences on the same chain.
// Keep trying to merge store sequences until we are unable to do so
// or until we merge the last store on the chain.
bool Changed = MergeConsecutiveStores(ST);
EverChanged |= Changed;
if (!Changed) break;
} while (ST->getOpcode() != ISD::DELETED_NODE);
if (EverChanged)
return SDValue(N, 0);
}
return ReduceLoadOpStoreWidth(N); return ReduceLoadOpStoreWidth(N);
} }

View File

@ -0,0 +1,31 @@
; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-pc-win64 | FileCheck %s
; CHECK: multiple_stores_on_chain
; CHECK: movabsq
; CHECK: movq
; CHECK: movabsq
; CHECK: movq
; CHECK: ret
define void @multiple_stores_on_chain(i16 * %A) {
entry:
%a0 = getelementptr inbounds i16* %A, i64 0
%a1 = getelementptr inbounds i16* %A, i64 1
%a2 = getelementptr inbounds i16* %A, i64 2
%a3 = getelementptr inbounds i16* %A, i64 3
%a4 = getelementptr inbounds i16* %A, i64 4
%a5 = getelementptr inbounds i16* %A, i64 5
%a6 = getelementptr inbounds i16* %A, i64 6
%a7 = getelementptr inbounds i16* %A, i64 7
store i16 0, i16* %a0
store i16 1, i16* %a1
store i16 2, i16* %a2
store i16 3, i16* %a3
store i16 4, i16* %a4
store i16 5, i16* %a5
store i16 6, i16* %a6
store i16 7, i16* %a7
ret void
}