diff options
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 5febe91..1d4272a 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1504,6 +1504,8 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) { case Intrinsic::smin: case Intrinsic::umax: case Intrinsic::umin: + case Intrinsic::scmp: + case Intrinsic::ucmp: case Intrinsic::sadd_with_overflow: case Intrinsic::uadd_with_overflow: case Intrinsic::ssub_with_overflow: @@ -2773,6 +2775,21 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty, ? *C0 : *C1); + case Intrinsic::scmp: + case Intrinsic::ucmp: + if (isa<PoisonValue>(Operands[0]) || isa<PoisonValue>(Operands[1])) + return PoisonValue::get(Ty); + + if (!C0 || !C1) + return ConstantInt::get(Ty, 0); + + int Res; + if (IntrinsicID == Intrinsic::scmp) + Res = C0->sgt(*C1) ? 1 : C0->slt(*C1) ? -1 : 0; + else + Res = C0->ugt(*C1) ? 1 : C0->ult(*C1) ? -1 : 0; + return ConstantInt::get(Ty, Res, /*IsSigned=*/true); + case Intrinsic::usub_with_overflow: case Intrinsic::ssub_with_overflow: // X - undef -> { 0, false } |