effective-light updated this revision to Diff 339325. effective-light added a comment.
Add a test for compound operations Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D100834/new/ https://reviews.llvm.org/D100834 Files: clang/lib/CodeGen/CGExprScalar.cpp clang/test/CodeGen/fp-matrix-pragma.c Index: clang/test/CodeGen/fp-matrix-pragma.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fp-matrix-pragma.c @@ -0,0 +1,50 @@ +// RUN: %clang -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns %s -o - | FileCheck %s + +typedef float fx2x2_t __attribute__((matrix_type(2, 2))); +typedef int ix2x2_t __attribute__((matrix_type(2, 2))); + +fx2x2_t fp_matrix_contract(fx2x2_t a, fx2x2_t b, float c, float d) { +// CHECK: call contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fdiv contract <4 x float> +// CHECK: fmul contract <4 x float> +#pragma clang fp contract(fast) + return (a * b / c) * d; +} + +fx2x2_t fp_matrix_reassoc(fx2x2_t a, fx2x2_t b, fx2x2_t c) { +// CHECK: fadd reassoc <4 x float> +// CHECK: fsub reassoc <4 x float> +#pragma clang fp reassociate(on) + return a + b - c; +} + +fx2x2_t fp_matrix_ops(fx2x2_t a, fx2x2_t b, fx2x2_t c) { +// CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fadd reassoc contract <4 x float> +#pragma clang fp contract(fast) reassociate(on) + return a * b + c; +} + +fx2x2_t fp_matrix_compound_ops(fx2x2_t a, fx2x2_t b, fx2x2_t c, fx2x2_t d, + float e, float f) { +// CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fadd reassoc contract <4 x float> +// CHECK: fsub reassoc contract <4 x float> +// CHECK: fmul reassoc contract <4 x float> +// CHECK: fdiv reassoc contract <4 x float> +#pragma clang fp contract(fast) reassociate(on) + a *= b; + a += c; + a -= d; + a *= e; + a /= f; + + return a; +} + +ix2x2_t int_matrix_ops(ix2x2_t a, ix2x2_t b, ix2x2_t c) { +// CHECK: call <4 x i32> @llvm.matrix.multiply.v4i32.v4i32.v4i32 +// CHECK: add <4 x i32> +#pragma clang fp contract(fast) reassociate(on) + return a * b + c; +} Index: clang/lib/CodeGen/CGExprScalar.cpp =================================================================== --- clang/lib/CodeGen/CGExprScalar.cpp +++ clang/lib/CodeGen/CGExprScalar.cpp @@ -732,6 +732,7 @@ BO->getLHS()->getType().getCanonicalType()); auto *RHSMatTy = dyn_cast<ConstantMatrixType>( BO->getRHS()->getType().getCanonicalType()); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); if (LHSMatTy && RHSMatTy) return MB.CreateMatrixMultiply(Ops.LHS, Ops.RHS, LHSMatTy->getNumRows(), LHSMatTy->getNumColumns(), @@ -3206,6 +3207,7 @@ "first operand must be a matrix"); assert(BO->getRHS()->getType().getCanonicalType()->isArithmeticType() && "second operand must be an arithmetic type"); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); return MB.CreateScalarDiv(Ops.LHS, Ops.RHS, Ops.Ty->hasUnsignedIntegerRepresentation()); } @@ -3585,6 +3587,7 @@ if (op.Ty->isConstantMatrixType()) { llvm::MatrixBuilder<CGBuilderTy> MB(Builder); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, op.FPFeatures); return MB.CreateAdd(op.LHS, op.RHS); } @@ -3734,6 +3737,7 @@ if (op.Ty->isConstantMatrixType()) { llvm::MatrixBuilder<CGBuilderTy> MB(Builder); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, op.FPFeatures); return MB.CreateSub(op.LHS, op.RHS); }
Index: clang/test/CodeGen/fp-matrix-pragma.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fp-matrix-pragma.c @@ -0,0 +1,50 @@ +// RUN: %clang -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns %s -o - | FileCheck %s + +typedef float fx2x2_t __attribute__((matrix_type(2, 2))); +typedef int ix2x2_t __attribute__((matrix_type(2, 2))); + +fx2x2_t fp_matrix_contract(fx2x2_t a, fx2x2_t b, float c, float d) { +// CHECK: call contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fdiv contract <4 x float> +// CHECK: fmul contract <4 x float> +#pragma clang fp contract(fast) + return (a * b / c) * d; +} + +fx2x2_t fp_matrix_reassoc(fx2x2_t a, fx2x2_t b, fx2x2_t c) { +// CHECK: fadd reassoc <4 x float> +// CHECK: fsub reassoc <4 x float> +#pragma clang fp reassociate(on) + return a + b - c; +} + +fx2x2_t fp_matrix_ops(fx2x2_t a, fx2x2_t b, fx2x2_t c) { +// CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fadd reassoc contract <4 x float> +#pragma clang fp contract(fast) reassociate(on) + return a * b + c; +} + +fx2x2_t fp_matrix_compound_ops(fx2x2_t a, fx2x2_t b, fx2x2_t c, fx2x2_t d, + float e, float f) { +// CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32 +// CHECK: fadd reassoc contract <4 x float> +// CHECK: fsub reassoc contract <4 x float> +// CHECK: fmul reassoc contract <4 x float> +// CHECK: fdiv reassoc contract <4 x float> +#pragma clang fp contract(fast) reassociate(on) + a *= b; + a += c; + a -= d; + a *= e; + a /= f; + + return a; +} + +ix2x2_t int_matrix_ops(ix2x2_t a, ix2x2_t b, ix2x2_t c) { +// CHECK: call <4 x i32> @llvm.matrix.multiply.v4i32.v4i32.v4i32 +// CHECK: add <4 x i32> +#pragma clang fp contract(fast) reassociate(on) + return a * b + c; +} Index: clang/lib/CodeGen/CGExprScalar.cpp =================================================================== --- clang/lib/CodeGen/CGExprScalar.cpp +++ clang/lib/CodeGen/CGExprScalar.cpp @@ -732,6 +732,7 @@ BO->getLHS()->getType().getCanonicalType()); auto *RHSMatTy = dyn_cast<ConstantMatrixType>( BO->getRHS()->getType().getCanonicalType()); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); if (LHSMatTy && RHSMatTy) return MB.CreateMatrixMultiply(Ops.LHS, Ops.RHS, LHSMatTy->getNumRows(), LHSMatTy->getNumColumns(), @@ -3206,6 +3207,7 @@ "first operand must be a matrix"); assert(BO->getRHS()->getType().getCanonicalType()->isArithmeticType() && "second operand must be an arithmetic type"); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); return MB.CreateScalarDiv(Ops.LHS, Ops.RHS, Ops.Ty->hasUnsignedIntegerRepresentation()); } @@ -3585,6 +3587,7 @@ if (op.Ty->isConstantMatrixType()) { llvm::MatrixBuilder<CGBuilderTy> MB(Builder); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, op.FPFeatures); return MB.CreateAdd(op.LHS, op.RHS); } @@ -3734,6 +3737,7 @@ if (op.Ty->isConstantMatrixType()) { llvm::MatrixBuilder<CGBuilderTy> MB(Builder); + CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, op.FPFeatures); return MB.CreateSub(op.LHS, op.RHS); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits