1// RUN: mlir-opt %s -split-input-file -pass-pipeline="builtin.module(convert-math-to-funcs{min-width-of-fpowi-exponent=33})" | FileCheck %s 2 3// ----- 4 5// Check that i32 exponent case is not converted 6// due to {min-width-of-fpowi-exponent=33}: 7 8// CHECK-LABEL: func.func @fpowi32( 9// CHECK-SAME: %[[VAL_0:.*]]: f64, 10// CHECK-SAME: %[[VAL_1:.*]]: i32) { 11// CHECK: %[[VAL_2:.*]] = math.fpowi %[[VAL_0]], %[[VAL_1]] : f64, i32 12// CHECK: return 13// CHECK: } 14func.func @fpowi32(%arg0: f64, %arg1: i32) { 15 %0 = math.fpowi %arg0, %arg1 : f64, i32 16 func.return 17} 18 19// ----- 20 21// CHECK-LABEL: func.func @fpowi64( 22// CHECK-SAME: %[[VAL_0:.*]]: f64, 23// CHECK-SAME: %[[VAL_1:.*]]: i64) { 24// CHECK: %[[VAL_2:.*]] = call @__mlir_math_fpowi_f64_i64(%[[VAL_0]], %[[VAL_1]]) : (f64, i64) -> f64 25// CHECK: return 26// CHECK: } 27 28// CHECK-LABEL: func.func private @__mlir_math_fpowi_f64_i64( 29// CHECK-SAME: %[[VAL_0:.*]]: f64, 30// CHECK-SAME: %[[VAL_1:.*]]: i64) -> f64 attributes {llvm.linkage = #llvm.linkage<linkonce_odr>} { 31// CHECK: %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f64 32// CHECK: %[[VAL_3:.*]] = arith.constant 0 : i64 33// CHECK: %[[VAL_4:.*]] = arith.constant 1 : i64 34// CHECK: %[[VAL_5:.*]] = arith.constant -9223372036854775808 : i64 35// CHECK: %[[VAL_6:.*]] = arith.constant 9223372036854775807 : i64 36// CHECK: %[[VAL_7:.*]] = arith.cmpi eq, %[[VAL_1]], %[[VAL_3]] : i64 37// CHECK: cf.cond_br %[[VAL_7]], ^bb1, ^bb2 38// CHECK: ^bb1: 39// CHECK: return %[[VAL_2]] : f64 40// CHECK: ^bb2: 41// CHECK: %[[VAL_8:.*]] = arith.cmpi sle, %[[VAL_1]], %[[VAL_3]] : i64 42// CHECK: %[[VAL_9:.*]] = arith.cmpi eq, %[[VAL_1]], %[[VAL_5]] : i64 43// CHECK: %[[VAL_10:.*]] = arith.subi %[[VAL_3]], %[[VAL_1]] : i64 44// CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_8]], %[[VAL_10]], %[[VAL_1]] : i64 45// CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_9]], %[[VAL_6]], %[[VAL_11]] : i64 46// CHECK: cf.br ^bb3(%[[VAL_2]], %[[VAL_0]], %[[VAL_12]] : f64, f64, i64) 47// CHECK: ^bb3(%[[VAL_13:.*]]: f64, %[[VAL_14:.*]]: f64, %[[VAL_15:.*]]: i64): 48// CHECK: %[[VAL_16:.*]] = arith.andi %[[VAL_15]], %[[VAL_4]] : i64 49// CHECK: %[[VAL_17:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_3]] : i64 50// CHECK: cf.cond_br %[[VAL_17]], ^bb4, ^bb5(%[[VAL_13]] : f64) 51// CHECK: ^bb4: 52// CHECK: %[[VAL_18:.*]] = arith.mulf %[[VAL_13]], %[[VAL_14]] : f64 53// CHECK: cf.br ^bb5(%[[VAL_18]] : f64) 54// CHECK: ^bb5(%[[VAL_19:.*]]: f64): 55// CHECK: %[[VAL_20:.*]] = arith.shrui %[[VAL_15]], %[[VAL_4]] : i64 56// CHECK: %[[VAL_21:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_3]] : i64 57// CHECK: cf.cond_br %[[VAL_21]], ^bb7(%[[VAL_19]] : f64), ^bb6 58// CHECK: ^bb6: 59// CHECK: %[[VAL_22:.*]] = arith.mulf %[[VAL_14]], %[[VAL_14]] : f64 60// CHECK: cf.br ^bb3(%[[VAL_19]], %[[VAL_22]], %[[VAL_20]] : f64, f64, i64) 61// CHECK: ^bb7(%[[VAL_23:.*]]: f64): 62// CHECK: cf.cond_br %[[VAL_9]], ^bb8, ^bb9(%[[VAL_23]] : f64) 63// CHECK: ^bb8: 64// CHECK: %[[VAL_24:.*]] = arith.mulf %[[VAL_23]], %[[VAL_0]] : f64 65// CHECK: cf.br ^bb9(%[[VAL_24]] : f64) 66// CHECK: ^bb9(%[[VAL_25:.*]]: f64): 67// CHECK: cf.cond_br %[[VAL_8]], ^bb10, ^bb11(%[[VAL_25]] : f64) 68// CHECK: ^bb10: 69// CHECK: %[[VAL_26:.*]] = arith.divf %[[VAL_2]], %[[VAL_25]] : f64 70// CHECK: cf.br ^bb11(%[[VAL_26]] : f64) 71// CHECK: ^bb11(%[[VAL_27:.*]]: f64): 72// CHECK: return %[[VAL_27]] : f64 73// CHECK: } 74func.func @fpowi64(%arg0: f64, %arg1: i64) { 75 %0 = math.fpowi %arg0, %arg1 : f64, i64 76 func.return 77} 78 79// ----- 80 81// CHECK-LABEL: func.func @fpowi64_vec( 82// CHECK-SAME: %[[VAL_0:.*]]: vector<2x3xf32>, 83// CHECK-SAME: %[[VAL_1:.*]]: vector<2x3xi64>) { 84// CHECK: %[[VAL_2:.*]] = arith.constant dense<0.000000e+00> : vector<2x3xf32> 85// CHECK: %[[VAL_3:.*]] = vector.extract %[[VAL_0]][0, 0] : f32 from vector<2x3xf32> 86// CHECK: %[[VAL_4:.*]] = vector.extract %[[VAL_1]][0, 0] : i64 from vector<2x3xi64> 87// CHECK: %[[VAL_5:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_3]], %[[VAL_4]]) : (f32, i64) -> f32 88// CHECK: %[[VAL_6:.*]] = vector.insert %[[VAL_5]], %[[VAL_2]] [0, 0] : f32 into vector<2x3xf32> 89// CHECK: %[[VAL_7:.*]] = vector.extract %[[VAL_0]][0, 1] : f32 from vector<2x3xf32> 90// CHECK: %[[VAL_8:.*]] = vector.extract %[[VAL_1]][0, 1] : i64 from vector<2x3xi64> 91// CHECK: %[[VAL_9:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_7]], %[[VAL_8]]) : (f32, i64) -> f32 92// CHECK: %[[VAL_10:.*]] = vector.insert %[[VAL_9]], %[[VAL_6]] [0, 1] : f32 into vector<2x3xf32> 93// CHECK: %[[VAL_11:.*]] = vector.extract %[[VAL_0]][0, 2] : f32 from vector<2x3xf32> 94// CHECK: %[[VAL_12:.*]] = vector.extract %[[VAL_1]][0, 2] : i64 from vector<2x3xi64> 95// CHECK: %[[VAL_13:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_11]], %[[VAL_12]]) : (f32, i64) -> f32 96// CHECK: %[[VAL_14:.*]] = vector.insert %[[VAL_13]], %[[VAL_10]] [0, 2] : f32 into vector<2x3xf32> 97// CHECK: %[[VAL_15:.*]] = vector.extract %[[VAL_0]][1, 0] : f32 from vector<2x3xf32> 98// CHECK: %[[VAL_16:.*]] = vector.extract %[[VAL_1]][1, 0] : i64 from vector<2x3xi64> 99// CHECK: %[[VAL_17:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_15]], %[[VAL_16]]) : (f32, i64) -> f32 100// CHECK: %[[VAL_18:.*]] = vector.insert %[[VAL_17]], %[[VAL_14]] [1, 0] : f32 into vector<2x3xf32> 101// CHECK: %[[VAL_19:.*]] = vector.extract %[[VAL_0]][1, 1] : f32 from vector<2x3xf32> 102// CHECK: %[[VAL_20:.*]] = vector.extract %[[VAL_1]][1, 1] : i64 from vector<2x3xi64> 103// CHECK: %[[VAL_21:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_19]], %[[VAL_20]]) : (f32, i64) -> f32 104// CHECK: %[[VAL_22:.*]] = vector.insert %[[VAL_21]], %[[VAL_18]] [1, 1] : f32 into vector<2x3xf32> 105// CHECK: %[[VAL_23:.*]] = vector.extract %[[VAL_0]][1, 2] : f32 from vector<2x3xf32> 106// CHECK: %[[VAL_24:.*]] = vector.extract %[[VAL_1]][1, 2] : i64 from vector<2x3xi64> 107// CHECK: %[[VAL_25:.*]] = call @__mlir_math_fpowi_f32_i64(%[[VAL_23]], %[[VAL_24]]) : (f32, i64) -> f32 108// CHECK: %[[VAL_26:.*]] = vector.insert %[[VAL_25]], %[[VAL_22]] [1, 2] : f32 into vector<2x3xf32> 109// CHECK: return 110// CHECK: } 111 112// CHECK-LABEL: func.func private @__mlir_math_fpowi_f32_i64( 113// CHECK-SAME: %[[VAL_0:.*]]: f32, 114// CHECK-SAME: %[[VAL_1:.*]]: i64) -> f32 attributes {llvm.linkage = #llvm.linkage<linkonce_odr>} { 115// CHECK: %[[VAL_2:.*]] = arith.constant 1.000000e+00 : f32 116// CHECK: %[[VAL_3:.*]] = arith.constant 0 : i64 117// CHECK: %[[VAL_4:.*]] = arith.constant 1 : i64 118// CHECK: %[[VAL_5:.*]] = arith.constant -9223372036854775808 : i64 119// CHECK: %[[VAL_6:.*]] = arith.constant 9223372036854775807 : i64 120// CHECK: %[[VAL_7:.*]] = arith.cmpi eq, %[[VAL_1]], %[[VAL_3]] : i64 121// CHECK: cf.cond_br %[[VAL_7]], ^bb1, ^bb2 122// CHECK: ^bb1: 123// CHECK: return %[[VAL_2]] : f32 124// CHECK: ^bb2: 125// CHECK: %[[VAL_8:.*]] = arith.cmpi sle, %[[VAL_1]], %[[VAL_3]] : i64 126// CHECK: %[[VAL_9:.*]] = arith.cmpi eq, %[[VAL_1]], %[[VAL_5]] : i64 127// CHECK: %[[VAL_10:.*]] = arith.subi %[[VAL_3]], %[[VAL_1]] : i64 128// CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_8]], %[[VAL_10]], %[[VAL_1]] : i64 129// CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_9]], %[[VAL_6]], %[[VAL_11]] : i64 130// CHECK: cf.br ^bb3(%[[VAL_2]], %[[VAL_0]], %[[VAL_12]] : f32, f32, i64) 131// CHECK: ^bb3(%[[VAL_13:.*]]: f32, %[[VAL_14:.*]]: f32, %[[VAL_15:.*]]: i64): 132// CHECK: %[[VAL_16:.*]] = arith.andi %[[VAL_15]], %[[VAL_4]] : i64 133// CHECK: %[[VAL_17:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_3]] : i64 134// CHECK: cf.cond_br %[[VAL_17]], ^bb4, ^bb5(%[[VAL_13]] : f32) 135// CHECK: ^bb4: 136// CHECK: %[[VAL_18:.*]] = arith.mulf %[[VAL_13]], %[[VAL_14]] : f32 137// CHECK: cf.br ^bb5(%[[VAL_18]] : f32) 138// CHECK: ^bb5(%[[VAL_19:.*]]: f32): 139// CHECK: %[[VAL_20:.*]] = arith.shrui %[[VAL_15]], %[[VAL_4]] : i64 140// CHECK: %[[VAL_21:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_3]] : i64 141// CHECK: cf.cond_br %[[VAL_21]], ^bb7(%[[VAL_19]] : f32), ^bb6 142// CHECK: ^bb6: 143// CHECK: %[[VAL_22:.*]] = arith.mulf %[[VAL_14]], %[[VAL_14]] : f32 144// CHECK: cf.br ^bb3(%[[VAL_19]], %[[VAL_22]], %[[VAL_20]] : f32, f32, i64) 145// CHECK: ^bb7(%[[VAL_23:.*]]: f32): 146// CHECK: cf.cond_br %[[VAL_9]], ^bb8, ^bb9(%[[VAL_23]] : f32) 147// CHECK: ^bb8: 148// CHECK: %[[VAL_24:.*]] = arith.mulf %[[VAL_23]], %[[VAL_0]] : f32 149// CHECK: cf.br ^bb9(%[[VAL_24]] : f32) 150// CHECK: ^bb9(%[[VAL_25:.*]]: f32): 151// CHECK: cf.cond_br %[[VAL_8]], ^bb10, ^bb11(%[[VAL_25]] : f32) 152// CHECK: ^bb10: 153// CHECK: %[[VAL_26:.*]] = arith.divf %[[VAL_2]], %[[VAL_25]] : f32 154// CHECK: cf.br ^bb11(%[[VAL_26]] : f32) 155// CHECK: ^bb11(%[[VAL_27:.*]]: f32): 156// CHECK: return %[[VAL_27]] : f32 157// CHECK: } 158func.func @fpowi64_vec(%arg0: vector<2x3xf32>, %arg1: vector<2x3xi64>) { 159 %0 = math.fpowi %arg0, %arg1 : vector<2x3xf32>, vector<2x3xi64> 160 func.return 161} 162