diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -2704,7 +2704,7 @@ Src = Src.getOperand(0); } - if (Src.getOpcode() == ISD::BUILD_VECTOR && + if (Src.getOpcode() == ISD::BUILD_VECTOR && Src.getNumOperands() == 2 && (!IsDOT || !Subtarget->hasDOTOpSelHazard())) { unsigned VecMods = Mods; diff --git a/llvm/test/CodeGen/AMDGPU/wmma_modifiers.ll b/llvm/test/CodeGen/AMDGPU/wmma_modifiers.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/wmma_modifiers.ll @@ -0,0 +1,22 @@ +; RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=-wavefrontsize32,+wavefrontsize64 -verify-machineinstrs < %s | FileCheck %s + +declare <4 x float> @llvm.amdgcn.wmma.f32.16x16x16.f16(<16 x half>, <16 x half>, <4 x float>) + +; Make sure we don't crash when trying to select modifiers in SelectVOP3PMods. + +define amdgpu_cs void @xyz () { +; CHECK-LABEL: xyz: +; CHECK: v_wmma_f32_16x16x16_f16 v[0:3], v[4:11], v[4:11], v[0:3] + +.entry: + br label %loop +loop: + %ld = load <8 x float>, <8 x float> addrspace(5)* null, align 32 + %in_shuffle = shufflevector <8 x float> %ld, <8 x float> undef, <4 x i32> + %wmma = call <4 x float> @llvm.amdgcn.wmma.f32.16x16x16.f16(<16 x half> undef, <16 x half> undef, <4 x float> %in_shuffle) + %out_shuffle = shufflevector <4 x float> %wmma, <4 x float> undef, <8 x i32> + store <8 x float> %out_shuffle, <8 x float> addrspace(5)* null, align 32 + br i1 false, label %.exit, label %loop +.exit: + ret void +}