From 472e5dda110fb0a48c73faab84402c207a4e1715 Mon Sep 17 00:00:00 2001 From: "Kevin P. Neal" Date: Mon, 8 Jul 2019 16:18:18 +0000 Subject: Teach the IRBuilder about fadd and friends. The IRBuilder has calls to create floating point instructions like fadd. It does not have calls to create constrained versions of them. This patch adds support for constrained creation of fadd, fsub, fmul, fdiv, and frem. Reviewed by: John McCall, Sanjay Patel Approved by: John McCall Differential Revision: https://reviews.llvm.org/D53157 llvm-svn: 365339 --- llvm/lib/IR/IntrinsicInst.cpp | 67 ++++++++++++++++++++++++++++++++++++------- llvm/lib/IR/Verifier.cpp | 4 +-- 2 files changed, 59 insertions(+), 12 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index 793e2895dce..7a042326f67 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -103,39 +103,86 @@ Value *InstrProfIncrementInst::getStep() const { return ConstantInt::get(Type::getInt64Ty(Context), 1); } -ConstrainedFPIntrinsic::RoundingMode +Optional ConstrainedFPIntrinsic::getRoundingMode() const { unsigned NumOperands = getNumArgOperands(); Metadata *MD = dyn_cast(getArgOperand(NumOperands - 2))->getMetadata(); if (!MD || !isa(MD)) - return rmInvalid; - StringRef RoundingArg = cast(MD)->getString(); + return None; + return StrToRoundingMode(cast(MD)->getString()); +} +Optional +ConstrainedFPIntrinsic::StrToRoundingMode(StringRef RoundingArg) { // For dynamic rounding mode, we use round to nearest but we will set the // 'exact' SDNodeFlag so that the value will not be rounded. - return StringSwitch(RoundingArg) + return StringSwitch>(RoundingArg) .Case("round.dynamic", rmDynamic) .Case("round.tonearest", rmToNearest) .Case("round.downward", rmDownward) .Case("round.upward", rmUpward) .Case("round.towardzero", rmTowardZero) - .Default(rmInvalid); + .Default(None); } -ConstrainedFPIntrinsic::ExceptionBehavior +Optional +ConstrainedFPIntrinsic::RoundingModeToStr(RoundingMode UseRounding) { + Optional RoundingStr = None; + switch (UseRounding) { + case ConstrainedFPIntrinsic::rmDynamic: + RoundingStr = "round.dynamic"; + break; + case ConstrainedFPIntrinsic::rmToNearest: + RoundingStr = "round.tonearest"; + break; + case ConstrainedFPIntrinsic::rmDownward: + RoundingStr = "round.downward"; + break; + case ConstrainedFPIntrinsic::rmUpward: + RoundingStr = "round.upward"; + break; + case ConstrainedFPIntrinsic::rmTowardZero: + RoundingStr = "round.tozero"; + break; + } + return RoundingStr; +} + +Optional ConstrainedFPIntrinsic::getExceptionBehavior() const { unsigned NumOperands = getNumArgOperands(); Metadata *MD = dyn_cast(getArgOperand(NumOperands - 1))->getMetadata(); if (!MD || !isa(MD)) - return ebInvalid; - StringRef ExceptionArg = cast(MD)->getString(); - return StringSwitch(ExceptionArg) + return None; + return StrToExceptionBehavior(cast(MD)->getString()); +} + +Optional +ConstrainedFPIntrinsic::StrToExceptionBehavior(StringRef ExceptionArg) { + return StringSwitch>(ExceptionArg) .Case("fpexcept.ignore", ebIgnore) .Case("fpexcept.maytrap", ebMayTrap) .Case("fpexcept.strict", ebStrict) - .Default(ebInvalid); + .Default(None); +} + +Optional +ConstrainedFPIntrinsic::ExceptionBehaviorToStr(ExceptionBehavior UseExcept) { + Optional ExceptStr = None; + switch (UseExcept) { + case ConstrainedFPIntrinsic::ebStrict: + ExceptStr = "fpexcept.strict"; + break; + case ConstrainedFPIntrinsic::ebIgnore: + ExceptStr = "fpexcept.ignore"; + break; + case ConstrainedFPIntrinsic::ebMayTrap: + ExceptStr = "fpexcept.maytrap"; + break; + } + return ExceptStr; } bool ConstrainedFPIntrinsic::isUnaryOp() const { diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 2655e3ce81e..744707afa3c 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4776,11 +4776,11 @@ void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) { // argument type check is needed here. if (HasExceptionMD) { - Assert(FPI.getExceptionBehavior() != ConstrainedFPIntrinsic::ebInvalid, + Assert(FPI.getExceptionBehavior().hasValue(), "invalid exception behavior argument", &FPI); } if (HasRoundingMD) { - Assert(FPI.getRoundingMode() != ConstrainedFPIntrinsic::rmInvalid, + Assert(FPI.getRoundingMode().hasValue(), "invalid rounding mode argument", &FPI); } } -- cgit v1.2.3