mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
- Remove the buggy -X/C -> X/-C transform. This isn't valid when X isn't a
constant. If X is a constant, then this is folded elsewhere. - Added a note to Target/README.txt to indicate that we'd like to implement this when we're able. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60399 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a8bb13f989
commit
3bdcda82a5
@ -1242,3 +1242,13 @@ Should combine to "20 * (((unsigned)x) & -2)". Currently not
|
||||
optimized with "clang -emit-llvm-bc | opt -std-compile-opts".
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
We would like to do the following transform in the instcombiner:
|
||||
|
||||
-X/C -> X/-C
|
||||
|
||||
However, this isn't valid if (-X) overflows. We can implement this when we
|
||||
have the concept of a "C signed subtraction" operator that which is undefined
|
||||
on overflow.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
@ -2929,18 +2929,6 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
|
||||
// sdiv X, -1 == -X
|
||||
if (RHS->isAllOnesValue())
|
||||
return BinaryOperator::CreateNeg(Op0);
|
||||
|
||||
// -X/C -> X/-C, if and only if negation doesn't overflow.
|
||||
if (Value *LHSNeg = dyn_castNegVal(Op0)) {
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(LHSNeg)) {
|
||||
Constant *RHSNeg = ConstantExpr::getNeg(RHS);
|
||||
if (RHS != RHSNeg) { // Check that there is no overflow.
|
||||
Constant *CINeg = ConstantExpr::getNeg(CI);
|
||||
if (CI != CINeg) // Check that there is no overflow.
|
||||
return BinaryOperator::CreateSDiv(LHSNeg, RHSNeg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the sign bits of both operands are zero (i.e. we can prove they are
|
||||
|
Loading…
Reference in New Issue
Block a user