Skip to content

Commit 24da282

Browse files
committed
[TableGen] Added submulticlass typechecking to template arg values.
Some typechecking was missing when parsing a submulticlass reference. This adds it in and fixes any mistyped codes in .td files.
1 parent fe480cf commit 24da282

File tree

4 files changed

+23
-5
lines changed

4 files changed

+23
-5
lines changed

llvm/lib/TableGen/TGParser.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,12 @@ ParseSubMultiClassReference(MultiClass *CurMC) {
818818
return Result;
819819
}
820820

821+
if (CheckTemplateArgValues(Result.TemplateArgs, Result.RefRange.Start,
822+
&Result.MC->Rec)) {
823+
Result.MC = nullptr; // Error checking value list.
824+
return Result;
825+
}
826+
821827
Result.RefRange.End = Lex.getLoc();
822828

823829
return Result;

llvm/lib/Target/AMDGPU/VOPInstructions.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ defvar VOPDX_Max_Index = 12;
3737

3838
class VOPD_Component<bits<5> OpIn, string vOPDName> {
3939
Instruction BaseVOP = !cast<Instruction>(NAME);
40-
string VOPDName = "v_dual_" # !substr(vOPDName, 2);
40+
string VOPDName = "v_dual_" # !if(!le(!size(vOPDName), 2), "", !substr(vOPDName, 2));
4141
bits<5> VOPDOp = OpIn;
4242
bit CanBeVOPDX = !le(VOPDOp, VOPDX_Max_Index);
4343
}

llvm/lib/Target/ARM/ARMInstrMVE.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2199,7 +2199,7 @@ def subnsw : PatFrag<(ops node:$lhs, node:$rhs),
21992199
}]>;
22002200

22012201
multiclass MVE_VRHADD_m<MVEVectorVTInfo VTI, SDNode Op,
2202-
SDPatternOperator unpred_op, Intrinsic PredInt> {
2202+
DefaultAttrsIntrinsic unpred_op, Intrinsic PredInt> {
22032203
def "" : MVE_VRHADD_Base<VTI.Suffix, VTI.Unsigned, VTI.Size>;
22042204
defvar Inst = !cast<Instruction>(NAME);
22052205
defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), !cast<Instruction>(NAME)>;
@@ -2303,7 +2303,7 @@ class MVE_VHSUB_<string suffix, bit U, bits<2> size,
23032303
: MVE_VHADDSUB<"vhsub", suffix, U, 0b1, size, pattern>;
23042304

23052305
multiclass MVE_VHADD_m<MVEVectorVTInfo VTI, SDNode Op,
2306-
SDPatternOperator unpred_op, Intrinsic PredInt, PatFrag add_op,
2306+
DefaultAttrsIntrinsic unpred_op, Intrinsic PredInt, PatFrag add_op,
23072307
SDNode shift_op> {
23082308
def "" : MVE_VHADD_<VTI.Suffix, VTI.Unsigned, VTI.Size>;
23092309
defvar Inst = !cast<Instruction>(NAME);
@@ -2335,7 +2335,7 @@ defm MVE_VHADDu16 : MVE_VHADD<MVE_v8u16, avgflooru, addnuw, ARMvshruImm>;
23352335
defm MVE_VHADDu32 : MVE_VHADD<MVE_v4u32, avgflooru, addnuw, ARMvshruImm>;
23362336

23372337
multiclass MVE_VHSUB_m<MVEVectorVTInfo VTI,
2338-
SDPatternOperator unpred_op, Intrinsic pred_int, PatFrag sub_op,
2338+
DefaultAttrsIntrinsic unpred_op, Intrinsic pred_int, PatFrag sub_op,
23392339
SDNode shift_op> {
23402340
def "" : MVE_VHSUB_<VTI.Suffix, VTI.Unsigned, VTI.Size>;
23412341
defvar Inst = !cast<Instruction>(NAME);
@@ -4794,7 +4794,7 @@ class MVE_VxMULH<string iname, string suffix, bit U, bits<2> size, bit round,
47944794
let validForTailPredication = 1;
47954795
}
47964796

4797-
multiclass MVE_VxMULH_m<string iname, MVEVectorVTInfo VTI, SDPatternOperator unpred_op,
4797+
multiclass MVE_VxMULH_m<string iname, MVEVectorVTInfo VTI, DefaultAttrsIntrinsic unpred_op,
47984798
Intrinsic PredInt, bit round> {
47994799
def "" : MVE_VxMULH<iname, VTI.Suffix, VTI.Unsigned, VTI.Size, round>;
48004800
defvar Inst = !cast<Instruction>(NAME);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
2+
// XFAIL: vg_leak
3+
// CHECK: {{.*}}: error: Value specified for template argument 'B::op' is of type bits<4>; expected type bits<8>: C::op
4+
// CHECK-NEXT: multiclass C<bits<4> op> : B<op>;
5+
class A<bits<8> op> {
6+
bits<8> f = op;
7+
}
8+
multiclass B<bits<8> op> {
9+
def : A<op>;
10+
}
11+
multiclass C<bits<4> op> : B<op>;
12+
defm D : C<0>;

0 commit comments

Comments
 (0)