|
| 1 | +// RUN: %clang -emit-llvm -S -fenable-matrix -mllvm -disable-llvm-optzns %s -o - | FileCheck %s |
| 2 | + |
| 3 | +typedef float fx2x2_t __attribute__((matrix_type(2, 2))); |
| 4 | +typedef int ix2x2_t __attribute__((matrix_type(2, 2))); |
| 5 | + |
| 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; |
| 12 | +} |
| 13 | + |
| 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) |
| 18 | + return a + b - c; |
| 19 | +} |
| 20 | + |
| 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) |
| 25 | + return a * b + c; |
| 26 | +} |
| 27 | + |
| 28 | +fx2x2_t fp_matrix_compound_ops(fx2x2_t a, fx2x2_t b, fx2x2_t c, fx2x2_t d, |
| 29 | + float e, float f) { |
| 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) |
| 36 | + a *= b; |
| 37 | + a += c; |
| 38 | + a -= d; |
| 39 | + a *= e; |
| 40 | + a /= f; |
| 41 | + |
| 42 | + return a; |
| 43 | +} |
| 44 | + |
| 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) |
| 49 | + return a * b + c; |
| 50 | +} |
0 commit comments