[llvm] [PowerPC] Enhance vec_rl() to generate xvrlw (PR #189023)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 27 08:19:28 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-powerpc

Author: Lei Huang (lei137)

<details>
<summary>Changes</summary>

Enhance existing builtin vec_rl() to generate the new xvrlw, VSX version of vrlw, for cpu=future.

---
Full diff: https://github.com/llvm/llvm-project/pull/189023.diff


3 Files Affected:

- (modified) llvm/lib/Target/PowerPC/PPCInstrAltivec.td (+6-2) 
- (modified) llvm/lib/Target/PowerPC/PPCInstrFuture.td (+2) 
- (modified) llvm/test/CodeGen/PowerPC/vector-rotates.ll (+25-4) 


``````````diff
diff --git a/llvm/lib/Target/PowerPC/PPCInstrAltivec.td b/llvm/lib/Target/PowerPC/PPCInstrAltivec.td
index 156931a372136..844ff7cc791df 100644
--- a/llvm/lib/Target/PowerPC/PPCInstrAltivec.td
+++ b/llvm/lib/Target/PowerPC/PPCInstrAltivec.td
@@ -705,7 +705,8 @@ def VXOR : VXForm_1<1220, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
 
 def VRLB   : VX1_Int_Ty<   4, "vrlb", int_ppc_altivec_vrlb, v16i8>;
 def VRLH   : VX1_Int_Ty<  68, "vrlh", int_ppc_altivec_vrlh, v8i16>;
-def VRLW   : VX1_Int_Ty< 132, "vrlw", int_ppc_altivec_vrlw, v4i32>;
+def VRLW   : VXForm_1<132, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
+                      "vrlw $VD, $VA, $VB", IIC_VecFP, []>;
 
 def VSL    : VX1_Int_Ty< 452, "vsl" , int_ppc_altivec_vsl,  v4i32 >;
 def VSLO   : VX1_Int_Ty<1036, "vslo", int_ppc_altivec_vslo, v4i32>;
@@ -890,9 +891,12 @@ def : Pat<(v16i8 (rotl v16i8:$vA, v16i8:$vB)),
           (v16i8 (VRLB v16i8:$vA, v16i8:$vB))>;
 def : Pat<(v8i16 (rotl v8i16:$vA, v8i16:$vB)),
           (v8i16 (VRLH v8i16:$vA, v8i16:$vB))>;
-let Predicates = [IsNotISAFuture] in
+let Predicates = [IsNotISAFuture] in {
 def : Pat<(v4i32 (rotl v4i32:$vA, v4i32:$vB)),
           (v4i32 (VRLW v4i32:$vA, v4i32:$vB))>;
+def : Pat<(v4i32 (int_ppc_altivec_vrlw v4i32:$vA, v4i32:$vB)),
+          (v4i32 (VRLW v4i32:$vA, v4i32:$vB))>;
+}
 
 // Multiply
 def : Pat<(mul v8i16:$vA, v8i16:$vB), (VMLADDUHM $vA, $vB, (v8i16(V_SET0H)))>;
diff --git a/llvm/lib/Target/PowerPC/PPCInstrFuture.td b/llvm/lib/Target/PowerPC/PPCInstrFuture.td
index 0cd63a88cb96b..1561624b5e4ce 100644
--- a/llvm/lib/Target/PowerPC/PPCInstrFuture.td
+++ b/llvm/lib/Target/PowerPC/PPCInstrFuture.td
@@ -610,6 +610,8 @@ let Predicates = [HasFutureVector, PairedVectorMemops] in {
 let Predicates = [HasFutureVector] in {
   def : Pat<(v4i32 (rotl v4i32:$vA, v4i32:$vB)), (v4i32 (XVRLW v4i32:$vA,
                                                      v4i32:$vB))>;
+  def : Pat<(v4i32 (int_ppc_altivec_vrlw v4i32:$vA, v4i32:$vB)),
+            (v4i32 (XVRLW v4i32:$vA, v4i32:$vB))>;
 }
 
 //---------------------------- Instruction aliases ---------------------------//
diff --git a/llvm/test/CodeGen/PowerPC/vector-rotates.ll b/llvm/test/CodeGen/PowerPC/vector-rotates.ll
index 38e273634da2a..21e9c358d723b 100644
--- a/llvm/test/CodeGen/PowerPC/vector-rotates.ll
+++ b/llvm/test/CodeGen/PowerPC/vector-rotates.ll
@@ -134,11 +134,32 @@ entry:
   ret <4 x i32> %d
 }
 
+; Test int_ppc_altivec_vrlw intrinsic (from vec_rl() builtin)
+define <4 x i32> @rotl_v4i32_intrinsic(<4 x i32> %a, <4 x i32> %b) {
+; CHECK-P8-LABEL: rotl_v4i32_intrinsic:
+; CHECK-P8:       # %bb.0:
+; CHECK-P8-NEXT:    vrlw v2, v2, v3
+; CHECK-P8-NEXT:    blr
+;
+; CHECK-P7-LABEL: rotl_v4i32_intrinsic:
+; CHECK-P7:       # %bb.0:
+; CHECK-P7-NEXT:    vrlw v2, v2, v3
+; CHECK-P7-NEXT:    blr
+;
+; CHECK-FUTURE-LABEL: rotl_v4i32_intrinsic:
+; CHECK-FUTURE:       # %bb.0:
+; CHECK-FUTURE-NEXT:    xvrlw vs34, vs34, vs35
+; CHECK-FUTURE-NEXT:    blr
+  %res = call <4 x i32> @llvm.ppc.altivec.vrlw(<4 x i32> %a, <4 x i32> %b)
+  ret <4 x i32> %res
+}
+declare <4 x i32> @llvm.ppc.altivec.vrlw(<4 x i32>, <4 x i32>)
+
 define <2 x i64> @rotl_v2i64(<2 x i64> %a) {
 ; CHECK-P8-LABEL: rotl_v2i64:
 ; CHECK-P8:       # %bb.0: # %entry
-; CHECK-P8-NEXT:    addis r3, r2, .LCPI4_0 at toc@ha
-; CHECK-P8-NEXT:    addi r3, r3, .LCPI4_0 at toc@l
+; CHECK-P8-NEXT:    addis r3, r2, .LCPI5_0 at toc@ha
+; CHECK-P8-NEXT:    addi r3, r3, .LCPI5_0 at toc@l
 ; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
 ; CHECK-P8-NEXT:    xxswapd vs35, vs0
 ; CHECK-P8-NEXT:    vrld v2, v2, v3
@@ -160,8 +181,8 @@ define <2 x i64> @rotl_v2i64(<2 x i64> %a) {
 ;
 ; CHECK-FUTURE-LABEL: rotl_v2i64:
 ; CHECK-FUTURE:       # %bb.0: # %entry
-; CHECK-FUTURE-NEXT:    addis r3, r2, .LCPI4_0 at toc@ha
-; CHECK-FUTURE-NEXT:    addi r3, r3, .LCPI4_0 at toc@l
+; CHECK-FUTURE-NEXT:    addis r3, r2, .LCPI5_0 at toc@ha
+; CHECK-FUTURE-NEXT:    addi r3, r3, .LCPI5_0 at toc@l
 ; CHECK-FUTURE-NEXT:    lxv vs35, 0(r3)
 ; CHECK-FUTURE-NEXT:    vrld v2, v2, v3
 ; CHECK-FUTURE-NEXT:    blr

``````````

</details>


https://github.com/llvm/llvm-project/pull/189023


More information about the llvm-commits mailing list