[clang] 8cb6bfe - [RISCV] Reduce ManualCodeGen for RVV intrinsics with rounding mode. NFC
Craig Topper via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 20 18:00:28 PDT 2025
Author: Craig Topper
Date: 2025-08-20T17:53:46-07:00
New Revision: 8cb6bfe05a26e40dee21d6107655baacc03540a9
URL: https://github.com/llvm/llvm-project/commit/8cb6bfe05a26e40dee21d6107655baacc03540a9
DIFF: https://github.com/llvm/llvm-project/commit/8cb6bfe05a26e40dee21d6107655baacc03540a9.diff
LOG: [RISCV] Reduce ManualCodeGen for RVV intrinsics with rounding mode. NFC
Operate directly on the existing Ops vector instead of copying to
a new vector. This is similar to what the autogenerated codegen
does for other intrinsics.
Added:
Modified:
clang/include/clang/Basic/riscv_vector.td
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/riscv_vector.td b/clang/include/clang/Basic/riscv_vector.td
index 0297a7afe0911..c1de2bfe4243d 100644
--- a/clang/include/clang/Basic/riscv_vector.td
+++ b/clang/include/clang/Basic/riscv_vector.td
@@ -1316,33 +1316,21 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, op1, round_mode, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
- Operands.push_back(Ops[Offset + 2]); // vxrm
- Operands.push_back(Ops[Offset + 3]); // vl
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Ops[Offset + 1]->getType(), Ops.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()};
+ break;
}
}] in {
// 12.2. Vector Single-Width Averaging Add and Subtract
@@ -1365,34 +1353,22 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, op1, round_mode, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, vxrm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
- Operands.push_back(Ops[Offset + 2]); // vxrm
- Operands.push_back(Ops[Offset + 3]); // vl
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[Offset + 1]->getType(),
+ IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
Ops.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ break;
}
}] in {
// 12.5. Vector Narrowing Fixed-Point Clip Instructions
@@ -1420,7 +1396,6 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, op1, round_mode, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
@@ -1428,35 +1403,20 @@ let ManualCodegen = [{
(HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5) :
(HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 2]); // frm
- Operands.push_back(Ops[Offset + 3]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 2]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- }
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
+
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Ops[Offset + 1]->getType(),
- Operands.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()};
+ break;
}
}] in {
let HasFRMRoundModeOp = true in {
@@ -1497,7 +1457,6 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, op1, round_mode, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
@@ -1505,35 +1464,21 @@ let ManualCodegen = [{
(HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5) :
(HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 2]); // frm
- Operands.push_back(Ops[Offset + 3]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 2]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- }
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
+
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[Offset + 1]->getType(),
+ IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
Ops.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ break;
}
}] in {
let HasFRMRoundModeOp = true in {
@@ -1576,38 +1521,23 @@ let UnMaskedPolicyScheme = HasPolicyOperand in {
let ManualCodegen = [{
{
// LLVM intrinsic
- // Unmasked: (passthru, op0, op1, round_mode, vl)
- // Masked: (passthru, vector_in, vector_in/scalar_in, mask, frm, vl, policy)
+ // Unmasked: (vector_in, vector_in/scalar_in, vector_in, round_mode, vl, policy)
+ // Masked: (vector_in, vector_in/scalar_in, vector_in, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
- unsigned Offset = IsMasked ? 2 : 1;
-
- Operands.push_back(Ops[IsMasked ? 1 : 0]); // passthrough
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 2]); // frm
- Operands.push_back(Ops[Offset + 3]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 2]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- }
-
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
- Operands.back()->getType()};
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
+ IntrinsicTypes = {ResultType, Ops[1]->getType(),
+ Ops.back()->getType()};
- return Builder.CreateCall(F, Operands, "");
+ break;
}
}] in {
let HasFRMRoundModeOp = 1 in {
@@ -1635,38 +1565,23 @@ let ManualCodegen = [{
let ManualCodegen = [{
{
// LLVM intrinsic
- // Unmasked: (passthru, op0, op1, round_mode, vl)
- // Masked: (passthru, vector_in, vector_in/scalar_in, mask, frm, vl, policy)
+ // Unmasked: (vector_in, vector_in/scalar_in, vector_in, round_mode, vl, policy)
+ // Masked: (vector_in, vector_in/scalar_in, vector_in, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 7> Operands;
bool HasRoundModeOp = IsMasked ? Ops.size() == 6 : Ops.size() == 5;
- unsigned Offset = IsMasked ? 2 : 1;
-
- Operands.push_back(Ops[IsMasked ? 1 : 0]); // passthrough
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 2]); // frm
- Operands.push_back(Ops[Offset + 3]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 2]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- }
-
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 4);
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[Offset + 1]->getType(),
- Operands.back()->getType()};
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
+ IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[2]->getType(),
+ Ops.back()->getType()};
- return Builder.CreateCall(F, Operands, "");
+ break;
}
}] in {
let HasFRMRoundModeOp = 1 in {
@@ -1708,7 +1623,6 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, round_mode, vl)
// Masked: (passthru, op0, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 6> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
@@ -1716,33 +1630,20 @@ let ManualCodegen = [{
(HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4) :
(HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 1]); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 1]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 1]); // vl
- }
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
+
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Operands.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ IntrinsicTypes = {ResultType, Ops.back()->getType()};
+ break;
}
}] in {
let HasFRMRoundModeOp = 1 in {
@@ -1907,7 +1808,6 @@ let ManualCodegen = [{
// LLVM intrinsic
// Unmasked: (passthru, op0, frm, vl)
// Masked: (passthru, op0, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 6> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
@@ -1915,34 +1815,20 @@ let ManualCodegen = [{
(HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4) :
(HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3);
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 1]); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 1]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 1]); // vl
- }
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
+
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
if (IsMasked)
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
+ Ops.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
- Operands.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops.back()->getType()};
+ break;
}
}] in {
let HasFRMRoundModeOp = 1 in {
@@ -2112,7 +1998,6 @@ let ManualCodegen = [{
// Unmasked: (passthru, op0, op1, round_mode, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, frm, vl, policy)
- SmallVector<llvm::Value*, 6> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
@@ -2120,32 +2005,17 @@ let ManualCodegen = [{
(HasMaskedOff ? Ops.size() == 6 : Ops.size() == 5) :
(HasMaskedOff ? Ops.size() == 5 : Ops.size() == 4);
- unsigned Offset = IsMasked ?
- (HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);
-
- if (!HasMaskedOff)
- Operands.push_back(llvm::PoisonValue::get(ResultType));
- else
- Operands.push_back(Ops[IsMasked ? 1 : 0]);
-
- Operands.push_back(Ops[Offset]); // op0
- Operands.push_back(Ops[Offset + 1]); // op1
+ if (!HasRoundModeOp)
+ Ops.insert(Ops.end() - 1, ConstantInt::get(Ops.back()->getType(), 7)); // frm
if (IsMasked)
- Operands.push_back(Ops[0]); // mask
-
- if (HasRoundModeOp) {
- Operands.push_back(Ops[Offset + 2]); // frm
- Operands.push_back(Ops[Offset + 3]); // vl
- } else {
- Operands.push_back(ConstantInt::get(Ops[Offset + 2]->getType(), 7)); // frm
- Operands.push_back(Ops[Offset + 2]); // vl
- }
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end() - 2);
- IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
- Ops.back()->getType()};
- llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
- return Builder.CreateCall(F, Operands, "");
+ if (!HasMaskedOff)
+ Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
+
+ IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops.back()->getType()};
+ break;
}
}] in {
let HasFRMRoundModeOp = 1 in {
More information about the cfe-commits
mailing list