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:
parent
4e6d511382
commit
201348aa5e
@ -8157,8 +8157,21 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
||||
|
||||
// Only perform this optimization before the types are legal, because we
|
||||
// don't want to perform this optimization on every DAGCombine invocation.
|
||||
if (!LegalTypes && MergeConsecutiveStores(ST))
|
||||
return SDValue(N, 0);
|
||||
if (!LegalTypes) {
|
||||
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);
|
||||
}
|
||||
|
31
test/CodeGen/X86/2012-12-1-merge-multiple.ll
Normal file
31
test/CodeGen/X86/2012-12-1-merge-multiple.ll
Normal 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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user