-
Notifications
You must be signed in to change notification settings - Fork 13.3k
[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
Conversation
@llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-backend-systemz Author: Jonas Paulsson (JonPsson1) ChangesCSmith 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 @dominik-steenken Full diff: https://github.com/llvm/llvm-project/pull/128628.diff 2 Files Affected:
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
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
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.
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