diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index b469a4454f1586..89ab9abc7dadb2 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -1205,10 +1205,6 @@ Value *ScalarExprEmitter::EmitScalarCast(Value *Src, QualType SrcType, 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(SrcTy)->getElementType(); DstElementTy = cast(DstTy)->getElementType(); SrcElementType = SrcType->castAs()->getElementType(); diff --git a/clang/test/CodeGen/matrix-cast.c b/clang/test/CodeGen/matrix-cast.c index 8871232f76b11c..ad8f67acacdfb5 100644 --- a/clang/test/CodeGen/matrix-cast.c +++ b/clang/test/CodeGen/matrix-cast.c @@ -52,13 +52,23 @@ void cast_int_matrix_to_short(ix5x5 i, sx5x5 s) { 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 @@ void cast_unsigned_long_int_to_unsigned_short_int(unsigned_long_int_5x5 l, unsig 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; +}