mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 14:40:25 +00:00
while we're at it, handle 'sdiv exact' of a power of 2 also,
this fixes a few rejects on c++ iterator loops. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129694 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
090ca9108b
commit
f051c1a29d
@ -360,6 +360,14 @@ bool FastISel::SelectBinaryOp(const User *I, unsigned ISDOpcode) {
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
uint64_t Imm = CI->getZExtValue();
|
||||
|
||||
// Transform "sdiv exact X, 8" -> "sra X, 3".
|
||||
if (ISDOpcode == ISD::SDIV && isa<BinaryOperator>(I) &&
|
||||
cast<BinaryOperator>(I)->isExact() &&
|
||||
isPowerOf2_64(Imm)) {
|
||||
Imm = Log2_64(Imm);
|
||||
ISDOpcode = ISD::SRA;
|
||||
}
|
||||
|
||||
unsigned ResultReg = FastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op0,
|
||||
Op0IsKill, Imm, VT.getSimpleVT());
|
||||
if (ResultReg == 0) return false;
|
||||
|
@ -119,3 +119,11 @@ define i32 @test10(i32 %X) nounwind {
|
||||
; CHECK: test10:
|
||||
; CHECK: shrl $3,
|
||||
}
|
||||
|
||||
define i32 @test11(i32 %X) nounwind {
|
||||
%Y = sdiv exact i32 %X, 8
|
||||
ret i32 %Y
|
||||
; CHECK: test11:
|
||||
; CHECK: sarl $3,
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user