[PATCH] D101754: [Matrix] Remove bitcast when casting between matrices of the same size
Saurabh Jha via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 3 05:04:09 PDT 2021
SaurabhJha created this revision.
Herald added a subscriber: tschuett.
SaurabhJha requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
In matrix type casts, we were doing bitcast when the matrices had the same size. This was incorrect and this patch fixes that.
Also added some new CodeGen tests for signed <-> usigned conversions
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D101754
Files:
clang/lib/CodeGen/CGExprScalar.cpp
clang/test/CodeGen/matrix-cast.c
Index: clang/test/CodeGen/matrix-cast.c
===================================================================
--- clang/test/CodeGen/matrix-cast.c
+++ clang/test/CodeGen/matrix-cast.c
@@ -52,13 +52,23 @@
void cast_int_matrix_to_float(ix5x5 i, fx5x5 f) {
// CHECK-LABEL: define{{.*}} void @cast_int_matrix_to_float(<25 x i32> %i, <25 x float> %f)
// CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
- // CHECK-NEXT: [[CONV:%.*]] = bitcast <25 x i32> [[I]] to <25 x float>
+ // CHECK-NEXT: [[CONV:%.*]] = sitofp <25 x i32> [[I]] to <25 x float>
// CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
// CHECK-NEXT: ret void
f = (fx5x5)i;
}
+void cast_unsigned_int_matrix_to_float(unsigned_short_int_5x5 u, fx5x5 f) {
+ // CHECK-LABEL: define{{.*}} void @cast_unsigned_int_matrix_to_float(<25 x i16> %u, <25 x float> %f)
+ // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+ // CHECK-NEXT: [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
+ // CHECK-NEXT: store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
+ // CHECK-NEXT: ret void
+
+ f = (fx5x5)u;
+}
+
void cast_double_matrix_to_int(dx5x5 d, ix5x5 i) {
// CHECK-LABEL: define{{.*}} void @cast_double_matrix_to_int(<25 x double> %d, <25 x i32> %i)
// CHECK: [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
@@ -108,3 +118,23 @@
s = (unsigned_short_int_5x5)l;
}
+
+void cast_unsigned_short_int_to_int(unsigned_short_int_5x5 u, ix5x5 i) {
+ // CHECK-LABEL: define{{.*}} void @cast_unsigned_short_int_to_int(<25 x i16> %u, <25 x i32> %i)
+ // CHECK: [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
+ // CHECK-NEXT: [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
+ // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+ // CHECK-NEXT: ret void
+
+ i = (ix5x5)u;
+}
+
+void cast_int_to_unsigned_long_int(ix5x5 i, unsigned_long_int_5x5 u) {
+ // CHECK-LABEL: define{{.*}} void @cast_int_to_unsigned_long_int(<25 x i32> %i, <25 x i64> %u)
+ // CHECK: [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
+ // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
+ // CHECK-NEXT: store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
+ // CHECK-NEXT: ret void
+
+ u = (unsigned_long_int_5x5)i;
+}
Index: clang/lib/CodeGen/CGExprScalar.cpp
===================================================================
--- clang/lib/CodeGen/CGExprScalar.cpp
+++ clang/lib/CodeGen/CGExprScalar.cpp
@@ -1205,10 +1205,6 @@
QualType SrcElementType;
QualType DstElementType;
if (SrcType->isMatrixType() && DstType->isMatrixType()) {
- // Allow bitcast between matrixes of the same size.
- if (SrcTy->getPrimitiveSizeInBits() == DstTy->getPrimitiveSizeInBits())
- return Builder.CreateBitCast(Src, DstTy, "conv");
-
SrcElementTy = cast<llvm::VectorType>(SrcTy)->getElementType();
DstElementTy = cast<llvm::VectorType>(DstTy)->getElementType();
SrcElementType = SrcType->castAs<MatrixType>()->getElementType();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101754.342362.patch
Type: text/x-patch
Size: 3080 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210503/e59c30cb/attachment-0001.bin>
More information about the cfe-commits
mailing list