[llvm] d226dcc - [NVPTX] Fix illegal combineInsertEltToShuffle pattern (#198259)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 4 01:34:48 PDT 2026
Author: Srinivasa Ravi
Date: 2026-06-04T14:04:43+05:30
New Revision: d226dcc019d6a83cba79951ec2a8a08c53a57858
URL: https://github.com/llvm/llvm-project/commit/d226dcc019d6a83cba79951ec2a8a08c53a57858
DIFF: https://github.com/llvm/llvm-project/commit/d226dcc019d6a83cba79951ec2a8a08c53a57858.diff
LOG: [NVPTX] Fix illegal combineInsertEltToShuffle pattern (#198259)
Adds a condition to the `isShuffleMaskLegal` method to prevent
`combineInsertEltToShuffle` from creating an illegal `vector_shuffle`
after type legalization which leads to a crash.
Context:
This is triggered when bitcasting a `v2f16` into a vector that type
legalizes to a `v2i32`. This happens on architectures supporting packed
`f32` operations (>= `sm_100`). In certain cases, this leads to
`combineInsertEltToShuffle` creating a vector shuffle with `v4f16` for
simplification. Since this happens after type legalization and `v4f16`
is an illegal type, it leads to a crash.
Added:
llvm/test/CodeGen/NVPTX/insert-vector-elt-bitcast-legalize.ll
Modified:
llvm/lib/Target/NVPTX/NVPTXISelLowering.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.h b/llvm/lib/Target/NVPTX/NVPTXISelLowering.h
index f2879c87dafc7..0e8dd6056af81 100644
--- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.h
+++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.h
@@ -107,6 +107,10 @@ class NVPTXTargetLowering : public TargetLowering {
TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(MVT VT) const override;
+ bool isShuffleMaskLegal(ArrayRef<int>, EVT VT) const override {
+ return isTypeLegal(VT);
+ }
+
// Get the degree of precision we want from 32-bit floating point division
// operations.
NVPTX::DivPrecisionLevel getDivF32Level(const MachineFunction &MF,
diff --git a/llvm/test/CodeGen/NVPTX/insert-vector-elt-bitcast-legalize.ll b/llvm/test/CodeGen/NVPTX/insert-vector-elt-bitcast-legalize.ll
new file mode 100644
index 0000000000000..9f31dcf9ec696
--- /dev/null
+++ b/llvm/test/CodeGen/NVPTX/insert-vector-elt-bitcast-legalize.ll
@@ -0,0 +1,24 @@
+; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_100a -mattr=+ptx86 -o /dev/null
+; RUN: %if ptxas-sm_100a && ptxas-isa-8.6 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_100a -mattr=+ptx86 | %ptxas-verify -arch=sm_100a %}
+
+; Verify that inserting a bitcasted v2f16 into a vector that type-legalizes to
+; v2i32 does not crash during DAG legalization on sm_100a+ (where v2i32 is a
+; legal type). The DAG combiner would previously create an illegal v4f16
+; vector_shuffle after type legalization.
+
+define half @test(i64 %idx, <2 x half> %input) {
+ %val = bitcast <2 x half> %input to <1 x i32>
+ %scalar = extractelement <1 x i32> %val, i64 0
+ %vec = insertelement <4 x i32> <i32 0, i32 poison, i32 poison, i32 poison>, i32 %scalar, i64 1
+
+ ; prevent simplification to trigger the illegal pattern
+ %cast = bitcast <4 x i32> %vec to <8 x half>
+ %elt0 = extractelement <8 x half> %cast, i64 0
+ %elt3 = extractelement <8 x half> %cast, i64 3
+ %big = insertelement <16 x half> zeroinitializer, half %elt0, i64 1
+ %big2 = insertelement <16 x half> %big, half %elt3, i64 %idx
+ %big3 = insertelement <16 x half> %big2, half 0xH0000, i64 0
+ %result = extractelement <16 x half> %big3, i64 %idx
+
+ ret half %result
+}
More information about the llvm-commits
mailing list