[llvm-branch-commits] [llvm] [AArch64][GlobalISel] Added support for neon right shifts (PR #170832)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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
