Skip to content

Commit 72e00d6

Browse files
authored
[SystemZ] Handle scalar to vector bitcasts. (#128628)
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.
1 parent 32bcc9f commit 72e00d6

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,8 @@ InstructionCost SystemZTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
887887
unsigned SrcScalarBits = Src->getScalarSizeInBits();
888888

889889
if (!Src->isVectorTy()) {
890-
assert (!Dst->isVectorTy());
890+
if (Dst->isVectorTy())
891+
return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I);
891892

892893
if (Opcode == Instruction::SIToFP || Opcode == Instruction::UIToFP) {
893894
if (Src->isIntegerTy(128))
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
; RUN: opt < %s -mtriple=systemz-unknown -mcpu=z15 -passes="print<cost-model>" \
2+
; RUN: -disable-output 2>&1 | FileCheck %s
3+
4+
; Check bitcast from scalar to vector.
5+
6+
@Glob = dso_local local_unnamed_addr global i32 0, align 4
7+
8+
define dso_local void @fun() {
9+
entry:
10+
%d.sroa.0 = alloca i64, align 8
11+
store i64 0, ptr %d.sroa.0, align 8
12+
store i32 2, ptr @Glob, align 4
13+
br label %for.cond1
14+
15+
for.cond1: ; preds = %for.cond1, %entry
16+
%L = load i64, ptr %d.sroa.0, align 8
17+
%A0 = and i64 %L, 4294967295
18+
store i64 %A0, ptr %d.sroa.0, align 8
19+
%BC = bitcast i64 %A0 to <2 x i32>
20+
%0 = and <2 x i32> %BC, splat (i32 10)
21+
store <2 x i32> %0, ptr %d.sroa.0, align 8
22+
br label %for.cond1
23+
24+
; CHECK: Printing analysis 'Cost Model Analysis' for function 'fun':
25+
; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %d.sroa.0 = alloca i64, align 8
26+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: store i64 0, ptr %d.sroa.0, align 8
27+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: store i32 2, ptr @Glob, align 4
28+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: br label %for.cond1
29+
; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %L = load i64, ptr %d.sroa.0, align 8
30+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %A0 = and i64 %L, 4294967295
31+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: store i64 %A0, ptr %d.sroa.0, align 8
32+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %BC = bitcast i64 %A0 to <2 x i32>
33+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %0 = and <2 x i32> %BC, splat (i32 10)
34+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: store <2 x i32> %0, ptr %d.sroa.0, align 8
35+
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: br label %for.cond1
36+
}

0 commit comments

Comments
 (0)