[llvm] [AArch64] Fix type mismatch in bitconvert + vec_extract patterns (PR #183549)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 3 06:02:10 PST 2026
https://github.com/Lukacma updated https://github.com/llvm/llvm-project/pull/183549
>From 1967e1e91b9d93a2fc1292ea3fad48c100b33015 Mon Sep 17 00:00:00 2001
From: Marian Lukac <Marian.Lukac at arm.com>
Date: Thu, 26 Feb 2026 15:20:49 +0000
Subject: [PATCH 1/3] [AArch64] Fix type mismatch in bitconvert + vec_extract
patterns
---
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index ace85b04595b8..97bc1c16a02d7 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -8213,9 +8213,9 @@ defm : Neon_INS_elt_ext_pattern<v8i16, v4i16, v2i32, INSvi16lane, DUPi16, hsub,
// bitcast of an extract
// f32 bitcast(vector_extract(v4i32 src, 0)) -> EXTRACT_SUBREG(src)
def : Pat<(f32 (bitconvert (i32 (vector_extract v16i8:$src, (i64 0))))),
- (EXTRACT_SUBREG V128:$src, bsub)>;
+ (EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v8i16:$src, (i64 0))))),
- (EXTRACT_SUBREG V128:$src, hsub)>;
+ (EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v4i32:$src, (i64 0))))),
(EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f64 (bitconvert (i64 (vector_extract v2i64:$src, (i64 0))))),
>From 84e79611883ba7e4dcad0f3cff4e7fa080ba3cc3 Mon Sep 17 00:00:00 2001
From: Marian Lukac <Marian.Lukac at arm.com>
Date: Fri, 27 Feb 2026 13:44:54 +0000
Subject: [PATCH 2/3] Add test and remove unused pattern
---
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 2 --
.../AArch64/neon-extractbitcast-mir.ll | 19 +++++++++++++++++++
2 files changed, 19 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 97bc1c16a02d7..2ebdc29a6fb4e 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -8212,8 +8212,6 @@ defm : Neon_INS_elt_ext_pattern<v8i16, v4i16, v2i32, INSvi16lane, DUPi16, hsub,
// bitcast of an extract
// f32 bitcast(vector_extract(v4i32 src, 0)) -> EXTRACT_SUBREG(src)
-def : Pat<(f32 (bitconvert (i32 (vector_extract v16i8:$src, (i64 0))))),
- (EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v8i16:$src, (i64 0))))),
(EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v4i32:$src, (i64 0))))),
diff --git a/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll b/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
new file mode 100644
index 0000000000000..d18ea001dd3e8
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
@@ -0,0 +1,19 @@
+; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple aarch64-none-linux-gnu -stop-after=finalize-isel | FileCheck %s --check-prefix=CHECK
+
+define half @test_vext_v8i16_0(<8 x i16> %a) {
+ ; CHECK-LABEL: name: test_vext_v8i16_0
+ ; CHECK: bb.0.entry:
+ ; CHECK-NEXT: liveins: $q0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY [[COPY]].ssub
+ ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr16 = COPY [[COPY1]].hsub
+ ; CHECK-NEXT: $h0 = COPY [[COPY2]]
+ ; CHECK-NEXT: RET_ReallyLR implicit $h0
+entry:
+ %b = extractelement <8 x i16> %a, i32 0
+ %c = bitcast i16 %b to half
+ ret half %c
+
+}
>From 1e63d918d2e9ce9af208c9a7d905fc642806597a Mon Sep 17 00:00:00 2001
From: Marian Lukac <Marian.Lukac at arm.com>
Date: Tue, 3 Mar 2026 14:00:58 +0000
Subject: [PATCH 3/3] Fix removed pattern and add
---
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 2 ++
llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 68df20b141f32..e704ffe537ed7 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -8212,6 +8212,8 @@ defm : Neon_INS_elt_ext_pattern<v8i16, v4i16, v2i32, INSvi16lane, DUPi16, hsub,
// bitcast of an extract
// f32 bitcast(vector_extract(v4i32 src, 0)) -> EXTRACT_SUBREG(src)
+def : Pat<(f32 (bitconvert (i32 (vector_extract v16i8:$src, (i64 0))))),
+ (EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v8i16:$src, (i64 0))))),
(EXTRACT_SUBREG V128:$src, ssub)>;
def : Pat<(f32 (bitconvert (i32 (vector_extract v4i32:$src, (i64 0))))),
diff --git a/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll b/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
index d18ea001dd3e8..d3cc83af1eddc 100644
--- a/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
+++ b/llvm/test/CodeGen/AArch64/neon-extractbitcast-mir.ll
@@ -16,4 +16,4 @@ entry:
%c = bitcast i16 %b to half
ret half %c
-}
+}
\ No newline at end of file
More information about the llvm-commits
mailing list