Jon Chesterfield via llvm-dev
2017-Sep-05  11:01 UTC
[llvm-dev] Unexpected dag combine in arm64
Hi,
There are some generic DAGCombine functions which replace an SDNode with a
newly created but otherwise equivalent SDNode. Specifically, visit for
SINT_TO_FP, UINT_TO_FP, FP_TO_SINT, FP_TO_UINT where the operand is a
constant. This unconditionally prevents target specific dag combines from
executing for these nodes.
The `// fold (fp_to_sint c1fp) -> c1` creates a new node which is
functionally a copy of the input. I’d like to delete this clause to allow a
target specific combine to run.
SDValue DAGCombiner::visitFP_TO_SINT(SDNode *N) {
  SDValue N0 = N->getOperand(0);
  EVT VT = N->getValueType(0);
  // fold (fp_to_sint c1fp) -> c1
  if (isConstantFPBuildVectorOrConstantFP(N0))
    return DAG.getNode(ISD::FP_TO_SINT, SDLoc(N), VT, N0);
  return FoldIntToFPToInt(N, DAG);
}
However fp128-folding.ll and arm64-fp128-folding.ll codegen tests fail if I
do so. Allowing the target specific dag combines to run changes codegen for
constants. Unfortunately, I don’t know arm64. Could someone tell me whether
replacing:
        .text
        .file   "<stdin>"
        .section        .rodata.cst16,"aM", at progbits,16
        .p2align        4               // -- Begin function test_folding
.LCPI0_0:
        .xword  0                       // fp128 42
        .xword  4612899879264452608
        .text
        .globl  test_folding
        .p2align        2
        .type   test_folding, at function
test_folding:                           // @test_folding
        .cfi_startproc
// BB#0:
        sub     sp, sp, #16             // =16
.Lcfi0:
        .cfi_def_cfa_offset 16
       adrp    x8, .LCPI0_0
        ldr     q0, [x8, :lo12:.LCPI0_0]
        mov     w8, #42
        str     w8, [sp, #12]
        add     sp, sp, #16             // =16
        ret
.Lfunc_end0:
        .size   test_folding, .Lfunc_end0-test_folding
        .cfi_endproc
                                        // -- End function
        .section        ".note.GNU-stack","", at progbits
with:
        .text
        .file   "<stdin>"
        .globl  test_folding            // -- Begin function test_folding
        .p2align        2
        .type   test_folding, at function
test_folding:                           // @test_folding
        .cfi_startproc
// BB#0:
        str     x30, [sp, #-16]!        // 8-byte Folded Spill
.Lcfi0:
        .cfi_def_cfa_offset 16
.Lcfi1:
        .cfi_offset w30, -16
        mov     w8, #42
        mov     w0, #42
        str     w8, [sp, #12]
        bl      __floatsitf
        ldr     x30, [sp], #16          // 8-byte Folded Reload
        ret
.Lfunc_end0:
        .size   test_folding, .Lfunc_end0-test_folding
        .cfi_endproc
                                        // -- End function
        .section        ".note.GNU-stack","", at progbits
Is good, bad, irrelevant? I’m assuming ‘bad’ since __floatsitf looks like a
function call. If it is indeed bad, can I tempt anyone from arm to look at
this? Failing that, would a patch against your back end be welcome?
Thanks!
Jon
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170905/1f2c6a68/attachment.html>
Friedman, Eli via llvm-dev
2017-Sep-05  18:27 UTC
[llvm-dev] Unexpected dag combine in arm64
On 9/5/2017 4:01 AM, Jon Chesterfield via llvm-dev wrote:> > Hi, > > There are some generic DAGCombine functions which replace an > SDNode with a newly created but otherwise equivalent SDNode. > Specifically, visit for SINT_TO_FP, UINT_TO_FP, FP_TO_SINT, > FP_TO_UINT where the operand is a constant. This unconditionally > prevents target specific dag combines from executing for these nodes. >If you want to materialize a floating-point constant using an integer-to-floating-point conversion, I would suggest using a target-specific node rather than a target-independent one. -Eli -- Employee of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170905/132d55c7/attachment.html>