1 // RUN: %clang -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns %s -o - | FileCheck %s
3 typedef float fx2x2_t
__attribute__((matrix_type(2, 2)));
4 typedef int ix2x2_t
__attribute__((matrix_type(2, 2)));
6 fx2x2_t
fp_matrix_contract(fx2x2_t a
, fx2x2_t b
, float c
, float d
) {
7 // CHECK: call contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32
8 // CHECK: fdiv contract <4 x float>
9 // CHECK: fmul contract <4 x float>
10 #pragma clang fp contract(fast)
11 return (a
* b
/ c
) * d
;
14 fx2x2_t
fp_matrix_reassoc(fx2x2_t a
, fx2x2_t b
, fx2x2_t c
) {
15 // CHECK: fadd reassoc <4 x float>
16 // CHECK: fsub reassoc <4 x float>
17 #pragma clang fp reassociate(on)
21 fx2x2_t
fp_matrix_ops(fx2x2_t a
, fx2x2_t b
, fx2x2_t c
) {
22 // CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32
23 // CHECK: fadd reassoc contract <4 x float>
24 #pragma clang fp contract(fast) reassociate(on)
28 fx2x2_t
fp_matrix_compound_ops(fx2x2_t a
, fx2x2_t b
, fx2x2_t c
, fx2x2_t d
,
30 // CHECK: call reassoc contract <4 x float> @llvm.matrix.multiply.v4f32.v4f32.v4f32
31 // CHECK: fadd reassoc contract <4 x float>
32 // CHECK: fsub reassoc contract <4 x float>
33 // CHECK: fmul reassoc contract <4 x float>
34 // CHECK: fdiv reassoc contract <4 x float>
35 #pragma clang fp contract(fast) reassociate(on)
45 ix2x2_t
int_matrix_ops(ix2x2_t a
, ix2x2_t b
, ix2x2_t c
) {
46 // CHECK: call <4 x i32> @llvm.matrix.multiply.v4i32.v4i32.v4i32
47 // CHECK: add <4 x i32>
48 #pragma clang fp contract(fast) reassociate(on)