mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
enhance the load/store narrowing optimization to handle a
tokenfactor in between the load/store. This allows us to
optimize test7 into:
_test7: ## @test7
## BB#0: ## %entry
movl (%rdx), %eax
## kill: SIL<def> ESI<kill>
movb %sil, 5(%rdi)
ret
instead of:
_test7: ## @test7
## BB#0: ## %entry
movl 4(%esp), %ecx
movl $-65281, %eax ## imm = 0xFFFFFFFFFFFF00FF
andl 4(%ecx), %eax
movzbl 8(%esp), %edx
shll $8, %edx
addl %eax, %edx
movl 12(%esp), %eax
movl (%eax), %eax
movl %edx, 4(%ecx)
ret
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101355 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -5172,12 +5172,25 @@ CheckForMaskedLoad(SDValue V, SDValue Ptr, SDValue Chain) {
|
||||
!ISD::isNormalLoad(V->getOperand(0).getNode()))
|
||||
return Result;
|
||||
|
||||
// Check the chain and pointer. The store should be chained directly to the
|
||||
// load (TODO: Or through a TF node!) since it's to the same address.
|
||||
// Check the chain and pointer.
|
||||
LoadSDNode *LD = cast<LoadSDNode>(V->getOperand(0));
|
||||
if (LD->getBasePtr() != Ptr ||
|
||||
V->getOperand(0).getNode() != Chain.getNode())
|
||||
return Result;
|
||||
if (LD->getBasePtr() != Ptr) return Result; // Not from same pointer.
|
||||
|
||||
// The store should be chained directly to the load or be an operand of a
|
||||
// tokenfactor.
|
||||
if (LD == Chain.getNode())
|
||||
; // ok.
|
||||
else if (Chain->getOpcode() != ISD::TokenFactor)
|
||||
return Result; // Fail.
|
||||
else {
|
||||
bool isOk = false;
|
||||
for (unsigned i = 0, e = Chain->getNumOperands(); i != e; ++i)
|
||||
if (Chain->getOperand(i).getNode() == LD) {
|
||||
isOk = true;
|
||||
break;
|
||||
}
|
||||
if (!isOk) return Result;
|
||||
}
|
||||
|
||||
// This only handles simple types.
|
||||
if (V.getValueType() != MVT::i16 &&
|
||||
|
||||
Reference in New Issue
Block a user