[llvm] ce95200 - [InstSimplify] propagate poison through FP ops

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 16 09:40:15 PDT 2021


Hm, the binop and unop cases are new since I'd last looked. That's 
actually what I had in mind, so request satisfied.  :)

If you want to handle the intrinsics, that might be reasonable, but it 
was beyond what I was thinking.

Philip

On 6/16/21 9:18 AM, Sanjay Patel wrote:
> Sure, I can do that. Make sure I'm not missing any corner cases: we 
> already do the right thing for the regular FP opcodes via checks for 
> BinaryOperator / UnaryOperator, but we miss all FP intrinsics currently?
>
> Started adding tests here:
> https://github.com/llvm/llvm-project/commit/572e506b55f0ad181ddbb04d889651caa5a287e8 
> <https://github.com/llvm/llvm-project/commit/572e506b55f0ad181ddbb04d889651caa5a287e8>
>
> On Wed, Jun 16, 2021 at 11:40 AM Philip Reames 
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
>     This is long overdue.  Thanks.  :)
>
>     Can I ask you to also update propagatesPoison in ValueTracking?
>
>     Philip
>
>     On 6/16/21 8:33 AM, Sanjay Patel via llvm-commits wrote:
>     > Author: Sanjay Patel
>     > Date: 2021-06-16T11:31:58-04:00
>     > New Revision: ce95200b7942bb0683fd491800bbd9e1dc908e04
>     >
>     > URL:
>     https://github.com/llvm/llvm-project/commit/ce95200b7942bb0683fd491800bbd9e1dc908e04
>     <https://github.com/llvm/llvm-project/commit/ce95200b7942bb0683fd491800bbd9e1dc908e04>
>     > DIFF:
>     https://github.com/llvm/llvm-project/commit/ce95200b7942bb0683fd491800bbd9e1dc908e04.diff
>     <https://github.com/llvm/llvm-project/commit/ce95200b7942bb0683fd491800bbd9e1dc908e04.diff>
>     >
>     > LOG: [InstSimplify] propagate poison through FP ops
>     >
>     > We already have this fold:
>     >    fadd float poison, 1.0 --> poison
>     > ...via ConstantFolding, so this makes the behavior consistent
>     > if the other operand(s) are non-constant.
>     >
>     > The fold for undef was added before poison existed as a
>     > value/type in IR.
>     >
>     > This came up in D102673 / D103169
>     > because we're trying to sort out the more complicated handling
>     > for constrained math ops.
>     > We should have the handling for the regular instructions done
>     > first, so we can build on that (or diverge as needed).
>     >
>     > Differential Revision: https://reviews.llvm.org/D104383
>     <https://reviews.llvm.org/D104383>
>     >
>     > Added:
>     >
>     >
>     > Modified:
>     >      llvm/lib/Analysis/InstructionSimplify.cpp
>     >      llvm/test/Transforms/InstSimplify/call.ll
>     >      llvm/test/Transforms/InstSimplify/fp-undef-poison.ll
>     >
>     > Removed:
>     >
>     >
>     >
>     >
>     ################################################################################
>     > diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp
>     b/llvm/lib/Analysis/InstructionSimplify.cpp
>     > index 7fb7a394e86ab..895218bea9f33 100644
>     > --- a/llvm/lib/Analysis/InstructionSimplify.cpp
>     > +++ b/llvm/lib/Analysis/InstructionSimplify.cpp
>     > @@ -4807,12 +4807,16 @@ static Constant *propagateNaN(Constant
>     *In) {
>     >   }
>     >
>     >   /// Perform folds that are common to any floating-point
>     operation. This implies
>     > -/// transforms based on undef/NaN because the operation itself
>     makes no
>     > +/// transforms based on poison/undef/NaN because the operation
>     itself makes no
>     >   ///
>     > diff erence to the result.
>     > -static Constant *simplifyFPOp(ArrayRef<Value *> Ops,
>     > -                              FastMathFlags FMF,
>     > +static Constant *simplifyFPOp(ArrayRef<Value *> Ops,
>     FastMathFlags FMF,
>     >                                 const SimplifyQuery &Q) {
>     >     for (Value *V : Ops) {
>     > +    // Poison is independent of anything else. It always
>     propagates from an
>     > +    // operand to a math result.
>     > +    if (match(V, m_Poison()))
>     > +      return PoisonValue::get(V->getType());
>     > +
>     >       bool IsNan = match(V, m_NaN());
>     >       bool IsInf = match(V, m_Inf());
>     >       bool IsUndef = Q.isUndefValue(V);
>     >
>     > diff  --git a/llvm/test/Transforms/InstSimplify/call.ll
>     b/llvm/test/Transforms/InstSimplify/call.ll
>     > index 99a4a96d33b1a..721f4941e5110 100644
>     > --- a/llvm/test/Transforms/InstSimplify/call.ll
>     > +++ b/llvm/test/Transforms/InstSimplify/call.ll
>     > @@ -953,7 +953,7 @@ define double @fma_undef_op0(double %x,
>     double %y) {
>     >
>     >   define double @fma_poison_op0(double %x, double %y) {
>     >   ; CHECK-LABEL: @fma_poison_op0(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fma.f64(double poison, double %x,
>     double %y)
>     >     ret double %r
>     > @@ -969,7 +969,7 @@ define double @fma_undef_op1(double %x,
>     double %y) {
>     >
>     >   define double @fma_poison_op1(double %x, double %y) {
>     >   ; CHECK-LABEL: @fma_poison_op1(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fma.f64(double %x, double poison,
>     double %y)
>     >     ret double %r
>     > @@ -985,7 +985,7 @@ define double @fma_undef_op2(double %x,
>     double %y) {
>     >
>     >   define double @fma_poison_op2(double %x, double %y) {
>     >   ; CHECK-LABEL: @fma_poison_op2(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fma.f64(double %x, double %y, double
>     poison)
>     >     ret double %r
>     > @@ -1001,7 +1001,7 @@ define double @fmuladd_undef_op0(double
>     %x, double %y) {
>     >
>     >   define double @fmuladd_poison_op0(double %x, double %y) {
>     >   ; CHECK-LABEL: @fmuladd_poison_op0(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fmuladd.f64(double poison, double %x,
>     double %y)
>     >     ret double %r
>     > @@ -1017,7 +1017,7 @@ define double @fmuladd_undef_op1(double
>     %x, double %y) {
>     >
>     >   define double @fmuladd_poison_op1(double %x, double %y) {
>     >   ; CHECK-LABEL: @fmuladd_poison_op1(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fmuladd.f64(double %x, double poison,
>     double %y)
>     >     ret double %r
>     > @@ -1033,7 +1033,7 @@ define double @fmuladd_undef_op2(double
>     %x, double %y) {
>     >
>     >   define double @fmuladd_poison_op2(double %x, double %y) {
>     >   ; CHECK-LABEL: @fmuladd_poison_op2(
>     > -; CHECK-NEXT:    ret double 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret double poison
>     >   ;
>     >     %r = call double @llvm.fmuladd.f64(double %x, double %y,
>     double poison)
>     >     ret double %r
>     >
>     > diff  --git
>     a/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll
>     b/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll
>     > index 129d868704c46..6a8036c37b634 100644
>     > --- a/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll
>     > +++ b/llvm/test/Transforms/InstSimplify/fp-undef-poison.ll
>     > @@ -1,8 +1,6 @@
>     >   ; NOTE: Assertions have been autogenerated by
>     utils/update_test_checks.py
>     >   ; RUN: opt < %s -instsimplify -S | FileCheck %s
>     >
>     > -; TODO: the instructions with poison operands should return poison
>     > -
>     >   define float @fadd_undef_op0(float %x) {
>     >   ; CHECK-LABEL: @fadd_undef_op0(
>     >   ; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > @@ -13,7 +11,7 @@ define float @fadd_undef_op0(float %x) {
>     >
>     >   define float @fadd_poison_op0(float %x) {
>     >   ; CHECK-LABEL: @fadd_poison_op0(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fadd float poison, %x
>     >     ret float %r
>     > @@ -29,7 +27,7 @@ define float @fadd_undef_op1(float %x) {
>     >
>     >   define float @fadd_poison_op1(float %x) {
>     >   ; CHECK-LABEL: @fadd_poison_op1(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fadd float %x, poison
>     >     ret float %r
>     > @@ -45,7 +43,7 @@ define float @fsub_undef_op0(float %x) {
>     >
>     >   define float @fsub_poison_op0(float %x) {
>     >   ; CHECK-LABEL: @fsub_poison_op0(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fsub float poison, %x
>     >     ret float %r
>     > @@ -61,7 +59,7 @@ define float @fsub_undef_op1(float %x) {
>     >
>     >   define float @fsub_poison_op1(float %x) {
>     >   ; CHECK-LABEL: @fsub_poison_op1(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fsub float %x, poison
>     >     ret float %r
>     > @@ -77,7 +75,7 @@ define float @fmul_undef_op0(float %x) {
>     >
>     >   define float @fmul_poison_op0(float %x) {
>     >   ; CHECK-LABEL: @fmul_poison_op0(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fmul float poison, %x
>     >     ret float %r
>     > @@ -93,7 +91,7 @@ define float @fmul_undef_op1(float %x) {
>     >
>     >   define float @fmul_poison_op1(float %x) {
>     >   ; CHECK-LABEL: @fmul_poison_op1(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fmul float %x, poison
>     >     ret float %r
>     > @@ -109,7 +107,7 @@ define float @fdiv_undef_op0(float %x) {
>     >
>     >   define float @fdiv_poison_op0(float %x) {
>     >   ; CHECK-LABEL: @fdiv_poison_op0(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fdiv float poison, %x
>     >     ret float %r
>     > @@ -125,7 +123,7 @@ define float @fdiv_undef_op1(float %x) {
>     >
>     >   define float @fdiv_poison_op1(float %x) {
>     >   ; CHECK-LABEL: @fdiv_poison_op1(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = fdiv float %x, poison
>     >     ret float %r
>     > @@ -141,7 +139,7 @@ define float @frem_undef_op0(float %x) {
>     >
>     >   define float @frem_poison_op0(float %x) {
>     >   ; CHECK-LABEL: @frem_poison_op0(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = frem float poison, %x
>     >     ret float %r
>     > @@ -157,7 +155,7 @@ define float @frem_undef_op1(float %x) {
>     >
>     >   define float @frem_poison_op1(float %x) {
>     >   ; CHECK-LABEL: @frem_poison_op1(
>     > -; CHECK-NEXT:    ret float 0x7FF8000000000000
>     > +; CHECK-NEXT:    ret float poison
>     >   ;
>     >     %r = frem float %x, poison
>     >     ret float %r
>     >
>     >
>     >
>     > _______________________________________________
>     > llvm-commits mailing list
>     > llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>     > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>     <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210616/872440f8/attachment.html>


More information about the llvm-commits mailing list