From 3b2476910ba33f1112c1b915b3cf41033ffd7e1a Mon Sep 17 00:00:00 2001 From: Peter Rong Date: Wed, 29 Mar 2023 22:13:25 -0700 Subject: [PATCH] [WASM] Prevent casting `undef` to `CosntantSDNode` WebAssembly tries to cast an `undef` to `CosntantSDNode` during `LowerAccessVectorElement`. These operations will trigger an assertion error in cast. To avoid this issue, we prevent casting, and abort the lowering operation. A unit test is also included. This patch fixes [pr61828](https://github.com/llvm/llvm-project/issues/61828) Reviewed By: tlively Differential Revision: https://reviews.llvm.org/D147198 --- llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | 2 +- llvm/test/CodeGen/WebAssembly/pr61828.ll | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/WebAssembly/pr61828.ll diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 892478e..db34935 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -2242,7 +2242,7 @@ WebAssemblyTargetLowering::LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const { // Allow constant lane indices, expand variable lane indices SDNode *IdxNode = Op.getOperand(Op.getNumOperands() - 1).getNode(); - if (isa(IdxNode) || IdxNode->isUndef()) { + if (isa(IdxNode)) { // Ensure the index type is i32 to match the tablegen patterns uint64_t Idx = cast(IdxNode)->getZExtValue(); SmallVector Ops(Op.getNode()->ops()); diff --git a/llvm/test/CodeGen/WebAssembly/pr61828.ll b/llvm/test/CodeGen/WebAssembly/pr61828.ll new file mode 100644 index 0000000..8c40b44 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/pr61828.ll @@ -0,0 +1,9 @@ +; RUN: llc < %s -mattr=+simd128 -mtriple=wasm64 + +define void @foo(i64 %i0, i64 %i1, ptr %p) { + %B4 = urem i64 %i0, %i0 + %B5 = udiv i64 %i1, %B4 + %I = insertelement <4 x float> , float 0.5, i64 %B5 + store <4 x float> %I, ptr %p + ret void +} -- 2.7.4