1// RUN: mlir-opt %s -split-input-file -pass-pipeline="func.func(convert-math-to-llvm)" | FileCheck %s 2 3// CHECK-LABEL: @ops 4func @ops(%arg0: f32, %arg1: f32, %arg2: i32, %arg3: i32, %arg4: f64) { 5// CHECK: = "llvm.intr.exp"(%{{.*}}) : (f32) -> f32 6 %13 = math.exp %arg0 : f32 7// CHECK: = "llvm.intr.exp2"(%{{.*}}) : (f32) -> f32 8 %14 = math.exp2 %arg0 : f32 9// CHECK: = "llvm.intr.sqrt"(%{{.*}}) : (f32) -> f32 10 %19 = math.sqrt %arg0 : f32 11// CHECK: = "llvm.intr.sqrt"(%{{.*}}) : (f64) -> f64 12 %20 = math.sqrt %arg4 : f64 13 func.return 14} 15 16// ----- 17 18// CHECK-LABEL: func @log1p( 19// CHECK-SAME: f32 20func @log1p(%arg0 : f32) { 21 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1.000000e+00 : f32) : f32 22 // CHECK: %[[ADD:.*]] = llvm.fadd %[[ONE]], %arg0 : f32 23 // CHECK: %[[LOG:.*]] = "llvm.intr.log"(%[[ADD]]) : (f32) -> f32 24 %0 = math.log1p %arg0 : f32 25 func.return 26} 27 28// ----- 29 30// CHECK-LABEL: func @log1p_2dvector( 31func @log1p_2dvector(%arg0 : vector<4x3xf32>) { 32 // CHECK: %[[EXTRACT:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.array<4 x vector<3xf32>> 33 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(dense<1.000000e+00> : vector<3xf32>) : vector<3xf32> 34 // CHECK: %[[ADD:.*]] = llvm.fadd %[[ONE]], %[[EXTRACT]] : vector<3xf32> 35 // CHECK: %[[LOG:.*]] = "llvm.intr.log"(%[[ADD]]) : (vector<3xf32>) -> vector<3xf32> 36 // CHECK: %[[INSERT:.*]] = llvm.insertvalue %[[LOG]], %{{.*}}[0] : !llvm.array<4 x vector<3xf32>> 37 %0 = math.log1p %arg0 : vector<4x3xf32> 38 func.return 39} 40 41// ----- 42 43// CHECK-LABEL: func @expm1( 44// CHECK-SAME: f32 45func @expm1(%arg0 : f32) { 46 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1.000000e+00 : f32) : f32 47 // CHECK: %[[EXP:.*]] = "llvm.intr.exp"(%arg0) : (f32) -> f32 48 // CHECK: %[[SUB:.*]] = llvm.fsub %[[EXP]], %[[ONE]] : f32 49 %0 = math.expm1 %arg0 : f32 50 func.return 51} 52 53// ----- 54 55// CHECK-LABEL: func @rsqrt( 56// CHECK-SAME: f32 57func @rsqrt(%arg0 : f32) { 58 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1.000000e+00 : f32) : f32 59 // CHECK: %[[SQRT:.*]] = "llvm.intr.sqrt"(%arg0) : (f32) -> f32 60 // CHECK: %[[DIV:.*]] = llvm.fdiv %[[ONE]], %[[SQRT]] : f32 61 %0 = math.rsqrt %arg0 : f32 62 func.return 63} 64 65// ----- 66 67// CHECK-LABEL: func @sine( 68// CHECK-SAME: f32 69func @sine(%arg0 : f32) { 70 // CHECK: "llvm.intr.sin"(%arg0) : (f32) -> f32 71 %0 = math.sin %arg0 : f32 72 func.return 73} 74 75// ----- 76 77// CHECK-LABEL: func @ctlz( 78// CHECK-SAME: i32 79func @ctlz(%arg0 : i32) { 80 // CHECK: %[[ZERO:.+]] = llvm.mlir.constant(false) : i1 81 // CHECK: "llvm.intr.ctlz"(%arg0, %[[ZERO]]) : (i32, i1) -> i32 82 %0 = math.ctlz %arg0 : i32 83 func.return 84} 85 86// ----- 87 88// CHECK-LABEL: func @cttz( 89// CHECK-SAME: i32 90func @cttz(%arg0 : i32) { 91 // CHECK: %[[ZERO:.+]] = llvm.mlir.constant(false) : i1 92 // CHECK: "llvm.intr.cttz"(%arg0, %[[ZERO]]) : (i32, i1) -> i32 93 %0 = math.cttz %arg0 : i32 94 func.return 95} 96 97// ----- 98 99// CHECK-LABEL: func @cttz_vec( 100// CHECK-SAME: i32 101func @cttz_vec(%arg0 : vector<4xi32>) { 102 // CHECK: %[[ZERO:.+]] = llvm.mlir.constant(false) : i1 103 // CHECK: "llvm.intr.cttz"(%arg0, %[[ZERO]]) : (vector<4xi32>, i1) -> vector<4xi32> 104 %0 = math.cttz %arg0 : vector<4xi32> 105 func.return 106} 107 108// ----- 109 110// CHECK-LABEL: func @ctpop( 111// CHECK-SAME: i32 112func @ctpop(%arg0 : i32) { 113 // CHECK: "llvm.intr.ctpop"(%arg0) : (i32) -> i32 114 %0 = math.ctpop %arg0 : i32 115 func.return 116} 117 118// ----- 119 120// CHECK-LABEL: func @ctpop_vector( 121// CHECK-SAME: vector<3xi32> 122func @ctpop_vector(%arg0 : vector<3xi32>) { 123 // CHECK: "llvm.intr.ctpop"(%arg0) : (vector<3xi32>) -> vector<3xi32> 124 %0 = math.ctpop %arg0 : vector<3xi32> 125 func.return 126} 127 128// ----- 129 130// CHECK-LABEL: func @rsqrt_double( 131// CHECK-SAME: f64 132func @rsqrt_double(%arg0 : f64) { 133 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1.000000e+00 : f64) : f64 134 // CHECK: %[[SQRT:.*]] = "llvm.intr.sqrt"(%arg0) : (f64) -> f64 135 // CHECK: %[[DIV:.*]] = llvm.fdiv %[[ONE]], %[[SQRT]] : f64 136 %0 = math.rsqrt %arg0 : f64 137 func.return 138} 139 140// ----- 141 142// CHECK-LABEL: func @rsqrt_vector( 143// CHECK-SAME: vector<4xf32> 144func @rsqrt_vector(%arg0 : vector<4xf32>) { 145 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(dense<1.000000e+00> : vector<4xf32>) : vector<4xf32> 146 // CHECK: %[[SQRT:.*]] = "llvm.intr.sqrt"(%arg0) : (vector<4xf32>) -> vector<4xf32> 147 // CHECK: %[[DIV:.*]] = llvm.fdiv %[[ONE]], %[[SQRT]] : vector<4xf32> 148 %0 = math.rsqrt %arg0 : vector<4xf32> 149 func.return 150} 151 152// ----- 153 154// CHECK-LABEL: func @rsqrt_multidim_vector( 155func @rsqrt_multidim_vector(%arg0 : vector<4x3xf32>) { 156 // CHECK: %[[EXTRACT:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.array<4 x vector<3xf32>> 157 // CHECK: %[[ONE:.*]] = llvm.mlir.constant(dense<1.000000e+00> : vector<3xf32>) : vector<3xf32> 158 // CHECK: %[[SQRT:.*]] = "llvm.intr.sqrt"(%[[EXTRACT]]) : (vector<3xf32>) -> vector<3xf32> 159 // CHECK: %[[DIV:.*]] = llvm.fdiv %[[ONE]], %[[SQRT]] : vector<3xf32> 160 // CHECK: %[[INSERT:.*]] = llvm.insertvalue %[[DIV]], %{{.*}}[0] : !llvm.array<4 x vector<3xf32>> 161 %0 = math.rsqrt %arg0 : vector<4x3xf32> 162 func.return 163} 164 165// ----- 166 167// CHECK-LABEL: func @powf( 168// CHECK-SAME: f64 169func @powf(%arg0 : f64) { 170 // CHECK: %[[POWF:.*]] = "llvm.intr.pow"(%arg0, %arg0) : (f64, f64) -> f64 171 %0 = math.powf %arg0, %arg0 : f64 172 func.return 173} 174 175