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:
@@ -457,6 +457,7 @@ private:
|
||||
void visitUserOp1(Instruction &I);
|
||||
void visitUserOp2(Instruction &I) { visitUserOp1(I); }
|
||||
void visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS);
|
||||
void visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI);
|
||||
template <class DbgIntrinsicTy>
|
||||
void visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII);
|
||||
void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI);
|
||||
@@ -3929,6 +3930,14 @@ void Verifier::visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS) {
|
||||
"constant int",
|
||||
CS);
|
||||
break;
|
||||
case Intrinsic::experimental_constrained_fadd:
|
||||
case Intrinsic::experimental_constrained_fsub:
|
||||
case Intrinsic::experimental_constrained_fmul:
|
||||
case Intrinsic::experimental_constrained_fdiv:
|
||||
case Intrinsic::experimental_constrained_frem:
|
||||
visitConstrainedFPIntrinsic(
|
||||
cast<ConstrainedFPIntrinsic>(*CS.getInstruction()));
|
||||
break;
|
||||
case Intrinsic::dbg_declare: // llvm.dbg.declare
|
||||
Assert(isa<MetadataAsValue>(CS.getArgOperand(0)),
|
||||
"invalid llvm.dbg.declare intrinsic call 1", CS);
|
||||
@@ -4294,6 +4303,15 @@ static DISubprogram *getSubprogram(Metadata *LocalScope) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) {
|
||||
Assert(isa<MetadataAsValue>(FPI.getOperand(2)),
|
||||
"invalid rounding mode argument", &FPI);
|
||||
Assert(FPI.getRoundingMode() != ConstrainedFPIntrinsic::rmInvalid,
|
||||
"invalid rounding mode argument", &FPI);
|
||||
Assert(FPI.getExceptionBehavior() != ConstrainedFPIntrinsic::ebInvalid,
|
||||
"invalid exception behavior argument", &FPI);
|
||||
}
|
||||
|
||||
template <class DbgIntrinsicTy>
|
||||
void Verifier::visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII) {
|
||||
auto *MD = cast<MetadataAsValue>(DII.getArgOperand(0))->getMetadata();
|
||||
|
||||
Reference in New Issue
Block a user