mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
[AArch64] Teach DAGCombiner that converting two consecutive loads into a vector load is not a good transform when paired loads are available.
The combiner was creating Q-register loads and stores, which then had to be spilled because there are no callee-save Q registers! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214634 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
caf471e820
commit
e411c38de9
@ -9414,6 +9414,13 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {
|
||||
if (LoadNodes.size() < 2)
|
||||
return false;
|
||||
|
||||
// If we have load/store pair instructions and we only have two values,
|
||||
// don't bother.
|
||||
unsigned RequiredAlignment;
|
||||
if (LoadNodes.size() == 2 && TLI.hasPairedLoad(MemVT, RequiredAlignment) &&
|
||||
St->getAlignment() >= RequiredAlignment)
|
||||
return false;
|
||||
|
||||
// Scan the memory operations on the chain and find the first non-consecutive
|
||||
// load memory address. These variables hold the index in the store node
|
||||
// array.
|
||||
|
16
test/CodeGen/AArch64/paired-load.ll
Normal file
16
test/CodeGen/AArch64/paired-load.ll
Normal file
@ -0,0 +1,16 @@
|
||||
; RUN: llc < %s | FileCheck %s
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "arm64-apple-ios5.0.0"
|
||||
|
||||
; Ensure we're generating ldp instructions instead of ldr Q.
|
||||
; CHECK: ldp
|
||||
; CHECK: stp
|
||||
define void @f(i64* %p, i64* %q) {
|
||||
%addr2 = getelementptr i64* %q, i32 1
|
||||
%addr = getelementptr i64* %p, i32 1
|
||||
%x = load i64* %p
|
||||
%y = load i64* %addr
|
||||
store i64 %x, i64* %q
|
||||
store i64 %y, i64* %addr2
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user