Skip to content

[SystemZ] Handle scalar to vector bitcasts. #128628

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 27, 2025
Merged

Conversation

JonPsson1
Copy link
Contributor

CSmith found a case where SROA produces bitcasts from scalar to vector. This was previously asserted against in SystemZTTI, but now the BaseT implementation takes care of it.

Reduced C test case:

clang -O3 -march=z15 crash5_aftercreduce.c -o a.out -w -mllvm -slp-min-reg-size=64 -mllvm -sroa-skip-mem2reg -mllvm -unroll-full-max-count=1 -mllvm -disable-select-optimize=false

crash5_aftercreduce.c.tar.gz

@dominik-steenken

@llvmbot
Copy link
Member

llvmbot commented Feb 25, 2025

@llvm/pr-subscribers-llvm-analysis

@llvm/pr-subscribers-backend-systemz

Author: Jonas Paulsson (JonPsson1)

Changes

CSmith found a case where SROA produces bitcasts from scalar to vector. This was previously asserted against in SystemZTTI, but now the BaseT implementation takes care of it.

Reduced C test case:

clang -O3 -march=z15 crash5_aftercreduce.c -o a.out -w -mllvm -slp-min-reg-size=64 -mllvm -sroa-skip-mem2reg -mllvm -unroll-full-max-count=1 -mllvm -disable-select-optimize=false

crash5_aftercreduce.c.tar.gz

@dominik-steenken


Full diff: https://github.com/llvm/llvm-project/pull/128628.diff

2 Files Affected:

  • (modified) llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp (+2-1)
  • (added) llvm/test/Analysis/CostModel/SystemZ/bitcast.ll (+36)
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
index 2b94832939419..06a0a3a631654 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
@@ -887,7 +887,8 @@ InstructionCost SystemZTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
   unsigned SrcScalarBits = Src->getScalarSizeInBits();
 
   if (!Src->isVectorTy()) {
-    assert (!Dst->isVectorTy());
+    if (Dst->isVectorTy())
+      return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I);
 
     if (Opcode == Instruction::SIToFP || Opcode == Instruction::UIToFP) {
       if (Src->isIntegerTy(128))
diff --git a/llvm/test/Analysis/CostModel/SystemZ/bitcast.ll b/llvm/test/Analysis/CostModel/SystemZ/bitcast.ll
new file mode 100644
index 0000000000000..7927588623c52
--- /dev/null
+++ b/llvm/test/Analysis/CostModel/SystemZ/bitcast.ll
@@ -0,0 +1,36 @@
+; RUN: opt < %s -mtriple=systemz-unknown -mcpu=z15 -passes="print<cost-model>" \
+; RUN:   -disable-output 2>&1 | FileCheck %s
+
+; Check bitcast from scalar to vector.
+
+@Glob = dso_local local_unnamed_addr global i32 0, align 4
+
+define dso_local void @fun() {
+entry:
+  %d.sroa.0 = alloca i64, align 8
+  store i64 0, ptr %d.sroa.0, align 8
+  store i32 2, ptr @Glob, align 4
+  br label %for.cond1
+
+for.cond1:                                        ; preds = %for.cond1, %entry
+  %L = load i64, ptr %d.sroa.0, align 8
+  %A0 = and i64 %L, 4294967295
+  store i64 %A0, ptr %d.sroa.0, align 8
+  %BC = bitcast i64 %A0 to <2 x i32>
+  %0 = and <2 x i32> %BC, splat (i32 10)
+  store <2 x i32> %0, ptr %d.sroa.0, align 8
+  br label %for.cond1
+
+; CHECK:      Printing analysis 'Cost Model Analysis' for function 'fun':
+; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction:   %d.sroa.0 = alloca i64, align 8
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   store i64 0, ptr %d.sroa.0, align 8
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   store i32 2, ptr @Glob, align 4
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   br label %for.cond1
+; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction:   %L = load i64, ptr %d.sroa.0, align 8
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   %A0 = and i64 %L, 4294967295
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   store i64 %A0, ptr %d.sroa.0, align 8
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   %BC = bitcast i64 %A0 to <2 x i32>
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   %0 = and <2 x i32> %BC, splat (i32 10)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   store <2 x i32> %0, ptr %d.sroa.0, align 8
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction:   br label %for.cond1
+}

Copy link
Member

@uweigand uweigand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@JonPsson1 JonPsson1 merged commit 72e00d6 into llvm:main Feb 27, 2025
14 checks passed
@JonPsson1 JonPsson1 deleted the SZTTI branch February 27, 2025 22:16
cheezeburglar pushed a commit to cheezeburglar/llvm-project that referenced this pull request Feb 28, 2025
CSmith found a case where SROA produces bitcasts from scalar to vector.
This was previously asserted against in SystemZTTI, but now the BaseT
implementation takes care of it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants