[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