Skip to content

Commit ffb1c21

Browse files
committed
[Matrix] Fix crash in liftTranspose when instructions are folded.
Builder.Create(F)Add may constant fold the inputs, return a constant instead of an instruction. Account for that instead of crashing.
1 parent da6099c commit ffb1c21

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -924,8 +924,7 @@ class LowerMatrixIntrinsics {
924924
match(B, m_Intrinsic<Intrinsic::matrix_transpose>(
925925
m_Value(BT), m_ConstantInt(), m_ConstantInt()))) {
926926
IRBuilder<> Builder(&I);
927-
auto *Add = cast<Instruction>(Builder.CreateFAdd(AT, BT, "mfadd"));
928-
setShapeInfo(Add, {R, C});
927+
auto *Add = Builder.CreateFAdd(AT, BT, "mfadd");
929928
MatrixBuilder MBuilder(Builder);
930929
Instruction *NewInst = MBuilder.CreateMatrixTranspose(
931930
Add, R->getZExtValue(), C->getZExtValue(), "mfadd_t");
@@ -934,9 +933,13 @@ class LowerMatrixIntrinsics {
934933
computeShapeInfoForInst(&I, ShapeMap) &&
935934
"Shape of new instruction doesn't match original shape.");
936935
CleanupBinOp(I, A, B);
937-
assert(computeShapeInfoForInst(Add, ShapeMap).value_or(ShapeMap[Add]) ==
938-
ShapeMap[Add] &&
939-
"Shape of updated addition doesn't match cached shape.");
936+
if (auto *AddI = dyn_cast<Instruction>(Add)) {
937+
setShapeInfo(AddI, {R, C});
938+
assert(
939+
computeShapeInfoForInst(AddI, ShapeMap).value_or(ShapeMap[AddI]) ==
940+
ShapeMap[AddI] &&
941+
"Shape of updated addition doesn't match cached shape.");
942+
}
940943
}
941944
}
942945

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p lower-matrix-intrinsics -S %s | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5+
6+
define <8 x float> @transpose_constant_fold_fadd_AT_BT() {
7+
; CHECK-LABEL: define <8 x float> @transpose_constant_fold_fadd_AT_BT() {
8+
; CHECK-NEXT: [[ENTRY:.*:]]
9+
; CHECK-NEXT: ret <8 x float> splat (float 2.000000e+00)
10+
;
11+
entry:
12+
%t = tail call <8 x float> @llvm.matrix.transpose.v8f32(<8 x float> splat (float 1.0), i32 8, i32 1)
13+
%f = fadd <8 x float> %t, %t
14+
ret <8 x float> %f
15+
}
16+
17+
define <8 x float> @transpose_constant_fold_fmul_A_k() {
18+
; CHECK-LABEL: define <8 x float> @transpose_constant_fold_fmul_A_k() {
19+
; CHECK-NEXT: [[ENTRY:.*:]]
20+
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <8 x float> splat (float 3.000000e+00), <8 x float> poison, <8 x i32> zeroinitializer
21+
; CHECK-NEXT: [[SPLIT:%.*]] = shufflevector <8 x float> [[SPLAT]], <8 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
22+
; CHECK-NEXT: [[SPLIT1:%.*]] = shufflevector <8 x float> [[SPLAT]], <8 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
23+
; CHECK-NEXT: [[TMP0:%.*]] = fmul <4 x float> splat (float 1.000000e+00), [[SPLIT]]
24+
; CHECK-NEXT: [[TMP1:%.*]] = fmul <4 x float> splat (float 1.000000e+00), [[SPLIT1]]
25+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x float> [[TMP0]], <4 x float> [[TMP1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
26+
; CHECK-NEXT: ret <8 x float> [[TMP2]]
27+
;
28+
entry:
29+
%t.1 = tail call <8 x float> @llvm.matrix.transpose.v8f32(<8 x float> splat (float 1.0), i32 4, i32 2)
30+
%splat = shufflevector <8 x float> splat (float 3.0), <8 x float> poison, <8 x i32> zeroinitializer
31+
%m = fmul <8 x float> %t.1, %splat
32+
%t.2 = tail call <8 x float> @llvm.matrix.transpose.v8f32(<8 x float> %m, i32 2, i32 4)
33+
ret <8 x float> %t.2
34+
}
35+
36+
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
37+
declare <8 x float> @llvm.matrix.transpose.v8f32(<8 x float>, i32 immarg, i32 immarg) #0
38+
39+
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

0 commit comments

Comments
 (0)