Skip to content

Commit e13e848

Browse files
fixup! use ConstantInt to represent G_VSCALE operand
1 parent 8770ba0 commit e13e848

File tree

6 files changed

+31
-8
lines changed

6 files changed

+31
-8
lines changed

llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1150,11 +1150,21 @@ class MachineIRBuilder {
11501150
///
11511151
/// \pre setBasicBlock or setMI must have been called.
11521152
/// \pre \p Res must be a generic virtual register with scalar type.
1153-
/// \pre \p Src must be a generic virtual register with scalar type.
11541153
///
11551154
/// \return a MachineInstrBuilder for the newly created instruction.
11561155
MachineInstrBuilder buildVScale(const DstOp &Res, unsigned MinElts);
11571156

1157+
/// Build and insert \p Res = G_VSCALE \p MinElts
1158+
///
1159+
/// G_VSCALE puts the value of the runtime vscale multiplied by \p MinElts
1160+
/// into \p Res.
1161+
///
1162+
/// \pre setBasicBlock or setMI must have been called.
1163+
/// \pre \p Res must be a generic virtual register with scalar type.
1164+
///
1165+
/// \return a MachineInstrBuilder for the newly created instruction.
1166+
MachineInstrBuilder buildVScale(const DstOp &Res, const ConstantInt &MinElts);
1167+
11581168
/// Build and insert a G_INTRINSIC instruction.
11591169
///
11601170
/// There are four different opcodes based on combinations of whether the

llvm/include/llvm/Target/GenericOpcodes.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1294,7 +1294,7 @@ def G_MERGE_VALUES : GenericInstruction {
12941294
// operand into the destination register.
12951295
def G_VSCALE : GenericInstruction {
12961296
let OutOperandList = (outs type0:$dst);
1297-
let InOperandList = (ins untyped_imm_0:$src);
1297+
let InOperandList = (ins unknown:$src);
12981298
let hasSideEffects = false;
12991299
}
13001300

llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,20 @@ MachineInstrBuilder MachineIRBuilder::buildInsert(const DstOp &Res,
795795

796796
MachineInstrBuilder MachineIRBuilder::buildVScale(const DstOp &Res,
797797
unsigned MinElts) {
798-
return buildInstr(TargetOpcode::G_VSCALE, {Res}, {uint64_t(MinElts)});
798+
799+
auto IntN = IntegerType::get(getMF().getFunction().getContext(),
800+
Res.getLLTTy(*getMRI()).getScalarSizeInBits());
801+
ConstantInt *CI = ConstantInt::get(IntN, MinElts);
802+
return buildVScale(Res, *CI);
803+
}
804+
805+
MachineInstrBuilder MachineIRBuilder::buildVScale(const DstOp &Res,
806+
const ConstantInt &MinElts) {
807+
auto VScale = buildInstr(TargetOpcode::G_VSCALE);
808+
VScale->setDebugLoc(DebugLoc());
809+
Res.addDefToMIB(*getMRI(), VScale);
810+
VScale.addCImm(&MinElts);
811+
return VScale;
799812
}
800813

801814
static unsigned getIntrinsicOpcode(bool HasSideEffects, bool IsConvergent) {

llvm/lib/CodeGen/MachineVerifier.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,11 +1614,11 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
16141614
break;
16151615
}
16161616
case TargetOpcode::G_VSCALE: {
1617-
if (!MI->getOperand(1).isImm()) {
1618-
report("G_VSCALE operand #1 must be an immediate", MI);
1617+
if (!MI->getOperand(1).isCImm()) {
1618+
report("G_VSCALE operand must be cimm", MI);
16191619
break;
16201620
}
1621-
if (MI->getOperand(1).getImm() == 0) {
1621+
if (MI->getOperand(1).getCImm()->isZero()) {
16221622
report("G_VSCALE immediate cannot be zero", MI);
16231623
break;
16241624
}

llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@
616616
# DEBUG-NEXT: G_BRJT (opcode {{[0-9]+}}): 2 type indices
617617
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
618618
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
619-
# DEBUG-NEXT: G_VSCALE (opcode {{[0-9]+}}): 1 type index, 1 imm index
619+
# DEBUG-NEXT: G_VSCALE (opcode {{[0-9]+}}): 1 type index, 0 imm indices
620620
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
621621
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
622622
# DEBUG-NEXT: G_INSERT_SUBVECTOR (opcode {{[0-9]+}}): 2 type indices, 1 imm index

llvm/test/MachineVerifier/test_g_vscale.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ body: |
77
88
%1:_(s32) = G_CONSTANT 4
99
10-
; CHECK: G_VSCALE operand #1 must be an immediate
10+
; CHECK: G_VSCALE operand must be cimm
1111
%2:_(s32) = G_VSCALE %1
1212
1313
; CHECK: G_VSCALE immediate cannot be zero

0 commit comments

Comments
 (0)