Index: lib/CodeGen/SelectionDAG/TargetLowering.cpp =================================================================== --- lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -5570,9 +5570,7 @@ EVT EltVT = VecVT.getVectorElementType(); // Calculate the element offset and add it to the pointer. - unsigned EltSize = EltVT.getSizeInBits() / 8; // FIXME: should be ABI size. - assert(EltSize * 8 == EltVT.getSizeInBits() && - "Converting bits to bytes lost precision"); + unsigned EltSize = EltVT.getStoreSize(); Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl); Index: test/CodeGen/WebAssembly/bug42304.ll =================================================================== --- /dev/null +++ test/CodeGen/WebAssembly/bug42304.ll @@ -0,0 +1,55 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=wasm32-unknown-unknown < %s | FileCheck %s + +define void @dynamic_vector_extract_nonpow2() { +; CHECK-LABEL: dynamic_vector_extract_nonpow2: +; CHECK: .functype dynamic_vector_extract_nonpow2 () -> () +; CHECK-NEXT: .local i32, i64 +; CHECK-NEXT: # %bb.0: # %bb +; CHECK-NEXT: global.get __stack_pointer +; CHECK-NEXT: i32.const 16 +; CHECK-NEXT: i32.sub +; CHECK-NEXT: local.tee 0 +; CHECK-NEXT: i64.const 0 +; CHECK-NEXT: i64.store8 10 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: i64.const 0 +; CHECK-NEXT: i64.store16 8 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: i64.const 0 +; CHECK-NEXT: i64.store 0 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: i32.load16_u 0 +; CHECK-NEXT: i32.const 1 +; CHECK-NEXT: i32.and +; CHECK-NEXT: i32.const 6 +; CHECK-NEXT: i32.mul +; CHECK-NEXT: i32.or +; CHECK-NEXT: local.tee 0 +; CHECK-NEXT: i64.load32_u 0 +; CHECK-NEXT: local.tee 1 +; CHECK-NEXT: i64.store32 0 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: local.get 1 +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: i32.const 4 +; CHECK-NEXT: i32.add +; CHECK-NEXT: i64.load16_u 0 +; CHECK-NEXT: i64.const 32 +; CHECK-NEXT: i64.shl +; CHECK-NEXT: i64.or +; CHECK-NEXT: i64.const 4398046511103 +; CHECK-NEXT: i64.and +; CHECK-NEXT: i64.const 32 +; CHECK-NEXT: i64.shr_u +; CHECK-NEXT: i64.store16 0 +; CHECK-NEXT: # fallthrough-return-void +; CHECK-NEXT: end_function +bb: + %L = load i16, i16* undef + %E = extractelement <2 x i42> zeroinitializer, i16 %L + store i42 %E, i42* undef + ret void +}