125 lines · plain
1// RUN: mlir-opt %s -split-input-file -pass-pipeline='builtin.module(func.func(canonicalize{test-convergence}))' | FileCheck %s2 3// CHECK-LABEL: @dcast_fold4// CHECK-SAME: %[[ARG_0:.*]]: tensor5 6// CHECK: return %[[ARG_0]]7 8!qalias = !quant.uniform<u8:f32, 2.0:128>9func.func @dcast_fold(%arg0: tensor<4xf32>) -> tensor<4xf32> {10 %0 = quant.qcast %arg0 : tensor<4xf32> to tensor<4x!qalias>11 %1 = quant.dcast %0 : tensor<4x!qalias> to tensor<4xf32>12 return %1 : tensor<4xf32>13}14 15// -----16 17// CHECK-LABEL: @dcast_no_fold_source18// CHECK-SAME: %[[ARG_0:.*]]: tensor19 20// CHECK: %[[VAL_0:.*]] = quant.scast %[[ARG_0]]21// CHECK: %[[VAL_1:.*]] = quant.dcast %[[VAL_0]]22// CHECK: return %[[VAL_1]]23 24!qalias = !quant.uniform<u8:f32, 2.0:128>25func.func @dcast_no_fold_source(%arg0: tensor<4xi8>) -> tensor<4xf32> {26 %0 = quant.scast %arg0 : tensor<4xi8> to tensor<4x!qalias>27 %1 = quant.dcast %0 : tensor<4x!qalias> to tensor<4xf32>28 return %1 : tensor<4xf32>29}30 31// -----32 33// CHECK-LABEL: @qcast_fold34// CHECK-SAME: %[[ARG_0:.*]]: tensor35 36// CHECK: return %[[ARG_0]]37 38!qalias = !quant.uniform<u8:f32, 2.0:128>39func.func @qcast_fold(%arg0: tensor<4x!qalias>) -> tensor<4x!qalias> {40 %0 = quant.dcast %arg0 : tensor<4x!qalias> to tensor<4xf32>41 %1 = quant.qcast %0 : tensor<4xf32> to tensor<4x!qalias>42 return %1 : tensor<4x!qalias>43}44 45// -----46 47// CHECK-LABEL: @qcast_no_fold_source48// CHECK-SAME: %[[ARG_0:.*]]: tensor49 50// CHECK: %[[VAL_0:.*]] = arith.negf %[[ARG_0]]51// CHECK: %[[VAL_1:.*]] = quant.qcast %[[VAL_0]]52// CHECK: return %[[VAL_1]]53 54!qalias = !quant.uniform<u8:f32, 2.0:128>55func.func @qcast_no_fold_source(%arg0: tensor<4xf32>) -> tensor<4x!qalias> {56 %0 = arith.negf %arg0 : tensor<4xf32>57 %1 = quant.qcast %0 : tensor<4xf32> to tensor<4x!qalias>58 return %1 : tensor<4x!qalias>59}60 61// -----62 63// CHECK-LABEL: @qcast_no_fold_type64// CHECK-SAME: %[[ARG_0:.*]]: tensor65 66// CHECK: %[[VAL_0:.*]] = quant.dcast %[[ARG_0]]67// CHECK: %[[VAL_1:.*]] = quant.qcast %[[VAL_0]]68// CHECK: return %[[VAL_1]]69 70!qalias = !quant.uniform<u8:f32, 2.0:128>71!qalias1 = !quant.uniform<u8:f32, 3.0:128>72func.func @qcast_no_fold_type(%arg0: tensor<4x!qalias>) -> tensor<4x!qalias1> {73 %0 = quant.dcast %arg0 : tensor<4x!qalias> to tensor<4xf32>74 %1 = quant.qcast %0 : tensor<4xf32> to tensor<4x!qalias1>75 return %1 : tensor<4x!qalias1>76}77 78// -----79 80// CHECK-LABEL: @scast_fold81// CHECK-SAME: %[[ARG_0:.*]]: tensor82 83// CHECK: return %[[ARG_0]]84 85!qalias = !quant.uniform<u8:f32, 2.0:128>86func.func @scast_fold(%arg0: tensor<4x!qalias>) -> tensor<4x!qalias> {87 %0 = quant.scast %arg0 : tensor<4x!qalias> to tensor<4xi8>88 %1 = quant.scast %0 : tensor<4xi8> to tensor<4x!qalias>89 return %1 : tensor<4x!qalias>90}91 92// -----93 94// CHECK-LABEL: @scast_no_fold_source95// CHECK-SAME: %[[ARG_0:.*]]: tensor96 97// CHECK: %[[QCAST:.*]] = quant.qcast %[[ARG_0]]98// CHECK: %[[SCAST:.*]] = quant.scast %[[QCAST]]99// CHECK: return %[[SCAST]]100 101!qalias = !quant.uniform<u8:f32, 2.0:128>102func.func @scast_no_fold_source(%arg0: tensor<4xf32>) -> tensor<4xi8> {103 %0 = quant.qcast %arg0 : tensor<4xf32> to tensor<4x!qalias>104 %1 = quant.scast %0 : tensor<4x!qalias> to tensor<4xi8>105 return %1 : tensor<4xi8>106}107 108// -----109 110// CHECK-LABEL: @scast_no_fold_type111// CHECK-SAME: %[[ARG_0:.*]]: tensor112 113// CHECK: %[[VAL_0:.*]] = quant.scast %[[ARG_0]]114// CHECK: %[[VAL_1:.*]] = quant.scast %[[VAL_0]]115// CHECK: return %[[VAL_1]]116 117!qalias = !quant.uniform<u8:f32, 2.0:128>118!qalias1 = !quant.uniform<u8:f32, 3.0:128>119func.func @scast_no_fold_type(%arg0: tensor<4x!qalias>) -> tensor<4x!qalias1> {120 %0 = quant.scast %arg0 : tensor<4x!qalias> to tensor<4xi8>121 %1 = quant.scast %0 : tensor<4xi8> to tensor<4x!qalias1>122 return %1 : tensor<4x!qalias1>123}124 125