[PATCH] D104792: [X86] Exclude invalid element types for bitcast/broadcast folding.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 23 09:52:22 PDT 2021
fhahn created this revision.
fhahn added reviewers: RKSimon, spatel, craig.topper.
Herald added subscribers: pengfei, hiraditya.
fhahn requested review of this revision.
Herald added a project: LLVM.
It looks like the fold introduced in 63f3383ece25efa can cause crashes
if the type of the bitcasted value is not a valid vector element type,
like x86_mmx.
To resolve the crash, reject invalid vector element types. The way it is
done in the patch is a bit clunky. Perhaps there's a better way to
check?
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D104792
Files:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/avx-vbroadcast.ll
Index: llvm/test/CodeGen/X86/avx-vbroadcast.ll
===================================================================
--- llvm/test/CodeGen/X86/avx-vbroadcast.ll
+++ llvm/test/CodeGen/X86/avx-vbroadcast.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X32
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X64
+; RUN: llc < %s -mtriple=i686-apple-darwin -mattr='+avx,+mmx' | FileCheck %s --check-prefix=X32
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr='+avx,+mmx' | FileCheck %s --check-prefix=X64
define <4 x i64> @A(i64* %ptr) nounwind uwtable readnone ssp {
; X32-LABEL: A:
@@ -972,6 +972,31 @@
ret float %9
}
+define <8 x i16> @broadcast_x86_mmx(x86_mmx %tmp) {
+; X32-LABEL: broadcast_x86_mmx:
+; X32: ## %bb.0: ## %bb
+; X32-NEXT: subl $12, %esp
+; X32-NEXT: .cfi_def_cfa_offset 16
+; X32-NEXT: movq %mm0, (%esp)
+; X32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
+; X32-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; X32-NEXT: addl $12, %esp
+; X32-NEXT: retl
+;
+; X64-LABEL: broadcast_x86_mmx:
+; X64: ## %bb.0: ## %bb
+; X64-NEXT: movdq2q %xmm0, %mm0
+; X64-NEXT: movq2dq %mm0, %xmm0
+; X64-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; X64-NEXT: retq
+bb:
+ %tmp1 = bitcast x86_mmx %tmp to i64
+ %tmp2 = insertelement <2 x i64> undef, i64 %tmp1, i32 0
+ %tmp3 = bitcast <2 x i64> %tmp2 to <8 x i16>
+ %tmp4 = shufflevector <8 x i16> %tmp3, <8 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
+ ret <8 x i16> %tmp4
+}
+
declare void @gfunc(<4 x float>*)
declare void @llvm.lifetime.start.p0i8(i64, i8*)
declare void @llvm.lifetime.end.p0i8(i64, i8*)
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -37487,7 +37487,9 @@
// 32-bit targets have to bitcast i64 to f64, so better to bitcast upward.
if (Src.getOpcode() == ISD::BITCAST &&
SrcVT.getScalarSizeInBits() == BCVT.getScalarSizeInBits() &&
- DAG.getTargetLoweringInfo().isTypeLegal(BCVT)) {
+ DAG.getTargetLoweringInfo().isTypeLegal(BCVT) &&
+ FixedVectorType::isValidElementType(
+ BCVT.getScalarType().getTypeForEVT(*DAG.getContext()))) {
EVT NewVT = EVT::getVectorVT(*DAG.getContext(), BCVT.getScalarType(),
VT.getVectorNumElements());
return DAG.getBitcast(VT, DAG.getNode(X86ISD::VBROADCAST, DL, NewVT, BC));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D104792.354004.patch
Type: text/x-patch
Size: 2713 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210623/625ba8ce/attachment.bin>
More information about the llvm-commits
mailing list