[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-21 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light added a comment.

In D100834#2704330 , @fhahn wrote:

> In D100834#2702550 , @kpn wrote:
>
>> I don't know the matrix implementation so I can't swear this hits every 
>> place needed, but the uses of CGFPOptionsRAII in this patch look correct at 
>> least.
>
> Other parts of the extension include `__builtin_matrix_transpose`, indexing 
> into a matrix and casting, but I don't think the FMFs are needed there. One 
> thing that would be good to also test would be the compound operators, (`-=`, 
> `+=`, `*=`). @effective-light it would be great if you could add a test for 
> those, then LGTM from my side. If you need someone to commit the change on 
> your behalf, please let us know and share the name + email to use for the 
> commit authorship.

Ya, you can commit it under `Hamza Mahfooz `, 
thanks.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100834/new/

https://reviews.llvm.org/D100834

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-21 Thread Hamza Mahfooz via Phabricator via cfe-commits
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(
   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 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 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

[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-20 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light updated this revision to Diff 339048.
effective-light added a comment.

Use the correct clang command.


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,33 @@
+// 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;
+}
+
+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(
   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 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 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,33 @@
+// 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;
+}
+
+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(
   BO->getRHS()->getType().getCanonicalType());
+  CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures);
   if (LHSMatT

[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-20 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light updated this revision to Diff 339012.
effective-light added a comment.

Fix build


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,33 @@
+// RUN: %clang_cc1 -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;
+}
+
+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(
   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 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 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,33 @@
+// RUN: %clang_cc1 -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;
+}
+
+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(
   BO->getRHS()->getType().getCanonicalType());
+  CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures);
   if (LHSMatTy && RHSMatTy

[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-20 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light updated this revision to Diff 338941.
effective-light added a comment.

Whoops


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,33 @@
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns 
-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;
+}
+
+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(
   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 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 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,33 @@
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns -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;
+}
+
+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(
   BO->getRHS()->getType().getCanonicalType());
+  CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures);
   if (LHSMatTy && RHSMatTy)
   

[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-20 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light updated this revision to Diff 338812.
effective-light added a comment.

Remove the unnecessary flags and add another test


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D100834/new/

https://reviews.llvm.org/D100834

Files:
  clang/test/CodeGen/fp-matrix-pragma.c


Index: clang/test/CodeGen/fp-matrix-pragma.c
===
--- clang/test/CodeGen/fp-matrix-pragma.c
+++ clang/test/CodeGen/fp-matrix-pragma.c
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix 
--target=arm64-unknown-iphoneos -g0 -mllvm -disable-llvm-optzns -o - | 
FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns 
-o - | FileCheck %s
 
 typedef float fx2x2_t __attribute__((matrix_type(2, 2)));
 typedef int ix2x2_t __attribute__((matrix_type(2, 2)));
@@ -18,6 +18,13 @@
   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;
+}
+
 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>


Index: clang/test/CodeGen/fp-matrix-pragma.c
===
--- clang/test/CodeGen/fp-matrix-pragma.c
+++ clang/test/CodeGen/fp-matrix-pragma.c
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix --target=arm64-unknown-iphoneos -g0 -mllvm -disable-llvm-optzns -o - | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns -o - | FileCheck %s
 
 typedef float fx2x2_t __attribute__((matrix_type(2, 2)));
 typedef int ix2x2_t __attribute__((matrix_type(2, 2)));
@@ -18,6 +18,13 @@
   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;
+}
+
 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>
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D100834: Bug 49739 - [Matrix] Support #pragma clang fp

2021-04-20 Thread Hamza Mahfooz via Phabricator via cfe-commits
effective-light created this revision.
Herald added a subscriber: tschuett.
effective-light requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

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,26 @@
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix 
--target=arm64-unknown-iphoneos -g0 -mllvm -disable-llvm-optzns -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;
+}
+
+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(
   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 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 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,26 @@
+// RUN: %clang_cc1 -emit-llvm -S -fenable-matrix --target=arm64-unknown-iphoneos -g0 -mllvm -disable-llvm-optzns -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;
+}
+
+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(
   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);