[llvm-branch-commits] [llvm] [AArch64][GlobalISel] Added support for neon right shifts (PR #170832)

2025-12-05 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/170832

>From 7e897eac1eee87148b1f3529a42e4b927b556d44 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Thu, 27 Nov 2025 15:34:40 +
Subject: [PATCH 1/9] [AArch64][GlobalISel] Removed fallback for sqshlu
 intrinsic

Added G_SQSHLU node, which lowers the llvm ir intrinsic aarch64_neon_sqshlu to 
the machine intrinsic sqshlu. Generated code is slightly less efficient compare 
to SDAG.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td  |  8 +++
 .../AArch64/GISel/AArch64LegalizerInfo.cpp| 12 +
 .../AArch64/GISel/AArch64RegisterBankInfo.cpp |  9 
 llvm/test/CodeGen/AArch64/arm64-vshift.ll | 49 ++-
 4 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 7d99786830e3d..7469a081d9787 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -252,6 +252,12 @@ def G_USDOT : AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_SQSHLU : AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -300,6 +306,8 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 
+def : GINodeEquiv;
+
 def : GINodeEquiv;
 
 def : GINodeEquiv;
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1025b2502211a..0010834e01894 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1857,6 +1857,18 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
 return LowerBinOp(TargetOpcode::G_SAVGFLOOR);
   case Intrinsic::aarch64_neon_srhadd:
 return LowerBinOp(TargetOpcode::G_SAVGCEIL);
+  case Intrinsic::aarch64_neon_sqshlu: {
+// Check if last operand is constant vector dup
+auto shiftAmount = 
isConstantOrConstantSplatVector(*MRI.getVRegDef(MI.getOperand(3).getReg()), 
MRI);
+if (shiftAmount) {
+   // If so, create a new intrinsic with the correct shift amount
+   MIB.buildInstr(AArch64::G_SQSHLU, {MI.getOperand(0)}, 
{MI.getOperand(2)}).addImm(shiftAmount->getSExtValue());
+   MI.eraseFromParent();
+   return true;
+} else {
+   return false;
+}
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 652a31f4e65f2..aa1517533b753 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -1072,6 +1072,15 @@ AArch64RegisterBankInfo::getInstrMapping(const 
MachineInstr &MI) const {
 // Index needs to be a GPR.
 OpRegBankIdx[2] = PMI_FirstGPR;
 break;
+  case AArch64::G_SQSHLU:
+// Destination and source need to be FPRs.
+OpRegBankIdx[0] = PMI_FirstFPR;
+OpRegBankIdx[1] = PMI_FirstFPR;
+
+// Shift Index needs to be a GPR.
+OpRegBankIdx[2] = PMI_FirstGPR;
+break;
+
   case TargetOpcode::G_INSERT_VECTOR_ELT:
 OpRegBankIdx[0] = PMI_FirstFPR;
 OpRegBankIdx[1] = PMI_FirstFPR;
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index 34843835d284a..961788f311041 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,17 +2,7 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sqshlu8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu1d_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu_i64_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback 

[llvm-branch-commits] [llvm] [AArch64][GlobalISel] Added support for neon right shifts (PR #170832)

2025-12-05 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod created 
https://github.com/llvm/llvm-project/pull/170832

Many neon right shift intrinsics were not supported by GlobalISel, mainly due 
to a lack of legalisation logic. This logic has now been implemented.

>From 7e897eac1eee87148b1f3529a42e4b927b556d44 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Thu, 27 Nov 2025 15:34:40 +
Subject: [PATCH 1/8] [AArch64][GlobalISel] Removed fallback for sqshlu
 intrinsic

Added G_SQSHLU node, which lowers the llvm ir intrinsic aarch64_neon_sqshlu to 
the machine intrinsic sqshlu. Generated code is slightly less efficient compare 
to SDAG.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td  |  8 +++
 .../AArch64/GISel/AArch64LegalizerInfo.cpp| 12 +
 .../AArch64/GISel/AArch64RegisterBankInfo.cpp |  9 
 llvm/test/CodeGen/AArch64/arm64-vshift.ll | 49 ++-
 4 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 7d99786830e3d..7469a081d9787 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -252,6 +252,12 @@ def G_USDOT : AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_SQSHLU : AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -300,6 +306,8 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 
+def : GINodeEquiv;
+
 def : GINodeEquiv;
 
 def : GINodeEquiv;
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1025b2502211a..0010834e01894 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1857,6 +1857,18 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
 return LowerBinOp(TargetOpcode::G_SAVGFLOOR);
   case Intrinsic::aarch64_neon_srhadd:
 return LowerBinOp(TargetOpcode::G_SAVGCEIL);
+  case Intrinsic::aarch64_neon_sqshlu: {
+// Check if last operand is constant vector dup
+auto shiftAmount = 
isConstantOrConstantSplatVector(*MRI.getVRegDef(MI.getOperand(3).getReg()), 
MRI);
+if (shiftAmount) {
+   // If so, create a new intrinsic with the correct shift amount
+   MIB.buildInstr(AArch64::G_SQSHLU, {MI.getOperand(0)}, 
{MI.getOperand(2)}).addImm(shiftAmount->getSExtValue());
+   MI.eraseFromParent();
+   return true;
+} else {
+   return false;
+}
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 652a31f4e65f2..aa1517533b753 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -1072,6 +1072,15 @@ AArch64RegisterBankInfo::getInstrMapping(const 
MachineInstr &MI) const {
 // Index needs to be a GPR.
 OpRegBankIdx[2] = PMI_FirstGPR;
 break;
+  case AArch64::G_SQSHLU:
+// Destination and source need to be FPRs.
+OpRegBankIdx[0] = PMI_FirstFPR;
+OpRegBankIdx[1] = PMI_FirstFPR;
+
+// Shift Index needs to be a GPR.
+OpRegBankIdx[2] = PMI_FirstGPR;
+break;
+
   case TargetOpcode::G_INSERT_VECTOR_ELT:
 OpRegBankIdx[0] = PMI_FirstFPR;
 OpRegBankIdx[1] = PMI_FirstFPR;
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index 34843835d284a..961788f311041 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,17 +2,7 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sqshlu8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu1d_constant
-; CHECK-GI 

[llvm-branch-commits] [llvm] [AArch64][GlobalISel] Added support for neon right shifts (PR #170832)

2025-12-09 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/170832

>From 74f88e80b88b68d8058fb7171803a2147f2b1a78 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Thu, 27 Nov 2025 15:34:40 +
Subject: [PATCH 1/9] [AArch64][GlobalISel] Removed fallback for sqshlu
 intrinsic

Added G_SQSHLU node, which lowers the llvm ir intrinsic aarch64_neon_sqshlu to 
the machine intrinsic sqshlu. Generated code is slightly less efficient compare 
to SDAG.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td  |  8 +++
 .../AArch64/GISel/AArch64LegalizerInfo.cpp| 12 +
 .../AArch64/GISel/AArch64RegisterBankInfo.cpp |  9 
 llvm/test/CodeGen/AArch64/arm64-vshift.ll | 49 ++-
 4 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 7d99786830e3d..7469a081d9787 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -252,6 +252,12 @@ def G_USDOT : AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_SQSHLU : AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -300,6 +306,8 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 
+def : GINodeEquiv;
+
 def : GINodeEquiv;
 
 def : GINodeEquiv;
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1025b2502211a..0010834e01894 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1857,6 +1857,18 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
 return LowerBinOp(TargetOpcode::G_SAVGFLOOR);
   case Intrinsic::aarch64_neon_srhadd:
 return LowerBinOp(TargetOpcode::G_SAVGCEIL);
+  case Intrinsic::aarch64_neon_sqshlu: {
+// Check if last operand is constant vector dup
+auto shiftAmount = 
isConstantOrConstantSplatVector(*MRI.getVRegDef(MI.getOperand(3).getReg()), 
MRI);
+if (shiftAmount) {
+   // If so, create a new intrinsic with the correct shift amount
+   MIB.buildInstr(AArch64::G_SQSHLU, {MI.getOperand(0)}, 
{MI.getOperand(2)}).addImm(shiftAmount->getSExtValue());
+   MI.eraseFromParent();
+   return true;
+} else {
+   return false;
+}
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 4d3d0811b1524..adfc27b097a6c 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -1074,6 +1074,15 @@ AArch64RegisterBankInfo::getInstrMapping(const 
MachineInstr &MI) const {
 // Index needs to be a GPR.
 OpRegBankIdx[2] = PMI_FirstGPR;
 break;
+  case AArch64::G_SQSHLU:
+// Destination and source need to be FPRs.
+OpRegBankIdx[0] = PMI_FirstFPR;
+OpRegBankIdx[1] = PMI_FirstFPR;
+
+// Shift Index needs to be a GPR.
+OpRegBankIdx[2] = PMI_FirstGPR;
+break;
+
   case TargetOpcode::G_INSERT_VECTOR_ELT:
 OpRegBankIdx[0] = PMI_FirstFPR;
 OpRegBankIdx[1] = PMI_FirstFPR;
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index 9743639d99d9b..161b583c7ac05 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,17 +2,7 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sqshlu8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu1d_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu_i64_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback 

[llvm-branch-commits] [llvm] [AArch64][GlobalISel] Added support for neon right shifts (PR #170832)

2025-12-09 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/170832

>From 74f88e80b88b68d8058fb7171803a2147f2b1a78 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Thu, 27 Nov 2025 15:34:40 +
Subject: [PATCH 1/9] [AArch64][GlobalISel] Removed fallback for sqshlu
 intrinsic

Added G_SQSHLU node, which lowers the llvm ir intrinsic aarch64_neon_sqshlu to 
the machine intrinsic sqshlu. Generated code is slightly less efficient compare 
to SDAG.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td  |  8 +++
 .../AArch64/GISel/AArch64LegalizerInfo.cpp| 12 +
 .../AArch64/GISel/AArch64RegisterBankInfo.cpp |  9 
 llvm/test/CodeGen/AArch64/arm64-vshift.ll | 49 ++-
 4 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 7d99786830e3d..7469a081d9787 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -252,6 +252,12 @@ def G_USDOT : AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_SQSHLU : AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -300,6 +306,8 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 
+def : GINodeEquiv;
+
 def : GINodeEquiv;
 
 def : GINodeEquiv;
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1025b2502211a..0010834e01894 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1857,6 +1857,18 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
 return LowerBinOp(TargetOpcode::G_SAVGFLOOR);
   case Intrinsic::aarch64_neon_srhadd:
 return LowerBinOp(TargetOpcode::G_SAVGCEIL);
+  case Intrinsic::aarch64_neon_sqshlu: {
+// Check if last operand is constant vector dup
+auto shiftAmount = 
isConstantOrConstantSplatVector(*MRI.getVRegDef(MI.getOperand(3).getReg()), 
MRI);
+if (shiftAmount) {
+   // If so, create a new intrinsic with the correct shift amount
+   MIB.buildInstr(AArch64::G_SQSHLU, {MI.getOperand(0)}, 
{MI.getOperand(2)}).addImm(shiftAmount->getSExtValue());
+   MI.eraseFromParent();
+   return true;
+} else {
+   return false;
+}
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 4d3d0811b1524..adfc27b097a6c 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -1074,6 +1074,15 @@ AArch64RegisterBankInfo::getInstrMapping(const 
MachineInstr &MI) const {
 // Index needs to be a GPR.
 OpRegBankIdx[2] = PMI_FirstGPR;
 break;
+  case AArch64::G_SQSHLU:
+// Destination and source need to be FPRs.
+OpRegBankIdx[0] = PMI_FirstFPR;
+OpRegBankIdx[1] = PMI_FirstFPR;
+
+// Shift Index needs to be a GPR.
+OpRegBankIdx[2] = PMI_FirstGPR;
+break;
+
   case TargetOpcode::G_INSERT_VECTOR_ELT:
 OpRegBankIdx[0] = PMI_FirstFPR;
 OpRegBankIdx[1] = PMI_FirstFPR;
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index 9743639d99d9b..161b583c7ac05 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,17 +2,7 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sqshlu8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu2d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu1d_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sqshlu_i64_constant
-; CHECK-GI NEXT:warning: Instruction selection used fallback 

[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli intrinsic (PR #171448)

2025-12-09 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/171448

>From 7854c9af0229e0da243ae75cc08aa3d65c1bdc8c Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Tue, 9 Dec 2025 14:27:56 +
Subject: [PATCH] [GlobalISel][AArch64] Added support for sli intrinsic

sli intrinsic now lowers correctly for all vector types.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td   |  7 +++
 llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp |  9 -
 .../Target/AArch64/GISel/AArch64RegisterBankInfo.cpp   |  2 ++
 llvm/test/CodeGen/AArch64/arm64-vshift.ll  | 10 --
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 75354e4098fb4..3002547eb2d79 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -270,6 +270,12 @@ def G_URSHR: AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_VSLI: AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -321,6 +327,7 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
+def : GINodeEquiv;
 
 def : GINodeEquiv;
 
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 8951ccfbd3352..642ddf4bc92c4 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1949,6 +1949,13 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
   return false;
 }
   }
+  case Intrinsic::aarch64_neon_vsli: {
+MIB.buildInstr(
+AArch64::G_VSLI, {MI.getOperand(0)},
+{MI.getOperand(2), MI.getOperand(3), MI.getOperand(4).getImm()});
+MI.eraseFromParent();
+break;
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
@@ -2598,4 +2605,4 @@ bool AArch64LegalizerInfo::legalizeFptrunc(MachineInstr 
&MI,
   MRI.replaceRegWith(Dst, Fin);
   MI.eraseFromParent();
   return true;
-}
\ No newline at end of file
+}
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 84bc3f1e14a7a..8cd7c73f157e3 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -575,6 +575,7 @@ bool AArch64RegisterBankInfo::onlyUsesFP(const MachineInstr 
&MI,
   case TargetOpcode::G_LROUND:
   case TargetOpcode::G_LLROUND:
   case AArch64::G_PMULL:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC:
 switch (cast(MI).getIntrinsicID()) {
@@ -613,6 +614,7 @@ bool AArch64RegisterBankInfo::onlyDefinesFP(const 
MachineInstr &MI,
   case TargetOpcode::G_INSERT_VECTOR_ELT:
   case TargetOpcode::G_BUILD_VECTOR:
   case TargetOpcode::G_BUILD_VECTOR_TRUNC:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
 switch (cast(MI).getIntrinsicID()) {
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index a316a4bc543b5..05ddb4b5a7c64 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,16 +2,6 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sli8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli1d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli1d_imm0
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2d
-
 define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {
 ; CHECK-LABEL: sqshl8b:
 ; CHECK:   // %bb.0:

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli intrinsic (PR #171448)

2025-12-09 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod created 
https://github.com/llvm/llvm-project/pull/171448

sli intrinsic now lowers correctly for all vector types.

>From 2045520c433183c633ff5ea84e8708b8a37cec51 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Tue, 9 Dec 2025 14:27:56 +
Subject: [PATCH] [GlobalISel][AArch64] Added support for sli intrinsic

sli intrinsic now lowers correctly for all vector types.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td   |  7 +++
 llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp |  7 ++-
 .../Target/AArch64/GISel/AArch64RegisterBankInfo.cpp   |  2 ++
 llvm/test/CodeGen/AArch64/arm64-vshift.ll  | 10 --
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 75354e4098fb4..3002547eb2d79 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -270,6 +270,12 @@ def G_URSHR: AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_VSLI: AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -321,6 +327,7 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
+def : GINodeEquiv;
 
 def : GINodeEquiv;
 
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 8951ccfbd3352..02f1c5a7be4b2 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1949,6 +1949,11 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
   return false;
 }
   }
+  case Intrinsic::aarch64_neon_vsli: {
+MIB.buildInstr(AArch64::G_VSLI, {MI.getOperand(0)}, {MI.getOperand(2), 
MI.getOperand(3), MI.getOperand(4).getImm()});
+MI.eraseFromParent();
+break;
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
@@ -2598,4 +2603,4 @@ bool AArch64LegalizerInfo::legalizeFptrunc(MachineInstr 
&MI,
   MRI.replaceRegWith(Dst, Fin);
   MI.eraseFromParent();
   return true;
-}
\ No newline at end of file
+}
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 84bc3f1e14a7a..8cd7c73f157e3 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -575,6 +575,7 @@ bool AArch64RegisterBankInfo::onlyUsesFP(const MachineInstr 
&MI,
   case TargetOpcode::G_LROUND:
   case TargetOpcode::G_LLROUND:
   case AArch64::G_PMULL:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC:
 switch (cast(MI).getIntrinsicID()) {
@@ -613,6 +614,7 @@ bool AArch64RegisterBankInfo::onlyDefinesFP(const 
MachineInstr &MI,
   case TargetOpcode::G_INSERT_VECTOR_ELT:
   case TargetOpcode::G_BUILD_VECTOR:
   case TargetOpcode::G_BUILD_VECTOR_TRUNC:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
 switch (cast(MI).getIntrinsicID()) {
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index a316a4bc543b5..05ddb4b5a7c64 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,16 +2,6 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sli8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli1d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli1d_imm0
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2d
-
 define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {
 ; CHECK-LABEL: sqshl8b:
 ; CHECK:   // %bb.0:

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bra

[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli intrinsic (PR #171448)

2025-12-09 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/171448

>From b1591d7b90292a562771510067a99eb22bc629c9 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Tue, 9 Dec 2025 14:27:56 +
Subject: [PATCH] [GlobalISel][AArch64] Added support for sli intrinsic

sli intrinsic now lowers correctly for all vector types.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td   |  7 +++
 llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp |  7 ++-
 .../Target/AArch64/GISel/AArch64RegisterBankInfo.cpp   |  2 ++
 llvm/test/CodeGen/AArch64/arm64-vshift.ll  | 10 --
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 75354e4098fb4..3002547eb2d79 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -270,6 +270,12 @@ def G_URSHR: AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_VSLI: AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -321,6 +327,7 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
+def : GINodeEquiv;
 
 def : GINodeEquiv;
 
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 8951ccfbd3352..02f1c5a7be4b2 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1949,6 +1949,11 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
   return false;
 }
   }
+  case Intrinsic::aarch64_neon_vsli: {
+MIB.buildInstr(AArch64::G_VSLI, {MI.getOperand(0)}, {MI.getOperand(2), 
MI.getOperand(3), MI.getOperand(4).getImm()});
+MI.eraseFromParent();
+break;
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
@@ -2598,4 +2603,4 @@ bool AArch64LegalizerInfo::legalizeFptrunc(MachineInstr 
&MI,
   MRI.replaceRegWith(Dst, Fin);
   MI.eraseFromParent();
   return true;
-}
\ No newline at end of file
+}
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 84bc3f1e14a7a..8cd7c73f157e3 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -575,6 +575,7 @@ bool AArch64RegisterBankInfo::onlyUsesFP(const MachineInstr 
&MI,
   case TargetOpcode::G_LROUND:
   case TargetOpcode::G_LLROUND:
   case AArch64::G_PMULL:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC:
 switch (cast(MI).getIntrinsicID()) {
@@ -613,6 +614,7 @@ bool AArch64RegisterBankInfo::onlyDefinesFP(const 
MachineInstr &MI,
   case TargetOpcode::G_INSERT_VECTOR_ELT:
   case TargetOpcode::G_BUILD_VECTOR:
   case TargetOpcode::G_BUILD_VECTOR_TRUNC:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
 switch (cast(MI).getIntrinsicID()) {
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index a316a4bc543b5..05ddb4b5a7c64 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,16 +2,6 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sli8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli1d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli1d_imm0
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2d
-
 define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {
 ; CHECK-LABEL: sqshl8b:
 ; CHECK:   // %bb.0:

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli intrinsic (PR #171448)

2025-12-10 Thread Joshua Rodriguez via llvm-branch-commits


@@ -270,6 +270,12 @@ def G_URSHR: AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_VSLI: AArch64GenericInstruction {

JoshdRod wrote:

There's an SRI that isn't supported yet - should I also add a test case to this 
file?

https://github.com/llvm/llvm-project/pull/171448
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli intrinsic (PR #171448)

2025-12-10 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod updated 
https://github.com/llvm/llvm-project/pull/171448

>From 7854c9af0229e0da243ae75cc08aa3d65c1bdc8c Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Tue, 9 Dec 2025 14:27:56 +
Subject: [PATCH 1/5] [GlobalISel][AArch64] Added support for sli intrinsic

sli intrinsic now lowers correctly for all vector types.
---
 llvm/lib/Target/AArch64/AArch64InstrGISel.td   |  7 +++
 llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp |  9 -
 .../Target/AArch64/GISel/AArch64RegisterBankInfo.cpp   |  2 ++
 llvm/test/CodeGen/AArch64/arm64-vshift.ll  | 10 --
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64InstrGISel.td 
b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
index 75354e4098fb4..3002547eb2d79 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrGISel.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrGISel.td
@@ -270,6 +270,12 @@ def G_URSHR: AArch64GenericInstruction {
   let hasSideEffects = 0;
 }
 
+def G_VSLI: AArch64GenericInstruction {
+  let OutOperandList = (outs type0:$dst);
+  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
+  let hasSideEffects = 0;
+}
+
 // Generic instruction for the BSP pseudo. It is expanded into BSP, which
 // expands into BSL/BIT/BIF after register allocation.
 def G_BSP : AArch64GenericInstruction {
@@ -321,6 +327,7 @@ def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
 def : GINodeEquiv;
+def : GINodeEquiv;
 
 def : GINodeEquiv;
 
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 8951ccfbd3352..642ddf4bc92c4 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1949,6 +1949,13 @@ bool 
AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
   return false;
 }
   }
+  case Intrinsic::aarch64_neon_vsli: {
+MIB.buildInstr(
+AArch64::G_VSLI, {MI.getOperand(0)},
+{MI.getOperand(2), MI.getOperand(3), MI.getOperand(4).getImm()});
+MI.eraseFromParent();
+break;
+  }
   case Intrinsic::aarch64_neon_abs: {
 // Lower the intrinsic to G_ABS.
 MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, 
{MI.getOperand(2)});
@@ -2598,4 +2605,4 @@ bool AArch64LegalizerInfo::legalizeFptrunc(MachineInstr 
&MI,
   MRI.replaceRegWith(Dst, Fin);
   MI.eraseFromParent();
   return true;
-}
\ No newline at end of file
+}
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp 
b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
index 84bc3f1e14a7a..8cd7c73f157e3 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp
@@ -575,6 +575,7 @@ bool AArch64RegisterBankInfo::onlyUsesFP(const MachineInstr 
&MI,
   case TargetOpcode::G_LROUND:
   case TargetOpcode::G_LLROUND:
   case AArch64::G_PMULL:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC:
 switch (cast(MI).getIntrinsicID()) {
@@ -613,6 +614,7 @@ bool AArch64RegisterBankInfo::onlyDefinesFP(const 
MachineInstr &MI,
   case TargetOpcode::G_INSERT_VECTOR_ELT:
   case TargetOpcode::G_BUILD_VECTOR:
   case TargetOpcode::G_BUILD_VECTOR_TRUNC:
+  case AArch64::G_VSLI:
 return true;
   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
 switch (cast(MI).getIntrinsicID()) {
diff --git a/llvm/test/CodeGen/AArch64/arm64-vshift.ll 
b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
index a316a4bc543b5..05ddb4b5a7c64 100644
--- a/llvm/test/CodeGen/AArch64/arm64-vshift.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-vshift.ll
@@ -2,16 +2,6 @@
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=0 | FileCheck %s 
--check-prefixes=CHECK,CHECK-SD
 ; RUN: llc < %s -mtriple=arm64-eabi -global-isel=1 -global-isel-abort=2 2>&1 | 
FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
-; CHECK-GI:warning: Instruction selection used fallback path for sli8b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli1d
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli1d_imm0
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for 
sli16b
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli8h
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli4s
-; CHECK-GI NEXT:warning: Instruction selection used fallback path for sli2d
-
 define <8 x i8> @sqshl8b(ptr %A, ptr %B) nounwind {
 ; CHECK-LABEL: sqshl8b:
 ; CHECK:   // %bb.0:

>From 87f41ca0e8af61c7c51b7fd821fc4b662210a072 Mon Sep 17 00:00:00 2001
From: Josh Rodriguez 
Date: Wed, 10 Dec 2025 09:59:24 +
Subject: [PATCH 2/5] [AArch64][GlobalISel] Changed G_VSLI input operand li

[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli/sri intrinsics (PR #171448)

2025-12-10 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod edited 
https://github.com/llvm/llvm-project/pull/171448
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] [GlobalISel][AArch64] Added support for sli/sri intrinsics (PR #171448)

2025-12-11 Thread Joshua Rodriguez via llvm-branch-commits

https://github.com/JoshdRod closed 
https://github.com/llvm/llvm-project/pull/171448
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits