[llvm] r228969 - [SDAG] Don't try to use FP_EXTEND/FP_ROUND for int<->fp promotions

Hans Wennborg hans at chromium.org
Thu Feb 12 15:53:34 PST 2015


On Thu, Feb 12, 2015 at 3:35 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> From: "Hans Wennborg" <hans at chromium.org>
>> To: "Hal Finkel" <hfinkel at anl.gov>
>> Cc: "llvm-commits" <llvm-commits at cs.uiuc.edu>, "Owen Anderson" <owen at apple.com>
>> Sent: Thursday, February 12, 2015 5:31:09 PM
>> Subject: Re: [llvm] r228969 - [SDAG] Don't try to use FP_EXTEND/FP_ROUND for int<->fp promotions
>>
>> Is it a correctness or performance regression? If it's the latter,
>> I'd
>> be hesitant to merge it at this stage.
>
> No, this is a correctness issue (DAG.getNode(ISD::FP_EXTEND, ...) will assert if you give it an integer data type). Regarding performance issues, I certainly agree.

Thanks for clarifying. Merged in r228986.

Cheers,
Hans

>> On Thu, Feb 12, 2015 at 3:16 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>> > Owen, Hans,
>> >
>> > This fixes a regression from 3.5, affecting PowerPC (and perhaps
>> > also other out-of-tree targets). Could we bring it into the 3.6
>> > release branch?
>> >
>> > Unfortunately, I missed this for a long time because of an
>> > oversight on my part in how I was running the test suite. :(
>> >
>> > Thanks again,
>> > Hal
>> >
>> > ----- Original Message -----
>> >> From: "Hal Finkel" <hfinkel at anl.gov>
>> >> To: llvm-commits at cs.uiuc.edu
>> >> Sent: Thursday, February 12, 2015 4:43:52 PM
>> >> Subject: [llvm] r228969 - [SDAG] Don't try to use
>> >> FP_EXTEND/FP_ROUND for      int<->fp promotions
>> >>
>> >> Author: hfinkel
>> >> Date: Thu Feb 12 16:43:52 2015
>> >> New Revision: 228969
>> >>
>> >> URL: http://llvm.org/viewvc/llvm-project?rev=228969&view=rev
>> >> Log:
>> >> [SDAG] Don't try to use FP_EXTEND/FP_ROUND for int<->fp promotions
>> >>
>> >> The PowerPC backend has long promoted some floating-point vector
>> >> operations
>> >> (such as select) to integer vector operations. Unfortunately, this
>> >> behavior was
>> >> broken by r216555. When using FP_EXTEND/FP_ROUND for promotions,
>> >> we
>> >> must check
>> >> that both the old and new types are floating-point types.
>> >> Otherwise,
>> >> we must
>> >> use BITCAST as we did prior to r216555 for everything.
>> >>
>> >> Added:
>> >>     llvm/trunk/test/CodeGen/PowerPC/vsel-prom.ll
>> >> Modified:
>> >>     llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
>> >>
>> >> Modified:
>> >> llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
>> >> URL:
>> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp?rev=228969&r1=228968&r2=228969&view=diff
>> >> ==============================================================================
>> >> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
>> >> (original)
>> >> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp Thu
>> >> Feb
>> >> 12 16:43:52 2015
>> >> @@ -390,7 +390,8 @@ SDValue VectorLegalizer::Promote(SDValue
>> >>        if (Op.getOperand(j)
>> >>                .getValueType()
>> >>                .getVectorElementType()
>> >> -              .isFloatingPoint())
>> >> +              .isFloatingPoint() &&
>> >> +          NVT.isVector() &&
>> >> NVT.getVectorElementType().isFloatingPoint())
>> >>          Operands[j] = DAG.getNode(ISD::FP_EXTEND, dl, NVT,
>> >>          Op.getOperand(j));
>> >>        else
>> >>          Operands[j] = DAG.getNode(ISD::BITCAST, dl, NVT,
>> >>          Op.getOperand(j));
>> >> @@ -399,8 +400,9 @@ SDValue VectorLegalizer::Promote(SDValue
>> >>    }
>> >>
>> >>    Op = DAG.getNode(Op.getOpcode(), dl, NVT, Operands);
>> >> -  if (VT.isFloatingPoint() ||
>> >> -      (VT.isVector() &&
>> >> VT.getVectorElementType().isFloatingPoint()))
>> >> +  if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) ||
>> >> +      (VT.isVector() &&
>> >> VT.getVectorElementType().isFloatingPoint()
>> >> &&
>> >> +       NVT.isVector() &&
>> >> NVT.getVectorElementType().isFloatingPoint()))
>> >>      return DAG.getNode(ISD::FP_ROUND, dl, VT, Op,
>> >>      DAG.getIntPtrConstant(0));
>> >>    else
>> >>      return DAG.getNode(ISD::BITCAST, dl, VT, Op);
>> >>
>> >> Added: llvm/trunk/test/CodeGen/PowerPC/vsel-prom.ll
>> >> URL:
>> >> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/vsel-prom.ll?rev=228969&view=auto
>> >> ==============================================================================
>> >> --- llvm/trunk/test/CodeGen/PowerPC/vsel-prom.ll (added)
>> >> +++ llvm/trunk/test/CodeGen/PowerPC/vsel-prom.ll Thu Feb 12
>> >> 16:43:52
>> >> 2015
>> >> @@ -0,0 +1,23 @@
>> >> +; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
>> >> +target datalayout = "E-m:e-i64:64-n32:64"
>> >> +target triple = "powerpc64-unknown-linux-gnu"
>> >> +
>> >> +; Function Attrs: nounwind
>> >> +define void @Compute_Lateral() #0 {
>> >> +entry:
>> >> +  br i1 undef, label %if.then, label %if.end
>> >> +
>> >> +if.then:                                          ; preds =
>> >> %entry
>> >> +  unreachable
>> >> +
>> >> +if.end:                                           ; preds =
>> >> %entry
>> >> +  %0 = select i1 undef, <2 x double> undef, <2 x double>
>> >> zeroinitializer
>> >> +  %1 = extractelement <2 x double> %0, i32 1
>> >> +  store double %1, double* undef, align 8
>> >> +  ret void
>> >> +
>> >> +; CHECK-LABEL: @Compute_Lateral
>> >> +}
>> >> +
>> >> +attributes #0 = { nounwind }
>> >> +
>> >>
>> >>
>> >> _______________________________________________
>> >> llvm-commits mailing list
>> >> llvm-commits at cs.uiuc.edu
>> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> >>
>> >
>> > --
>> > Hal Finkel
>> > Assistant Computational Scientist
>> > Leadership Computing Facility
>> > Argonne National Laboratory
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory



More information about the llvm-commits mailing list