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 {


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to