[LLVMdev] Proposal: Add a target lowering hook to state that target supports floating point exception behavior.

Juergen Ributzka juergen at apple.com
Thu Aug 7 15:18:48 PDT 2014


Hi Pedro,

I would rename the variable FloatingPointExceptions to HasFloatingPointExceptions.

-Juergen

PS: Patches should go to llvm-commits

On Aug 7, 2014, at 3:07 PM, Pedro Artigas <partigas at apple.com> wrote:

> Hello All,
> 
> the patch below adds a target lowering hook to state that the target supports (or not) floating point exception behavior. The patch is small and contains one possible use for the hook (folding potentially exception raising fp operations).
> 
> Any comments?
> 
> Thanks
> 
> Pedro
> 
> <opensource1.txt>
> 
> Index: include/llvm/Target/TargetLowering.h
> ===================================================================
> --- include/llvm/Target/TargetLowering.h	(revision 215148)
> +++ include/llvm/Target/TargetLowering.h	(working copy)
> @@ -261,6 +261,11 @@
>   bool isMaskAndBranchFoldingLegal() const {
>     return MaskAndBranchFoldingIsLegal;
>   }
> +  
> +  /// Return true if target supports floating point exceptions.
> +  bool hasFloatingPointExceptions() const {
> +    return FloatingPointExceptions;
> +  }
> 
>   /// Return the ValueType of the result of SETCC operations.  Also used to
>   /// obtain the target's preferred type for the condition operand of SELECT and
> @@ -1053,6 +1058,12 @@
>   /// possible, should be replaced by an alternate sequence of instructions not
>   /// containing an integer divide.
>   void setIntDivIsCheap(bool isCheap = true) { IntDivIsCheap = isCheap; }
> +  
> +  /// Tells the code generator that this target supports floating point
> +  /// exceptions and cares about preserving floating point exception behavior.
> +  void setHasFloatingPointExceptions(bool FPExceptions = true) {
> +    FloatingPointExceptions = FPExceptions;
> +  }
> 
>   /// Tells the code generator which bitwidths to bypass.
>   void addBypassSlowDiv(unsigned int SlowBitWidth, unsigned int FastBitWidth) {
> Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp	(revision 215148)
> +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp	(working copy)
> @@ -3402,6 +3402,7 @@
>   }
> 
>   // Constant fold FP operations.
> +  bool HasFPExceptions = TLI->hasFloatingPointExceptions();
>   ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1.getNode());
>   ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2.getNode());
>   if (N1CFP) {
> @@ -3415,28 +3416,32 @@
>       switch (Opcode) {
>       case ISD::FADD:
>         s = V1.add(V2, APFloat::rmNearestTiesToEven);
> -        if (s != APFloat::opInvalidOp)
> +        if (!HasFPExceptions || s != APFloat::opInvalidOp)
>           return getConstantFP(V1, VT);
>         break;
>       case ISD::FSUB:
>         s = V1.subtract(V2, APFloat::rmNearestTiesToEven);
> -        if (s!=APFloat::opInvalidOp)
> +        if (!HasFPExceptions || s!=APFloat::opInvalidOp)
>           return getConstantFP(V1, VT);
>         break;
>       case ISD::FMUL:
>         s = V1.multiply(V2, APFloat::rmNearestTiesToEven);
> -        if (s!=APFloat::opInvalidOp)
> +        if (!HasFPExceptions || s!=APFloat::opInvalidOp)
>           return getConstantFP(V1, VT);
>         break;
>       case ISD::FDIV:
>         s = V1.divide(V2, APFloat::rmNearestTiesToEven);
> -        if (s!=APFloat::opInvalidOp && s!=APFloat::opDivByZero)
> +        if (!HasFPExceptions || (s!=APFloat::opInvalidOp &&
> +                                 s!=APFloat::opDivByZero)) {
>           return getConstantFP(V1, VT);
> +        }
>         break;
>       case ISD::FREM :
>         s = V1.mod(V2, APFloat::rmNearestTiesToEven);
> -        if (s!=APFloat::opInvalidOp && s!=APFloat::opDivByZero)
> +        if (!HasFPExceptions || (s!=APFloat::opInvalidOp &&
> +                                 s!=APFloat::opDivByZero)) {
>           return getConstantFP(V1, VT);
> +        }
>         break;
>       case ISD::FCOPYSIGN:
>         V1.copySign(V2);
> Index: lib/CodeGen/TargetLoweringBase.cpp
> ===================================================================
> --- lib/CodeGen/TargetLoweringBase.cpp	(revision 215148)
> +++ lib/CodeGen/TargetLoweringBase.cpp	(working copy)
> @@ -705,6 +705,7 @@
>   JumpIsExpensive = false;
>   PredictableSelectIsExpensive = false;
>   MaskAndBranchFoldingIsLegal = false;
> +  FloatingPointExceptions = true;
>   StackPointerRegisterToSaveRestore = 0;
>   ExceptionPointerRegister = 0;
>   ExceptionSelectorRegister = 0;
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-commits mailing list