87 lines · plain
1// RUN: mlir-opt -math-sincos-fusion %s | FileCheck %s2 3// CHECK-LABEL: func.func @sincos_fusion(4// CHECK-SAME: %[[ARG0:.*]]: f32,5// CHECK-SAME: %[[ARG1:.*]]: f32) -> (f32, f32, f32, f32) {6// CHECK: %[[VAL_0:.*]], %[[VAL_1:.*]] = math.sincos %[[ARG0]] : f327// CHECK: %[[VAL_2:.*]], %[[VAL_3:.*]] = math.sincos %[[ARG1]] : f328// CHECK: return %[[VAL_0]], %[[VAL_1]], %[[VAL_3]], %[[VAL_2]] : f32, f32, f32, f329// CHECK: }10func.func @sincos_fusion(%arg0 : f32, %arg1 : f32) -> (f32, f32, f32, f32) {11 %0 = math.sin %arg0 : f3212 %1 = math.cos %arg0 : f3213 14 %2 = math.cos %arg1 : f3215 %3 = math.sin %arg1 : f3216 17 func.return %0, %1, %2, %3 : f32, f32, f32, f3218}19 20func.func private @sink(%arg0 : f32)21 22// CHECK: func.func private @sink(f32)23// CHECK-LABEL: func.func @sincos_ensure_ssa_dominance(24// CHECK-SAME: %[[ARG0:.*]]: f32,25// CHECK-SAME: %[[ARG1:.*]]: f32) -> (f32, f32, f32, f32) {26// CHECK: %[[VAL_0:.*]], %[[VAL_1:.*]] = math.sincos %[[ARG0]] : f3227// CHECK: call @sink(%[[VAL_0]]) : (f32) -> ()28// CHECK: %[[VAL_2:.*]], %[[VAL_3:.*]] = math.sincos %[[ARG1]] : f3229// CHECK: call @sink(%[[VAL_3]]) : (f32) -> ()30// CHECK: return %[[VAL_0]], %[[VAL_1]], %[[VAL_3]], %[[VAL_2]] : f32, f32, f32, f3231// CHECK: }32func.func @sincos_ensure_ssa_dominance(%arg0 : f32, %arg1 : f32) -> (f32, f32, f32, f32) {33 %0 = math.sin %arg0 : f3234 func.call @sink(%0) : (f32) -> ()35 %1 = math.cos %arg0 : f3236 %2 = math.cos %arg1 : f3237 func.call @sink(%2) : (f32) -> ()38 %3 = math.sin %arg1 : f3239 func.return %0, %1, %2, %3 : f32, f32, f32, f3240}41 42// CHECK-LABEL: func.func @sincos_fusion_no_match_fmf(43// CHECK-SAME: %[[ARG0:.*]]: f32) -> (f32, f32) {44// CHECK: %[[VAL_0:.*]] = math.sin %[[ARG0]] fastmath<contract> : f3245// CHECK: %[[VAL_1:.*]] = math.cos %[[ARG0]] : f3246// CHECK: return %[[VAL_0]], %[[VAL_1]] : f32, f3247// CHECK: }48func.func @sincos_fusion_no_match_fmf(%arg0 : f32) -> (f32, f32) {49 %0 = math.sin %arg0 fastmath<contract> : f3250 %1 = math.cos %arg0 : f3251 func.return %0, %1 : f32, f3252}53 54// CHECK-LABEL: func.func @sincos_no_fusion_different_block(55// CHECK-SAME: %[[ARG0:.*]]: f32,56// CHECK-SAME: %[[ARG1:.*]]: i1) -> f32 {57// CHECK: %[[VAL_0:.*]] = scf.if %[[ARG1]] -> (f32) {58// CHECK: %[[VAL_1:.*]] = math.sin %[[ARG0]] : f3259// CHECK: scf.yield %[[VAL_1]] : f3260// CHECK: } else {61// CHECK: %[[VAL_2:.*]] = math.cos %[[ARG0]] : f3262// CHECK: scf.yield %[[VAL_2]] : f3263// CHECK: }64// CHECK: return %[[VAL_0]] : f3265// CHECK: }66func.func @sincos_no_fusion_different_block(%arg0 : f32, %flag : i1) -> f32 {67 %0 = scf.if %flag -> f32 {68 %s = math.sin %arg0 : f3269 scf.yield %s : f3270 } else {71 %c = math.cos %arg0 : f3272 scf.yield %c : f3273 }74 func.return %0 : f3275}76 77// CHECK-LABEL: func.func @sincos_fusion_preserve_fastmath(78// CHECK-SAME: %[[ARG0:.*]]: f32) -> (f32, f32) {79// CHECK: %[[VAL_0:.*]], %[[VAL_1:.*]] = math.sincos %[[ARG0]] fastmath<contract> : f3280// CHECK: return %[[VAL_0]], %[[VAL_1]] : f32, f3281// CHECK: }82func.func @sincos_fusion_preserve_fastmath(%arg0 : f32) -> (f32, f32) {83 %0 = math.sin %arg0 fastmath<contract> : f3284 %1 = math.cos %arg0 fastmath<contract> : f3285 func.return %0, %1 : f32, f3286}87