mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-05 18:17:00 +00:00
Fold the PPCISD shifts when presented with 0 inputs. This occurs for code
like: long long test(long long X, int Y) { return 1ULL << Y; } long long test2(long long X, int Y) { return -1LL << Y; } which we used to compile to: _test: li r2, 1 subfic r3, r5, 32 li r4, 0 addi r6, r5, -32 srw r3, r2, r3 slw r4, r4, r5 slw r6, r2, r6 or r3, r4, r3 slw r4, r2, r5 or r3, r3, r6 blr _test2: li r2, -1 subfic r3, r5, 32 addi r6, r5, -32 srw r3, r2, r3 slw r4, r2, r5 slw r2, r2, r6 or r3, r4, r3 or r3, r3, r2 blr Now we produce: _test: li r2, 1 addi r3, r5, -32 subfic r4, r5, 32 slw r3, r2, r3 srw r4, r2, r4 or r3, r4, r3 slw r4, r2, r5 blr _test2: li r2, -1 subfic r3, r5, 32 addi r6, r5, -32 srw r3, r2, r3 slw r4, r2, r5 slw r2, r2, r6 or r3, r4, r3 or r3, r3, r2 blr git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30479 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
863ac769b8
commit
cf9d0acfef
@ -2309,6 +2309,26 @@ SDOperand PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
SelectionDAG &DAG = DCI.DAG;
|
||||
switch (N->getOpcode()) {
|
||||
default: break;
|
||||
case PPCISD::SHL:
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
|
||||
if (C->getValue() == 0) // 0 << V -> 0.
|
||||
return N->getOperand(0);
|
||||
}
|
||||
break;
|
||||
case PPCISD::SRL:
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
|
||||
if (C->getValue() == 0) // 0 >>u V -> 0.
|
||||
return N->getOperand(0);
|
||||
}
|
||||
break;
|
||||
case PPCISD::SRA:
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
|
||||
if (C->getValue() == 0 || // 0 >>s V -> 0.
|
||||
C->isAllOnesValue()) // -1 >>s V -> -1.
|
||||
return N->getOperand(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case ISD::SINT_TO_FP:
|
||||
if (TM.getSubtarget<PPCSubtarget>().has64BitSupport()) {
|
||||
if (N->getOperand(0).getOpcode() == ISD::FP_TO_SINT) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user