diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -17325,11 +17325,12 @@ !ST1->getBasePtr().isUndef() && // BaseIndexOffset and the code below requires knowing the size // of a vector, so bail out if MemoryVT is scalable. + !ST->getMemoryVT().isScalableVector() && !ST1->getMemoryVT().isScalableVector()) { const BaseIndexOffset STBase = BaseIndexOffset::match(ST, DAG); const BaseIndexOffset ChainBase = BaseIndexOffset::match(ST1, DAG); - unsigned STBitSize = ST->getMemoryVT().getSizeInBits(); - unsigned ChainBitSize = ST1->getMemoryVT().getSizeInBits(); + unsigned STBitSize = ST->getMemoryVT().getFixedSizeInBits(); + unsigned ChainBitSize = ST1->getMemoryVT().getFixedSizeInBits(); // If this is a store who's preceding store to a subset of the current // location and no one other node is chained to that store we can // effectively drop the store. Do not remove stores to undef as they may diff --git a/llvm/test/CodeGen/AArch64/Redundantstore.ll b/llvm/test/CodeGen/AArch64/Redundantstore.ll --- a/llvm/test/CodeGen/AArch64/Redundantstore.ll +++ b/llvm/test/CodeGen/AArch64/Redundantstore.ll @@ -1,8 +1,11 @@ -; RUN: llc < %s -O3 -mtriple=aarch64-eabi | FileCheck %s +; RUN: llc < %s -O3 -mtriple=aarch64-eabi 2>&1 | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @end_of_array = common global i8* null, align 8 +; The tests in this file should not produce a TypeSize warning. +; CHECK-NOT: warning: {{.*}}TypeSize is not scalable + ; CHECK-LABEL: @test ; CHECK: stur ; CHECK-NOT: stur @@ -23,3 +26,23 @@ ret i8* %0 } +; #include +; #include +; +; void redundant_store(uint32_t *x) { +; *x = 1; +; *(svint32_t *)x = svdup_s32(0); +; } + +; CHECK-LABEL: @redundant_store +define void @redundant_store(i32* nocapture %x) local_unnamed_addr #0 { + %1 = bitcast i32* %x to * + store i32 1, i32* %x, align 4 + %2 = tail call @llvm.aarch64.sve.dup.x.nxv4i32(i32 0) + store %2, * %1, align 16 + ret void +} + +declare @llvm.aarch64.sve.dup.x.nxv4i32(i32) + +attributes #0 = { "target-cpu"="generic" "target-features"="+neon,+sve,+v8.2a" }