[llvm] r338665 - Fix FCOPYSIGN expansion
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 6 23:23:43 PDT 2018
Merged to 7.0 in r339098.
On Thu, Aug 2, 2018 at 3:54 AM, Lei Liu via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: lliu0
> Date: Wed Aug 1 18:54:12 2018
> New Revision: 338665
>
> URL: http://llvm.org/viewvc/llvm-project?rev=338665&view=rev
> Log:
> Fix FCOPYSIGN expansion
>
> In expansion of FCOPYSIGN, the shift node is missing when the two
> operands of FCOPYSIGN are of the same size. We should always generate
> shift node (if the required shift bit is not zero) to put the sign
> bit into the right position, regardless of the size of underlying
> types.
>
> Differential Revision: https://reviews.llvm.org/D49973
>
>
> Modified:
> llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> llvm/trunk/test/CodeGen/AArch64/fcopysign.ll
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=338665&r1=338664&r2=338665&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Aug 1 18:54:12 2018
> @@ -1489,24 +1489,20 @@ SDValue SelectionDAGLegalize::ExpandFCOP
>
> // Get the signbit at the right position for MagAsInt.
> int ShiftAmount = SignAsInt.SignBit - MagAsInt.SignBit;
> + EVT ShiftVT = IntVT;
> + if (SignBit.getValueSizeInBits() < ClearedSign.getValueSizeInBits()) {
> + SignBit = DAG.getNode(ISD::ZERO_EXTEND, DL, MagVT, SignBit);
> + ShiftVT = MagVT;
> + }
> + if (ShiftAmount > 0) {
> + SDValue ShiftCnst = DAG.getConstant(ShiftAmount, DL, ShiftVT);
> + SignBit = DAG.getNode(ISD::SRL, DL, ShiftVT, SignBit, ShiftCnst);
> + } else if (ShiftAmount < 0) {
> + SDValue ShiftCnst = DAG.getConstant(-ShiftAmount, DL, ShiftVT);
> + SignBit = DAG.getNode(ISD::SHL, DL, ShiftVT, SignBit, ShiftCnst);
> + }
> if (SignBit.getValueSizeInBits() > ClearedSign.getValueSizeInBits()) {
> - if (ShiftAmount > 0) {
> - SDValue ShiftCnst = DAG.getConstant(ShiftAmount, DL, IntVT);
> - SignBit = DAG.getNode(ISD::SRL, DL, IntVT, SignBit, ShiftCnst);
> - } else if (ShiftAmount < 0) {
> - SDValue ShiftCnst = DAG.getConstant(-ShiftAmount, DL, IntVT);
> - SignBit = DAG.getNode(ISD::SHL, DL, IntVT, SignBit, ShiftCnst);
> - }
> SignBit = DAG.getNode(ISD::TRUNCATE, DL, MagVT, SignBit);
> - } else if (SignBit.getValueSizeInBits() < ClearedSign.getValueSizeInBits()) {
> - SignBit = DAG.getNode(ISD::ZERO_EXTEND, DL, MagVT, SignBit);
> - if (ShiftAmount > 0) {
> - SDValue ShiftCnst = DAG.getConstant(ShiftAmount, DL, MagVT);
> - SignBit = DAG.getNode(ISD::SRL, DL, MagVT, SignBit, ShiftCnst);
> - } else if (ShiftAmount < 0) {
> - SDValue ShiftCnst = DAG.getConstant(-ShiftAmount, DL, MagVT);
> - SignBit = DAG.getNode(ISD::SHL, DL, MagVT, SignBit, ShiftCnst);
> - }
> }
>
> // Store the part with the modified sign and convert back to float.
>
> Modified: llvm/trunk/test/CodeGen/AArch64/fcopysign.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/fcopysign.ll?rev=338665&r1=338664&r2=338665&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/fcopysign.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/fcopysign.ll Wed Aug 1 18:54:12 2018
> @@ -5,10 +5,12 @@ target triple = "aarch64--"
>
> declare fp128 @llvm.copysign.f128(fp128, fp128)
>
> - at val = global double zeroinitializer, align 8
> + at val_float = global float zeroinitializer, align 4
> + at val_double = global double zeroinitializer, align 8
> + at val_fp128 = global fp128 zeroinitializer, align 16
>
> ; CHECK-LABEL: copysign0
> -; CHECK: ldr [[REG:x[0-9]+]], [x8, :lo12:val]
> +; CHECK: ldr [[REG:x[0-9]+]], [x8, :lo12:val_double]
> ; CHECK: and [[ANDREG:x[0-9]+]], [[REG]], #0x8000000000000000
> ; CHECK: lsr x[[LSRREGNUM:[0-9]+]], [[ANDREG]], #56
> ; CHECK: bfxil w[[LSRREGNUM]], w{{[0-9]+}}, #0, #7
> @@ -16,8 +18,25 @@ declare fp128 @llvm.copysign.f128(fp128,
> ; CHECK: ldr q{{[0-9]+}},
> define fp128 @copysign0() {
> entry:
> - %v = load double, double* @val, align 8
> + %v = load double, double* @val_double, align 8
> %conv = fpext double %v to fp128
> %call = tail call fp128 @llvm.copysign.f128(fp128 0xL00000000000000007FFF000000000000, fp128 %conv) #2
> ret fp128 %call
> }
> +
> +; CHECK-LABEL: copysign1
> +; CHECK-DAG: ldr [[REG:q[0-9]+]], [x8, :lo12:val_fp128]
> +; CHECK-DAG: ldr [[REG:w[0-9]+]], [x8, :lo12:val_float]
> +; CHECK: and [[ANDREG:w[0-9]+]], [[REG]], #0x80000000
> +; CHECK: lsr w[[LSRREGNUM:[0-9]+]], [[ANDREG]], #24
> +; CHECK: bfxil w[[LSRREGNUM]], w{{[0-9]+}}, #0, #7
> +; CHECK: strb w[[LSRREGNUM]],
> +; CHECK: ldr q{{[0-9]+}},
> +define fp128 at copysign1() {
> +entry:
> + %v0 = load fp128, fp128* @val_fp128, align 16
> + %v1 = load float, float* @val_float, align 4
> + %conv = fpext float %v1 to fp128
> + %call = tail call fp128 @llvm.copysign.f128(fp128 %v0, fp128 %conv)
> + ret fp128 %call
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list