From 7470d9a13088f97959f0e58519a72dbf537f1e59 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Wed, 26 Jul 2023 15:00:58 -0700 Subject: [PATCH] [SystemZ] Avoid type legalization on structs In SystemZTTIImpl::getMemoryOpCost, the call to getNumberOfParts will run type legalization, which can't handle structs. So before that, we check for an unknown value type and forward to BaseT, just like many other targets do in this situation. https://bugzilla.redhat.com/show_bug.cgi?id=2224885 Reviewed By: uweigand Differential Revision: https://reviews.llvm.org/D156379 (cherry picked from commit 85e4ee15d32ae0344755d11d4ca90a15a6e005cd) --- .../SystemZ/SystemZTargetTransformInfo.cpp | 5 ++++ .../CostModel/SystemZ/struct-cost-crash.ll | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 llvm/test/Analysis/CostModel/SystemZ/struct-cost-crash.ll diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp index 821efc1b758b..abac7a9bfe0a 100644 --- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp @@ -1152,6 +1152,11 @@ InstructionCost SystemZTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src, } } + // Type legalization (via getNumberOfParts) can't handle structs + if (TLI->getValueType(DL, Src, true) == MVT::Other) + return BaseT::getMemoryOpCost(Opcode, Src, Alignment, AddressSpace, + CostKind); + unsigned NumOps = (Src->isVectorTy() ? getNumVectorRegs(Src) : getNumberOfParts(Src)); diff --git a/llvm/test/Analysis/CostModel/SystemZ/struct-cost-crash.ll b/llvm/test/Analysis/CostModel/SystemZ/struct-cost-crash.ll new file mode 100644 index 000000000000..bad23baff2d1 --- /dev/null +++ b/llvm/test/Analysis/CostModel/SystemZ/struct-cost-crash.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -passes="print" 2>&1 -disable-output < %s | FileCheck %s +; +; Check that SystemZTTIImpl::getMemoryOpCost doesn't try to legalize structs, +; which was failing llvm_unreachable in MVT::getVT. + +target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64" +target triple = "s390x-unknown-linux-gnu" + +declare { i64, i32 } @bar() + +define i8 @foo() { +; CHECK-LABEL: 'foo' +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: br label %1 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %2 = call { i64, i32 } @bar() +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: store { i64, i32 } %2, ptr inttoptr (i64 16 to ptr), align 16 +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: br label %1 +; + br label %1 + +1: ; preds = %1, %0 + %2 = call { i64, i32 } @bar() + store { i64, i32 } %2, ptr inttoptr (i64 16 to ptr), align 16 + br label %1 +} -- 2.34.1