[PATCH] D125680: Correctly legalise stackmap operands

Edd Barrett via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 07:03:28 PDT 2022


vext01 updated this revision to Diff 440603.
vext01 added a comment.

OK, on IRC @arsenm and I agreed that for the cases that we can't yet handle, we should see the same legaliser error that we see in-tree now.o

This change implements that, albeit slightly clumsily with a `goto`. If you simply don't expand the problematic operand, as I first tried, the legaliser gets stuck in an infinite loop. Note also that `goto default` is not valid in C/C++, so had to add another label.

We do still have to special-case constants I'm afraid.

Also fixed the `EXTEND_ANY` thing and fixed some incorrectly numbered comments in the test.

Diff to previous:

  diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  index 7ed2808600cf..44e6a9e5a6a6 100644
  --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  @@ -2311,7 +2311,10 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SET_ROUNDING(SDNode *N) {
   SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(SDNode *N, unsigned OpNo) {
     assert(OpNo > 1); // Because the first two arguments are guaranteed legal.
     SmallVector<SDValue> NewOps(N->ops().begin(), N->ops().end());
  -  NewOps[OpNo] = ZExtPromotedInteger(N->getOperand(OpNo));
  +  SDValue Operand = N->getOperand(OpNo);
  +  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), Operand.getValueType());
  +  NewOps[OpNo] =
  +      DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), NVT, N->getOperand(OpNo));
     return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
   }
   
  @@ -4631,6 +4634,7 @@ bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
       return false;
   
     switch (N->getOpcode()) {
  +  fail:
     default:
     #ifndef NDEBUG
       dbgs() << "ExpandIntegerOperand Op #" << OpNo << ": ";
  @@ -4665,7 +4669,11 @@ bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
   
     case ISD::ATOMIC_STORE:      Res = ExpandIntOp_ATOMIC_STORE(N); break;
     case ISD::STACKMAP:
  -    Res = ExpandIntOp_STACKMAP(N, OpNo);
  +    Optional<SDValue> MaybeRes = ExpandIntOp_STACKMAP(N, OpNo);
  +    if (MaybeRes.hasValue())
  +      Res = MaybeRes.getValue();
  +    else
  +      goto fail;
       break;
     }
   
  @@ -5496,7 +5504,8 @@ SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {
     return DAG.getBuildVector(N->getValueType(0), dl, NewOps);
   }
   
  -SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(SDNode *N, unsigned OpNo) {
  +Optional<SDValue> DAGTypeLegalizer::ExpandIntOp_STACKMAP(SDNode *N,
  +                                                         unsigned OpNo) {
     assert(OpNo > 1);
   
     SDValue Op = N->getOperand(OpNo);
  @@ -5508,19 +5517,21 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(SDNode *N, unsigned OpNo) {
       NewOps.push_back(N->getOperand(I));
   
     if (Op->getOpcode() == ISD::Constant) {
  -    // FIXME: https://github.com/llvm/llvm-project/issues/55609
       ConstantSDNode *CN = cast<ConstantSDNode>(Op);
       EVT Ty = Op.getValueType();
  -    NewOps.push_back(
  -        DAG.getTargetConstant(StackMaps::ConstantOp, DL, MVT::i64));
  -    NewOps.push_back(DAG.getTargetConstant(CN->getZExtValue(), DL, Ty));
  +    if (CN->getConstantIntValue()->getValue().getActiveBits() < 64) {
  +      NewOps.push_back(
  +          DAG.getTargetConstant(StackMaps::ConstantOp, DL, MVT::i64));
  +      NewOps.push_back(DAG.getTargetConstant(CN->getZExtValue(), DL, Ty));
  +    } else {
  +      // FIXME: https://github.com/llvm/llvm-project/issues/55609
  +      return Optional<SDValue>();
  +    }
     } else {
  -    // FIXME: There are a couple of problems with expanding non-constants for
  -    // stackmaps:
  +    // FIXME: Non-constant operands are not yet handled:
       //  - https://github.com/llvm/llvm-project/issues/26431
       //  - https://github.com/llvm/llvm-project/issues/55957
  -    DAG.getContext()->emitError(
  -        "expanding this stackmap operand is unimplemented");
  +    return Optional<SDValue>();
     }
   
     // Copy remaining operands.
  diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
  index 2807b7f5ae68..bc8257c9ec4c 100644
  --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
  +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
  @@ -494,7 +494,7 @@ private:
     SDValue ExpandIntOp_RETURNADDR(SDNode *N);
     SDValue ExpandIntOp_ATOMIC_STORE(SDNode *N);
     SDValue ExpandIntOp_SPLAT_VECTOR(SDNode *N);
  -  SDValue ExpandIntOp_STACKMAP(SDNode *N, unsigned OpNo);
  +  Optional<SDValue> ExpandIntOp_STACKMAP(SDNode *N, unsigned OpNo);
   
     void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
                                     ISD::CondCode &CCCode, const SDLoc &dl);
  diff --git a/llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll b/llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll
  index 32242ac1239b..bc624be5318e 100644
  --- a/llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll
  +++ b/llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll
  @@ -73,35 +73,35 @@
   ;         CHECK-NEXT: .short  {{.*}}
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .long   66
  -;       Location[4]
  +;       Location[6]
   ;         CHECK-NEXT: .byte   1
   ;         CHECK-NEXT: .byte   0
   ;         CHECK-NEXT: .short  4
   ;         CHECK-NEXT: .short  {{.*}}
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .long   0
  -;       Location[5]
  +;       Location[7]
   ;         CHECK-NEXT: .byte   4
   ;         CHECK-NEXT: .byte   0
   ;         CHECK-NEXT: .short  8
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .long   0
  -;       Location[6]
  +;       Location[8]
   ;         CHECK-NEXT: .byte   1
   ;         CHECK-NEXT: .byte   0
   ;         CHECK-NEXT: .short  4
   ;         CHECK-NEXT: .short  {{.*}}
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .long   0
  -;       Location[7]
  +;       Location[9]
   ;         CHECK-NEXT: .byte   4
   ;         CHECK-NEXT: .byte   0
   ;         CHECK-NEXT: .short  8
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .short  0
   ;         CHECK-NEXT: .long   0
  -;       Location[6]
  +;       Location[10]
   ;         CHECK-NEXT: .byte   1
   ;         CHECK-NEXT: .byte   0
   ;         CHECK-NEXT: .short  1

LGTY?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125680/new/

https://reviews.llvm.org/D125680

Files:
  llvm/include/llvm/CodeGen/ISDOpcodes.h
  llvm/include/llvm/CodeGen/SelectionDAGISel.h
  llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
  llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
  llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D125680.440603.patch
Type: text/x-patch
Size: 18650 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220628/d60ced75/attachment.bin>


More information about the llvm-commits mailing list