mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +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:
parent
6dc868581b
commit
e6987587d6
@ -5172,12 +5172,25 @@ CheckForMaskedLoad(SDValue V, SDValue Ptr, SDValue Chain) {
|
|||||||
!ISD::isNormalLoad(V->getOperand(0).getNode()))
|
!ISD::isNormalLoad(V->getOperand(0).getNode()))
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
// Check the chain and pointer. The store should be chained directly to the
|
// Check the chain and pointer.
|
||||||
// load (TODO: Or through a TF node!) since it's to the same address.
|
|
||||||
LoadSDNode *LD = cast<LoadSDNode>(V->getOperand(0));
|
LoadSDNode *LD = cast<LoadSDNode>(V->getOperand(0));
|
||||||
if (LD->getBasePtr() != Ptr ||
|
if (LD->getBasePtr() != Ptr) return Result; // Not from same pointer.
|
||||||
V->getOperand(0).getNode() != Chain.getNode())
|
|
||||||
return Result;
|
// 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.
|
// This only handles simple types.
|
||||||
if (V.getValueType() != MVT::i16 &&
|
if (V.getValueType() != MVT::i16 &&
|
||||||
|
@ -105,3 +105,23 @@ entry:
|
|||||||
; X32: movb 8(%esp), %al
|
; X32: movb 8(%esp), %al
|
||||||
; X32: movb %al, 5(%{{.*}})
|
; X32: movb %al, 5(%{{.*}})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i32 @test7(i64* nocapture %a0, i8 zeroext %a1, i32* %P2) nounwind {
|
||||||
|
entry:
|
||||||
|
%OtherLoad = load i32 *%P2
|
||||||
|
%A = load i64* %a0, align 4
|
||||||
|
%B = and i64 %A, -280375465082881 ; 0xFFFF00FFFFFFFFFF
|
||||||
|
%C = zext i8 %a1 to i64
|
||||||
|
%CS = shl i64 %C, 40
|
||||||
|
%D = or i64 %B, %CS
|
||||||
|
store i64 %D, i64* %a0, align 4
|
||||||
|
ret i32 %OtherLoad
|
||||||
|
; X64: test7:
|
||||||
|
; X64: movb %sil, 5(%rdi)
|
||||||
|
|
||||||
|
|
||||||
|
; X32: test7:
|
||||||
|
; X32: movb 8(%esp), %cl
|
||||||
|
; X32: movb %cl, 5(%{{.*}})
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user