Add intrinsics for constrained floating point operations
This commit introduces a set of experimental intrinsics intended to prevent optimizations that make assumptions about the rounding mode and floating point exception behavior. These intrinsics will later be extended to specify flush-to-zero behavior. More work is also required to model instruction dependencies in machine code and to generate these instructions from clang (when required by pragmas and/or command line options that are not currently supported). Differential Revision: https://reviews.llvm.org/D27028 llvm-svn: 293226
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
@@ -93,3 +94,34 @@ Value *InstrProfIncrementInst::getStep() const {
|
||||
LLVMContext &Context = M->getContext();
|
||||
return ConstantInt::get(Type::getInt64Ty(Context), 1);
|
||||
}
|
||||
|
||||
ConstrainedFPIntrinsic::RoundingMode
|
||||
ConstrainedFPIntrinsic::getRoundingMode() const {
|
||||
Metadata *MD = dyn_cast<MetadataAsValue>(getOperand(2))->getMetadata();
|
||||
if (!MD || !isa<MDString>(MD))
|
||||
return rmInvalid;
|
||||
StringRef RoundingArg = cast<MDString>(MD)->getString();
|
||||
|
||||
// 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<RoundingMode>(RoundingArg)
|
||||
.Case("round.dynamic", rmDynamic)
|
||||
.Case("round.tonearest", rmToNearest)
|
||||
.Case("round.downward", rmDownward)
|
||||
.Case("round.upward", rmUpward)
|
||||
.Case("round.towardzero", rmTowardZero)
|
||||
.Default(rmInvalid);
|
||||
}
|
||||
|
||||
ConstrainedFPIntrinsic::ExceptionBehavior
|
||||
ConstrainedFPIntrinsic::getExceptionBehavior() const {
|
||||
Metadata *MD = dyn_cast<MetadataAsValue>(getOperand(3))->getMetadata();
|
||||
if (!MD || !isa<MDString>(MD))
|
||||
return ebInvalid;
|
||||
StringRef ExceptionArg = cast<MDString>(MD)->getString();
|
||||
return StringSwitch<ExceptionBehavior>(ExceptionArg)
|
||||
.Case("fpexcept.ignore", ebIgnore)
|
||||
.Case("fpexcept.maytrap", ebMayTrap)
|
||||
.Case("fpexcept.strict", ebStrict)
|
||||
.Default(ebInvalid);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user