forked from OSchip/llvm-project
[FastISel][AArch64] Simplify XALU multiplies.
Simplify {s|u}mul.with.overflow to {s|u}add.with.overflow when possible. llvm-svn: 218033
This commit is contained in:
parent
2fc851002b
commit
2964b832ef
|
@ -3050,9 +3050,30 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
|
|||
isCommutativeIntrinsic(II))
|
||||
std::swap(LHS, RHS);
|
||||
|
||||
// Simplify multiplies.
|
||||
unsigned IID = II->getIntrinsicID();
|
||||
switch (IID) {
|
||||
default:
|
||||
break;
|
||||
case Intrinsic::smul_with_overflow:
|
||||
if (const auto *C = dyn_cast<ConstantInt>(RHS))
|
||||
if (C->getValue() == 2) {
|
||||
IID = Intrinsic::sadd_with_overflow;
|
||||
RHS = LHS;
|
||||
}
|
||||
break;
|
||||
case Intrinsic::umul_with_overflow:
|
||||
if (const auto *C = dyn_cast<ConstantInt>(RHS))
|
||||
if (C->getValue() == 2) {
|
||||
IID = Intrinsic::uadd_with_overflow;
|
||||
RHS = LHS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned ResultReg1 = 0, ResultReg2 = 0, MulReg = 0;
|
||||
AArch64CC::CondCode CC = AArch64CC::Invalid;
|
||||
switch (II->getIntrinsicID()) {
|
||||
switch (IID) {
|
||||
default: llvm_unreachable("Unexpected intrinsic!");
|
||||
case Intrinsic::sadd_with_overflow:
|
||||
ResultReg1 = emitAdd(VT, LHS, RHS, /*SetFlags=*/true);
|
||||
|
|
|
@ -217,6 +217,18 @@ entry:
|
|||
ret i1 %obit
|
||||
}
|
||||
|
||||
define zeroext i1 @smulo2.i64(i64 %v1, i64* %res) {
|
||||
entry:
|
||||
; CHECK-LABEL: smulo2.i64
|
||||
; CHECK: adds [[MREG:x[0-9]+]], x0, x0
|
||||
; CHECK-NEXT: cset {{w[0-9]+}}, vs
|
||||
%t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 2)
|
||||
%val = extractvalue {i64, i1} %t, 0
|
||||
%obit = extractvalue {i64, i1} %t, 1
|
||||
store i64 %val, i64* %res
|
||||
ret i1 %obit
|
||||
}
|
||||
|
||||
define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
|
||||
entry:
|
||||
; CHECK-LABEL: umulo.i32
|
||||
|
@ -243,6 +255,18 @@ entry:
|
|||
ret i1 %obit
|
||||
}
|
||||
|
||||
define zeroext i1 @umulo2.i64(i64 %v1, i64* %res) {
|
||||
entry:
|
||||
; CHECK-LABEL: umulo2.i64
|
||||
; CHECK: adds [[MREG:x[0-9]+]], x0, x0
|
||||
; CHECK-NEXT: cset {{w[0-9]+}}, hs
|
||||
%t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 2)
|
||||
%val = extractvalue {i64, i1} %t, 0
|
||||
%obit = extractvalue {i64, i1} %t, 1
|
||||
store i64 %val, i64* %res
|
||||
ret i1 %obit
|
||||
}
|
||||
|
||||
|
||||
;
|
||||
; Check the use of the overflow bit in combination with a select instruction.
|
||||
|
|
Loading…
Reference in New Issue