mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 00:11:00 +00:00
Subtraction is not commutative. Fixes PR23212!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234780 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7bea98826a
commit
d4b4e3e20f
@ -416,12 +416,10 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
}
|
||||
break;
|
||||
|
||||
case Intrinsic::uadd_with_overflow: // FALLTHROUGH
|
||||
case Intrinsic::sadd_with_overflow: // FALLTHROUGH
|
||||
case Intrinsic::usub_with_overflow: // FALLTHROUGH
|
||||
case Intrinsic::ssub_with_overflow: // FALLTHROUGH
|
||||
case Intrinsic::umul_with_overflow: // FALLTHROUGH
|
||||
case Intrinsic::smul_with_overflow: {
|
||||
case Intrinsic::uadd_with_overflow:
|
||||
case Intrinsic::sadd_with_overflow:
|
||||
case Intrinsic::umul_with_overflow:
|
||||
case Intrinsic::smul_with_overflow:
|
||||
if (isa<Constant>(II->getArgOperand(0)) &&
|
||||
!isa<Constant>(II->getArgOperand(1))) {
|
||||
// Canonicalize constants into the RHS.
|
||||
@ -430,7 +428,10 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
II->setArgOperand(1, LHS);
|
||||
return II;
|
||||
}
|
||||
[[clang::fallthrough]];
|
||||
|
||||
case Intrinsic::usub_with_overflow:
|
||||
case Intrinsic::ssub_with_overflow: {
|
||||
OverflowCheckFlavor OCF =
|
||||
IntrinsicIDToOverflowCheckFlavor(II->getIntrinsicID());
|
||||
assert(OCF != OCF_INVALID && "unexpected!");
|
||||
|
@ -2112,7 +2112,8 @@ static Instruction *ProcessUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B,
|
||||
bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
|
||||
Value *RHS, Instruction &OrigI,
|
||||
Value *&Result, Constant *&Overflow) {
|
||||
assert(!(isa<Constant>(LHS) && !isa<Constant>(RHS)) &&
|
||||
assert((!OrigI.isCommutative() ||
|
||||
!(isa<Constant>(LHS) && !isa<Constant>(RHS))) &&
|
||||
"call with a constant RHS if possible!");
|
||||
|
||||
auto SetResult = [&](Value *OpResult, Constant *OverflowVal, bool ReuseName) {
|
||||
|
@ -407,3 +407,13 @@ entry:
|
||||
%obit = extractvalue %ov.result.32 %t, 1
|
||||
ret i1 %obit
|
||||
}
|
||||
|
||||
define %ov.result.32 @ssubtest_reorder(i8 %a) {
|
||||
%A = sext i8 %a to i32
|
||||
%x = call %ov.result.32 @llvm.ssub.with.overflow.i32(i32 0, i32 %A)
|
||||
ret %ov.result.32 %x
|
||||
; CHECK-LABEL: @ssubtest_reorder
|
||||
; CHECK: %x = sub nsw i32 0, %A
|
||||
; CHECK-NEXT: %1 = insertvalue %ov.result.32 { i32 undef, i1 false }, i32 %x, 0
|
||||
; CHECK-NEXT: ret %ov.result.32 %1
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user