[llvm] r338206 - Fix crash on inline asm with 64bit matching input in 32bit GPR

Thomas Preudhomme via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 30 01:43:58 PDT 2018


Thanks Sanjay and my apologies. I tried to revert but could not access
to my commit machine due to network issues. Seems that the test fails
only when LLVM was compiled with LLVM which I'll investigate. I'll
make sure I try a 2 stage build next time.

Best regards,

Thomas

On Sun, 29 Jul 2018 at 15:32, Sanjay Patel via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> I reverted this patch at r338214 because it broke several bots like this:
> http://lab.llvm.org:8011/builders/clang-cmake-armv8-quick/builds/5107/steps/ninja%20check%201/logs/FAIL%3A%20LLVM%3A%3Ainline-asm-operand-implicit-cast.ll
>
>
> On Sat, Jul 28, 2018 at 3:33 PM, Thomas Preud'homme via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: thopre
>> Date: Sat Jul 28 14:33:39 2018
>> New Revision: 338206
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=338206&view=rev
>> Log:
>> Fix crash on inline asm with 64bit matching input in 32bit GPR
>>
>> Add support for inline assembly with matching input operand that do not
>> naturally go in the register class it is constrained to (eg. double in a
>> 32-bit GPR). Note that regular input is already handled by existing
>> code.
>>
>> Modified:
>>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>     llvm/trunk/test/CodeGen/ARM/inline-asm-operand-implicit-cast.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=338206&r1=338205&r2=338206&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Sat Jul 28 14:33:39 2018
>> @@ -7198,10 +7198,11 @@ static SDValue getAddressForMemoryInput(
>>  /// uses features that we can't model on machineinstrs, we have SDISel do the
>>  /// allocation.  This produces generally horrible, but correct, code.
>>  ///
>> -///   OpInfo describes the operand.
>> +///   OpInfo describes the operand
>> +///   RefOpInfo describes the matching operand if any, the operand otherwise
>>  static void GetRegistersForValue(SelectionDAG &DAG, const TargetLowering &TLI,
>> -                                 const SDLoc &DL,
>> -                                 SDISelAsmOperandInfo &OpInfo) {
>> +                                 const SDLoc &DL, SDISelAsmOperandInfo &OpInfo,
>> +                                 SDISelAsmOperandInfo &RefOpInfo) {
>>    LLVMContext &Context = *DAG.getContext();
>>
>>    MachineFunction &MF = DAG.getMachineFunction();
>> @@ -7211,8 +7212,8 @@ static void GetRegistersForValue(Selecti
>>    // If this is a constraint for a single physreg, or a constraint for a
>>    // register class, find it.
>>    std::pair<unsigned, const TargetRegisterClass *> PhysReg =
>> -      TLI.getRegForInlineAsmConstraint(&TRI, OpInfo.ConstraintCode,
>> -                                       OpInfo.ConstraintVT);
>> +      TLI.getRegForInlineAsmConstraint(&TRI, RefOpInfo.ConstraintCode,
>> +                                       RefOpInfo.ConstraintVT);
>>
>>    unsigned NumRegs = 1;
>>    if (OpInfo.ConstraintVT != MVT::Other) {
>> @@ -7254,6 +7255,11 @@ static void GetRegistersForValue(Selecti
>>      NumRegs = TLI.getNumRegisters(Context, OpInfo.ConstraintVT);
>>    }
>>
>> +  // No need to allocate a matching input constraint since the constraint it's
>> +  // matching to has already been allocated.
>> +  if (OpInfo.isMatchingInputConstraint())
>> +    return;
>> +
>>    MVT RegVT;
>>    EVT ValueVT = OpInfo.ConstraintVT;
>>
>> @@ -7502,19 +7508,27 @@ void SelectionDAGBuilder::visitInlineAsm
>>
>>      // If this constraint is for a specific register, allocate it before
>>      // anything else.
>> -    if (OpInfo.ConstraintType == TargetLowering::C_Register)
>> -      GetRegistersForValue(DAG, TLI, getCurSDLoc(), OpInfo);
>> +    SDISelAsmOperandInfo &RefOpInfo =
>> +        OpInfo.isMatchingInputConstraint()
>> +            ? ConstraintOperands[OpInfo.getMatchedOperand()]
>> +            : ConstraintOperands[i];
>> +    if (RefOpInfo.ConstraintType == TargetLowering::C_Register)
>> +      GetRegistersForValue(DAG, TLI, getCurSDLoc(), OpInfo, RefOpInfo);
>>    }
>>
>>    // Third pass - Loop over all of the operands, assigning virtual or physregs
>>    // to register class operands.
>>    for (unsigned i = 0, e = ConstraintOperands.size(); i != e; ++i) {
>>      SDISelAsmOperandInfo &OpInfo = ConstraintOperands[i];
>> +    SDISelAsmOperandInfo &RefOpInfo =
>> +        OpInfo.isMatchingInputConstraint()
>> +            ? ConstraintOperands[OpInfo.getMatchedOperand()]
>> +            : ConstraintOperands[i];
>>
>>      // C_Register operands have already been allocated, Other/Memory don't need
>>      // to be.
>> -    if (OpInfo.ConstraintType == TargetLowering::C_RegisterClass)
>> -      GetRegistersForValue(DAG, TLI, getCurSDLoc(), OpInfo);
>> +    if (RefOpInfo.ConstraintType == TargetLowering::C_RegisterClass)
>> +      GetRegistersForValue(DAG, TLI, getCurSDLoc(), OpInfo, RefOpInfo);
>>    }
>>
>>    // AsmNodeOperands - The operands for the ISD::INLINEASM node.
>>
>> Modified: llvm/trunk/test/CodeGen/ARM/inline-asm-operand-implicit-cast.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/inline-asm-operand-implicit-cast.ll?rev=338206&r1=338205&r2=338206&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/ARM/inline-asm-operand-implicit-cast.ll (original)
>> +++ llvm/trunk/test/CodeGen/ARM/inline-asm-operand-implicit-cast.ll Sat Jul 28 14:33:39 2018
>> @@ -17,6 +17,42 @@ define arm_aapcscc double @zerobits_doub
>>    ret double %1
>>  }
>>
>> +; Check support for returning a float in GPR with matching float input with
>> +; soft float ABI
>> +define arm_aapcscc float @flt_gpr_matching_in_op_soft(float %f) #0 {
>> +; CHECK-LABEL: flt_gpr_matching_in_op_soft
>> +; CHECK: mov r0, r0
>> +  %1 = call float asm "mov $0, $1", "=&r,0"(float %f)
>> +  ret float %1
>> +}
>> +
>> +; Check support for returning a double in GPR with matching double input with
>> +; soft float ABI
>> +define arm_aapcscc double @dbl_gpr_matching_in_op_soft(double %d) #0 {
>> +; CHECK-LABEL: dbl_gpr_matching_in_op_soft
>> +; CHECK: mov r1, r0
>> +  %1 = call double asm "mov ${0:R}, ${1:Q}", "=&r,0"(double %d)
>> +  ret double %1
>> +}
>> +
>> +; Check support for returning a float in specific GPR with matching float input
>> +; with soft float ABI
>> +define arm_aapcscc float @flt_gpr_matching_spec_reg_in_op_soft(float %f) #0 {
>> +; CHECK-LABEL: flt_gpr_matching_spec_reg_in_op_soft
>> +; CHECK: mov r3, r3
>> +  %1 = call float asm "mov $0, $1", "=&{r3},0"(float %f)
>> +  ret float %1
>> +}
>> +
>> +; Check support for returning a double in specific GPR with matching double
>> +; input with soft float ABI
>> +define arm_aapcscc double @dbl_gpr_matching_spec_reg_in_op_soft(double %d) #0 {
>> +; CHECK-LABEL: dbl_gpr_matching_spec_reg_in_op_soft
>> +; CHECK: mov r3, r2
>> +  %1 = call double asm "mov ${0:R}, ${1:Q}", "=&{r2},0"(double %d)
>> +  ret double %1
>> +}
>> +
>>  attributes #0 = { nounwind "target-features"="+d16,+vfp2,+vfp3,-fp-only-sp" "use-soft-float"="true" }
>>
>>
>> @@ -39,4 +75,48 @@ define double @zerobits_double_hard() #1
>>    ret double %1
>>  }
>>
>> +; Check support for returning a float in GPR with matching float input with
>> +; hard float ABI
>> +define float @flt_gpr_matching_in_op_hard(float %f) #1 {
>> +; CHECK-LABEL: flt_gpr_matching_in_op_hard
>> +; CHECK: vmov r0, s0
>> +; CHECK: mov r0, r0
>> +; CHECK: vmov s0, r0
>> +  %1 = call float asm "mov $0, $1", "=&r,0"(float %f)
>> +  ret float %1
>> +}
>> +
>> +; Check support for returning a double in GPR with matching double input with
>> +; hard float ABI
>> +define double @dbl_gpr_matching_in_op_hard(double %d) #1 {
>> +; CHECK-LABEL: dbl_gpr_matching_in_op_hard
>> +; CHECK: vmov r0, r1, d0
>> +; CHECK: mov r1, r0
>> +; CHECK: vmov d0, r0, r1
>> +  %1 = call double asm "mov ${0:R}, ${1:Q}", "=&r,0"(double %d)
>> +  ret double %1
>> +}
>> +
>> +; Check support for returning a float in specific GPR with matching float
>> +; input with hard float ABI
>> +define float @flt_gpr_matching_spec_reg_in_op_hard(float %f) #1 {
>> +; CHECK-LABEL: flt_gpr_matching_spec_reg_in_op_hard
>> +; CHECK: vmov r3, s0
>> +; CHECK: mov r3, r3
>> +; CHECK: vmov s0, r3
>> +  %1 = call float asm "mov $0, $1", "=&{r3},0"(float %f)
>> +  ret float %1
>> +}
>> +
>> +; Check support for returning a double in specific GPR with matching double
>> +; input with hard float ABI
>> +define double @dbl_gpr_matching_spec_reg_in_op_hard(double %d) #1 {
>> +; CHECK-LABEL: dbl_gpr_matching_spec_reg_in_op_hard
>> +; CHECK: vmov r2, r3, d0
>> +; CHECK: mov r3, r2
>> +; CHECK: vmov d0, r2, r3
>> +  %1 = call double asm "mov ${0:R}, ${1:Q}", "=&{r2},0"(double %d)
>> +  ret double %1
>> +}
>> +
>>  attributes #1 = { nounwind "target-features"="+d16,+vfp2,+vfp3,-fp-only-sp" "use-soft-float"="false" }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
> _______________________________________________
> 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