mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-27 17:31:33 +00:00
Allow merging multiple store sequences on the same chain.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f39eab91b6
commit
a569a80e58
@ -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…
x
Reference in New Issue
Block a user