brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.6 KiB · be96dbf Raw
509 lines · plain
1// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py2// RUN: mlir-opt %s --sparse-reinterpret-map -sparsification | FileCheck %s3 4#SV = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>5 6#trait2 = {7  indexing_maps = [8    affine_map<(i) -> (i)>,  // a9    affine_map<(i) -> (i)>,  // b10    affine_map<(i) -> (i)>   // x (out)11  ],12  iterator_types = ["parallel"],13  doc = "x(i) = a(i) OP b(i)"14}15 16#traitc = {17  indexing_maps = [18    affine_map<(i) -> (i)>,  // a19    affine_map<(i) -> (i)>   // x (out)20  ],21  iterator_types = ["parallel"],22  doc = "x(i) = a(i) OP c"23}24 25// CHECK-LABEL:   func @add(26// CHECK-SAME:              %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,27// CHECK-SAME:              %[[VAL_1:.*]]: tensor<32xi64>,28// CHECK-SAME:              %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {29// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 32 : index30// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 0 : index31// CHECK-DAG:           %[[VAL_5:.*]] = arith.constant true32// CHECK-DAG:           %[[VAL_6:.*]] = arith.constant 1 : index33// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>34// CHECK-DAG:           %[[VAL_8:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>35// CHECK-DAG:           %[[VAL_9:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}>36// CHECK-DAG:           %[[VAL_10:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>37// CHECK-DAG:           %[[VAL_11:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>38// CHECK:           %[[VAL_12:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_4]]] : memref<?xindex>39// CHECK:           %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_6]]] : memref<?xindex>40// CHECK:           %[[VAL_14:.*]]:2 = scf.while (%[[VAL_15:.*]] = %[[VAL_12]], %[[VAL_16:.*]] = %[[VAL_4]]) : (index, index) -> (index, index) {41// CHECK:             %[[VAL_17:.*]] = arith.cmpi ult, %[[VAL_15]], %[[VAL_13]] : index42// CHECK:             scf.condition(%[[VAL_17]]) %[[VAL_15]], %[[VAL_16]] : index, index43// CHECK:           } do {44// CHECK:           ^bb0(%[[VAL_18:.*]]: index, %[[VAL_19:.*]]: index):45// CHECK:             %[[VAL_20:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_18]]] : memref<?xindex>46// CHECK:             %[[VAL_21:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index47// CHECK:             scf.if %[[VAL_21]] {48// CHECK:               %[[VAL_22:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_18]]] : memref<?xi64>49// CHECK:               %[[VAL_23:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>50// CHECK:               %[[VAL_24:.*]] = arith.addi %[[VAL_22]], %[[VAL_23]] : i6451// CHECK:               memref.store %[[VAL_24]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>52// CHECK:             } else {53// CHECK:               scf.if %[[VAL_5]] {54// CHECK:                 %[[VAL_25:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>55// CHECK:                 memref.store %[[VAL_25]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>56// CHECK:               } else {57// CHECK:               }58// CHECK:             }59// CHECK:             %[[VAL_26:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index60// CHECK:             %[[VAL_27:.*]] = arith.addi %[[VAL_18]], %[[VAL_6]] : index61// CHECK:             %[[VAL_28:.*]] = arith.select %[[VAL_26]], %[[VAL_27]], %[[VAL_18]] : index62// CHECK:             %[[VAL_29:.*]] = arith.addi %[[VAL_19]], %[[VAL_6]] : index63// CHECK:             scf.yield %[[VAL_28]], %[[VAL_29]] : index, index64// CHECK:           }65// CHECK:           scf.for %[[VAL_30:.*]] = %[[VAL_31:.*]]#1 to %[[VAL_3]] step %[[VAL_6]] {66// CHECK:             %[[VAL_32:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_30]]] : memref<32xi64>67// CHECK:             memref.store %[[VAL_32]], %[[VAL_11]]{{\[}}%[[VAL_30]]] : memref<32xi64>68// CHECK:           }69// CHECK:           %[[VAL_33:.*]] = bufferization.to_tensor %[[VAL_11]] : memref<32xi64>70// CHECK:           return %[[VAL_33]] : tensor<32xi64>71// CHECK:         }72func.func @add(%arga: tensor<32xi64, #SV>,73               %argb: tensor<32xi64>,74               %argx: tensor<32xi64>) -> tensor<32xi64> {75  %0 = linalg.generic #trait276     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)77    outs(%argx: tensor<32xi64>) {78      ^bb(%a: i64, %b: i64, %x: i64):79        %0 = arith.addi %a, %b : i6480        linalg.yield %0 : i6481  } -> tensor<32xi64>82  return %0 : tensor<32xi64>83}84 85// CHECK-LABEL:   func @sub(86// CHECK-SAME:              %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,87// CHECK-SAME:              %[[VAL_1:.*]]: tensor<32xi64>,88// CHECK-SAME:              %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {89// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 32 : index90// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 0 : index91// CHECK-DAG:           %[[VAL_5:.*]] = arith.constant true92// CHECK-DAG:           %[[VAL_6:.*]] = arith.constant 1 : index93// CHECK-DAG:           %[[VAL_7:.*]] = arith.constant 0 : i6494// CHECK-DAG:           %[[VAL_8:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>95// CHECK-DAG:           %[[VAL_9:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>96// CHECK-DAG:           %[[VAL_10:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}>97// CHECK-DAG:           %[[VAL_11:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>98// CHECK-DAG:           %[[VAL_12:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>99// CHECK:           %[[VAL_13:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_4]]] : memref<?xindex>100// CHECK:           %[[VAL_14:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_6]]] : memref<?xindex>101// CHECK:           %[[VAL_15:.*]]:2 = scf.while (%[[VAL_16:.*]] = %[[VAL_13]], %[[VAL_17:.*]] = %[[VAL_4]]) : (index, index) -> (index, index) {102// CHECK:             %[[VAL_18:.*]] = arith.cmpi ult, %[[VAL_16]], %[[VAL_14]] : index103// CHECK:             scf.condition(%[[VAL_18]]) %[[VAL_16]], %[[VAL_17]] : index, index104// CHECK:           } do {105// CHECK:           ^bb0(%[[VAL_19:.*]]: index, %[[VAL_20:.*]]: index):106// CHECK:             %[[VAL_21:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_19]]] : memref<?xindex>107// CHECK:             %[[VAL_22:.*]] = arith.cmpi eq, %[[VAL_21]], %[[VAL_20]] : index108// CHECK:             scf.if %[[VAL_22]] {109// CHECK:               %[[VAL_23:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<?xi64>110// CHECK:               %[[VAL_24:.*]] = memref.load %[[VAL_11]]{{\[}}%[[VAL_20]]] : memref<32xi64>111// CHECK:               %[[VAL_25:.*]] = arith.subi %[[VAL_23]], %[[VAL_24]] : i64112// CHECK:               memref.store %[[VAL_25]], %[[VAL_12]]{{\[}}%[[VAL_20]]] : memref<32xi64>113// CHECK:             } else {114// CHECK:               scf.if %[[VAL_5]] {115// CHECK:                 %[[VAL_26:.*]] = memref.load %[[VAL_11]]{{\[}}%[[VAL_20]]] : memref<32xi64>116// CHECK:                 %[[VAL_27:.*]] = arith.subi %[[VAL_7]], %[[VAL_26]] : i64117// CHECK:                 memref.store %[[VAL_27]], %[[VAL_12]]{{\[}}%[[VAL_20]]] : memref<32xi64>118// CHECK:               } else {119// CHECK:               }120// CHECK:             }121// CHECK:             %[[VAL_28:.*]] = arith.cmpi eq, %[[VAL_21]], %[[VAL_20]] : index122// CHECK:             %[[VAL_29:.*]] = arith.addi %[[VAL_19]], %[[VAL_6]] : index123// CHECK:             %[[VAL_30:.*]] = arith.select %[[VAL_28]], %[[VAL_29]], %[[VAL_19]] : index124// CHECK:             %[[VAL_31:.*]] = arith.addi %[[VAL_20]], %[[VAL_6]] : index125// CHECK:             scf.yield %[[VAL_30]], %[[VAL_31]] : index, index126// CHECK:           }127// CHECK:           scf.for %[[VAL_32:.*]] = %[[VAL_33:.*]]#1 to %[[VAL_3]] step %[[VAL_6]] {128// CHECK:             %[[VAL_34:.*]] = memref.load %[[VAL_11]]{{\[}}%[[VAL_32]]] : memref<32xi64>129// CHECK:             %[[VAL_35:.*]] = arith.subi %[[VAL_7]], %[[VAL_34]] : i64130// CHECK:             memref.store %[[VAL_35]], %[[VAL_12]]{{\[}}%[[VAL_32]]] : memref<32xi64>131// CHECK:           }132// CHECK:           %[[VAL_36:.*]] = bufferization.to_tensor %[[VAL_12]] : memref<32xi64>133// CHECK:           return %[[VAL_36]] : tensor<32xi64>134// CHECK:         }135func.func @sub(%arga: tensor<32xi64, #SV>,136               %argb: tensor<32xi64>,137               %argx: tensor<32xi64>) -> tensor<32xi64> {138  %0 = linalg.generic #trait2139     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)140    outs(%argx: tensor<32xi64>) {141      ^bb(%a: i64, %b: i64, %x: i64):142        %0 = arith.subi %a, %b : i64143        linalg.yield %0 : i64144  } -> tensor<32xi64>145  return %0 : tensor<32xi64>146}147 148// CHECK-LABEL:   func @mul(149// CHECK-SAME:              %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,150// CHECK-SAME:              %[[VAL_1:.*]]: tensor<32xi64>,151// CHECK-SAME:              %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {152// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index153// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index154// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>155// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>156// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}>157// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>158// CHECK-DAG:           %[[VAL_9:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>159// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>160// CHECK:           %[[VAL_11:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>161// CHECK:           scf.for %[[VAL_12:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_4]] {162// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_12]]] : memref<?xindex>163// CHECK:             %[[VAL_14:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_12]]] : memref<?xi64>164// CHECK:             %[[VAL_15:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_13]]] : memref<32xi64>165// CHECK:             %[[VAL_16:.*]] = arith.muli %[[VAL_14]], %[[VAL_15]] : i64166// CHECK:             memref.store %[[VAL_16]], %[[VAL_9]]{{\[}}%[[VAL_13]]] : memref<32xi64>167// CHECK:           }168// CHECK:           %[[VAL_17:.*]] = bufferization.to_tensor %[[VAL_9]] : memref<32xi64>169// CHECK:           return %[[VAL_17]] : tensor<32xi64>170// CHECK:         }171func.func @mul(%arga: tensor<32xi64, #SV>,172               %argb: tensor<32xi64>,173               %argx: tensor<32xi64>) -> tensor<32xi64> {174  %0 = linalg.generic #trait2175     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)176    outs(%argx: tensor<32xi64>) {177      ^bb(%a: i64, %b: i64, %x: i64):178        %0 = arith.muli %a, %b : i64179        linalg.yield %0 : i64180  } -> tensor<32xi64>181  return %0 : tensor<32xi64>182}183 184// CHECK-LABEL:   func @divsbyc(185// CHECK-SAME:                  %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,186// CHECK-SAME:                  %[[VAL_1:.*]]: tensor<32xi64>) -> tensor<32xi64> {187// CHECK-DAG:           %[[VAL_2:.*]] = arith.constant 2 : i64188// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index189// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index190// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>191// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>192// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}>193// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>194// CHECK:           %[[VAL_9:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>195// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>196// CHECK:           scf.for %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_4]] {197// CHECK:             %[[VAL_12:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_11]]] : memref<?xindex>198// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_11]]] : memref<?xi64>199// CHECK:             %[[VAL_14:.*]] = arith.divsi %[[VAL_13]], %[[VAL_2]] : i64200// CHECK:             memref.store %[[VAL_14]], %[[VAL_8]]{{\[}}%[[VAL_12]]] : memref<32xi64>201// CHECK:           }202// CHECK:           %[[VAL_15:.*]] = bufferization.to_tensor %[[VAL_8]] : memref<32xi64>203// CHECK:           return %[[VAL_15]] : tensor<32xi64>204// CHECK:         }205func.func @divsbyc(%arga: tensor<32xi64, #SV>,206                   %argx: tensor<32xi64>) -> tensor<32xi64> {207  %c = arith.constant 2 : i64208  %0 = linalg.generic #traitc209     ins(%arga: tensor<32xi64, #SV>)210    outs(%argx: tensor<32xi64>) {211      ^bb(%a: i64, %x: i64):212        %0 = arith.divsi %a, %c : i64213        linalg.yield %0 : i64214  } -> tensor<32xi64>215  return %0 : tensor<32xi64>216}217 218// CHECK-LABEL:   func @divubyc(219// CHECK-SAME:                  %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,220// CHECK-SAME:                  %[[VAL_1:.*]]: tensor<32xi64>) -> tensor<32xi64> {221// CHECK-DAG:           %[[VAL_2:.*]] = arith.constant 2 : i64222// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index223// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index224// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>225// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}>226// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}>227// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>228// CHECK:           %[[VAL_9:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>229// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>230// CHECK:           scf.for %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_4]] {231// CHECK:             %[[VAL_12:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_11]]] : memref<?xindex>232// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_11]]] : memref<?xi64>233// CHECK:             %[[VAL_14:.*]] = arith.divui %[[VAL_13]], %[[VAL_2]] : i64234// CHECK:             memref.store %[[VAL_14]], %[[VAL_8]]{{\[}}%[[VAL_12]]] : memref<32xi64>235// CHECK:           }236// CHECK:           %[[VAL_15:.*]] = bufferization.to_tensor %[[VAL_8]] : memref<32xi64>237// CHECK:           return %[[VAL_15]] : tensor<32xi64>238// CHECK:         }239func.func @divubyc(%arga: tensor<32xi64, #SV>,240                   %argx: tensor<32xi64>) -> tensor<32xi64> {241  %c = arith.constant 2 : i64242  %0 = linalg.generic #traitc243     ins(%arga: tensor<32xi64, #SV>)244    outs(%argx: tensor<32xi64>) {245      ^bb(%a: i64, %x: i64):246        %0 = arith.divui %a, %c : i64247        linalg.yield %0 : i64248  } -> tensor<32xi64>249  return %0 : tensor<32xi64>250}251 252// CHECK-LABEL:   func @and(253// CHECK-SAME:              %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,254// CHECK-SAME:              %[[VAL_1:.*]]: tensor<32xi64>,255// CHECK-SAME:              %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {256// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index257// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index258// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>259// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>260// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>261// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>262// CHECK-DAG:           %[[VAL_9:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>263// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>264// CHECK:           %[[VAL_11:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>265// CHECK:           scf.for %[[VAL_12:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_4]] {266// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_12]]] : memref<?xindex>267// CHECK:             %[[VAL_14:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_12]]] : memref<?xi64>268// CHECK:             %[[VAL_15:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_13]]] : memref<32xi64>269// CHECK:             %[[VAL_16:.*]] = arith.andi %[[VAL_14]], %[[VAL_15]] : i64270// CHECK:             memref.store %[[VAL_16]], %[[VAL_9]]{{\[}}%[[VAL_13]]] : memref<32xi64>271// CHECK:           }272// CHECK:           %[[VAL_17:.*]] = bufferization.to_tensor %[[VAL_9]] : memref<32xi64>273// CHECK:           return %[[VAL_17]] : tensor<32xi64>274// CHECK:         }275func.func @and(%arga: tensor<32xi64, #SV>,276               %argb: tensor<32xi64>,277               %argx: tensor<32xi64>) -> tensor<32xi64> {278  %0 = linalg.generic #trait2279     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)280    outs(%argx: tensor<32xi64>) {281      ^bb(%a: i64, %b: i64, %x: i64):282        %0 = arith.andi %a, %b : i64283        linalg.yield %0 : i64284  } -> tensor<32xi64>285  return %0 : tensor<32xi64>286}287 288// CHECK-LABEL:   func @or(289// CHECK-SAME:             %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,290// CHECK-SAME:             %[[VAL_1:.*]]: tensor<32xi64>,291// CHECK-SAME:             %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {292// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 32 : index293// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 0 : index294// CHECK-DAG:           %[[VAL_5:.*]] = arith.constant true295// CHECK-DAG:           %[[VAL_6:.*]] = arith.constant 1 : index296// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>297// CHECK-DAG:           %[[VAL_8:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>298// CHECK-DAG:           %[[VAL_9:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>299// CHECK-DAG:           %[[VAL_10:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>300// CHECK-DAG:           %[[VAL_11:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>301// CHECK:           %[[VAL_12:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_4]]] : memref<?xindex>302// CHECK:           %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_6]]] : memref<?xindex>303// CHECK:           %[[VAL_14:.*]]:2 = scf.while (%[[VAL_15:.*]] = %[[VAL_12]], %[[VAL_16:.*]] = %[[VAL_4]]) : (index, index) -> (index, index) {304// CHECK:             %[[VAL_17:.*]] = arith.cmpi ult, %[[VAL_15]], %[[VAL_13]] : index305// CHECK:             scf.condition(%[[VAL_17]]) %[[VAL_15]], %[[VAL_16]] : index, index306// CHECK:           } do {307// CHECK:           ^bb0(%[[VAL_18:.*]]: index, %[[VAL_19:.*]]: index):308// CHECK:             %[[VAL_20:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_18]]] : memref<?xindex>309// CHECK:             %[[VAL_21:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index310// CHECK:             scf.if %[[VAL_21]] {311// CHECK:               %[[VAL_22:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_18]]] : memref<?xi64>312// CHECK:               %[[VAL_23:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>313// CHECK:               %[[VAL_24:.*]] = arith.ori %[[VAL_22]], %[[VAL_23]] : i64314// CHECK:               memref.store %[[VAL_24]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>315// CHECK:             } else {316// CHECK:               scf.if %[[VAL_5]] {317// CHECK:                 %[[VAL_25:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>318// CHECK:                 memref.store %[[VAL_25]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>319// CHECK:               } else {320// CHECK:               }321// CHECK:             }322// CHECK:             %[[VAL_26:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index323// CHECK:             %[[VAL_27:.*]] = arith.addi %[[VAL_18]], %[[VAL_6]] : index324// CHECK:             %[[VAL_28:.*]] = arith.select %[[VAL_26]], %[[VAL_27]], %[[VAL_18]] : index325// CHECK:             %[[VAL_29:.*]] = arith.addi %[[VAL_19]], %[[VAL_6]] : index326// CHECK:             scf.yield %[[VAL_28]], %[[VAL_29]] : index, index327// CHECK:           }328// CHECK:           scf.for %[[VAL_30:.*]] = %[[VAL_31:.*]]#1 to %[[VAL_3]] step %[[VAL_6]] {329// CHECK:             %[[VAL_32:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_30]]] : memref<32xi64>330// CHECK:             memref.store %[[VAL_32]], %[[VAL_11]]{{\[}}%[[VAL_30]]] : memref<32xi64>331// CHECK:           }332// CHECK:           %[[VAL_33:.*]] = bufferization.to_tensor %[[VAL_11]] : memref<32xi64>333// CHECK:           return %[[VAL_33]] : tensor<32xi64>334// CHECK:         }335func.func @or(%arga: tensor<32xi64, #SV>,336              %argb: tensor<32xi64>,337              %argx: tensor<32xi64>) -> tensor<32xi64> {338  %0 = linalg.generic #trait2339     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)340    outs(%argx: tensor<32xi64>) {341      ^bb(%a: i64, %b: i64, %x: i64):342        %0 = arith.ori %a, %b : i64343        linalg.yield %0 : i64344  } -> tensor<32xi64>345  return %0 : tensor<32xi64>346}347 348// CHECK-LABEL:   func @xor(349// CHECK-SAME:             %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,350// CHECK-SAME:             %[[VAL_1:.*]]: tensor<32xi64>,351// CHECK-SAME:             %[[VAL_2:.*]]: tensor<32xi64>) -> tensor<32xi64> {352// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 32 : index353// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 0 : index354// CHECK-DAG:           %[[VAL_5:.*]] = arith.constant true355// CHECK-DAG:           %[[VAL_6:.*]] = arith.constant 1 : index356// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>357// CHECK-DAG:           %[[VAL_8:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>358// CHECK-DAG:           %[[VAL_9:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>359// CHECK-DAG:           %[[VAL_10:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>360// CHECK-DAG:           %[[VAL_11:.*]] = bufferization.to_buffer %[[VAL_2]] : tensor<32xi64> to memref<32xi64>361// CHECK:           %[[VAL_12:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_4]]] : memref<?xindex>362// CHECK:           %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_6]]] : memref<?xindex>363// CHECK:           %[[VAL_14:.*]]:2 = scf.while (%[[VAL_15:.*]] = %[[VAL_12]], %[[VAL_16:.*]] = %[[VAL_4]]) : (index, index) -> (index, index) {364// CHECK:             %[[VAL_17:.*]] = arith.cmpi ult, %[[VAL_15]], %[[VAL_13]] : index365// CHECK:             scf.condition(%[[VAL_17]]) %[[VAL_15]], %[[VAL_16]] : index, index366// CHECK:           } do {367// CHECK:           ^bb0(%[[VAL_18:.*]]: index, %[[VAL_19:.*]]: index):368// CHECK:             %[[VAL_20:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_18]]] : memref<?xindex>369// CHECK:             %[[VAL_21:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index370// CHECK:             scf.if %[[VAL_21]] {371// CHECK:               %[[VAL_22:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_18]]] : memref<?xi64>372// CHECK:               %[[VAL_23:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>373// CHECK:               %[[VAL_24:.*]] = arith.xori %[[VAL_22]], %[[VAL_23]] : i64374// CHECK:               memref.store %[[VAL_24]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>375// CHECK:             } else {376// CHECK:               scf.if %[[VAL_5]] {377// CHECK:                 %[[VAL_25:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_19]]] : memref<32xi64>378// CHECK:                 memref.store %[[VAL_25]], %[[VAL_11]]{{\[}}%[[VAL_19]]] : memref<32xi64>379// CHECK:               } else {380// CHECK:               }381// CHECK:             }382// CHECK:             %[[VAL_26:.*]] = arith.cmpi eq, %[[VAL_20]], %[[VAL_19]] : index383// CHECK:             %[[VAL_27:.*]] = arith.addi %[[VAL_18]], %[[VAL_6]] : index384// CHECK:             %[[VAL_28:.*]] = arith.select %[[VAL_26]], %[[VAL_27]], %[[VAL_18]] : index385// CHECK:             %[[VAL_29:.*]] = arith.addi %[[VAL_19]], %[[VAL_6]] : index386// CHECK:             scf.yield %[[VAL_28]], %[[VAL_29]] : index, index387// CHECK:           }388// CHECK:           scf.for %[[VAL_30:.*]] = %[[VAL_31:.*]]#1 to %[[VAL_3]] step %[[VAL_6]] {389// CHECK:             %[[VAL_32:.*]] = memref.load %[[VAL_10]]{{\[}}%[[VAL_30]]] : memref<32xi64>390// CHECK:             memref.store %[[VAL_32]], %[[VAL_11]]{{\[}}%[[VAL_30]]] : memref<32xi64>391// CHECK:           }392// CHECK:           %[[VAL_33:.*]] = bufferization.to_tensor %[[VAL_11]] : memref<32xi64>393// CHECK:           return %[[VAL_33]] : tensor<32xi64>394// CHECK:         }395func.func @xor(%arga: tensor<32xi64, #SV>,396               %argb: tensor<32xi64>,397               %argx: tensor<32xi64>) -> tensor<32xi64> {398  %0 = linalg.generic #trait2399     ins(%arga, %argb: tensor<32xi64, #SV>, tensor<32xi64>)400    outs(%argx: tensor<32xi64>) {401      ^bb(%a: i64, %b: i64, %x: i64):402        %0 = arith.xori %a, %b : i64403        linalg.yield %0 : i64404  } -> tensor<32xi64>405  return %0 : tensor<32xi64>406}407 408// CHECK-LABEL:   func @ashrbyc(409// CHECK-SAME:                  %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,410// CHECK-SAME:                  %[[VAL_1:.*]]: tensor<32xi64>) -> tensor<32xi64> {411// CHECK-DAG:           %[[VAL_2:.*]] = arith.constant 2 : i64412// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index413// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index414// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>415// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>416// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>417// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>418// CHECK:           %[[VAL_9:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>419// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>420// CHECK:           scf.for %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_4]] {421// CHECK:             %[[VAL_12:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_11]]] : memref<?xindex>422// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_11]]] : memref<?xi64>423// CHECK:             %[[VAL_14:.*]] = arith.shrsi %[[VAL_13]], %[[VAL_2]] : i64424// CHECK:             memref.store %[[VAL_14]], %[[VAL_8]]{{\[}}%[[VAL_12]]] : memref<32xi64>425// CHECK:           }426// CHECK:           %[[VAL_15:.*]] = bufferization.to_tensor %[[VAL_8]] : memref<32xi64>427// CHECK:           return %[[VAL_15]] : tensor<32xi64>428// CHECK:         }429func.func @ashrbyc(%arga: tensor<32xi64, #SV>,430                   %argx: tensor<32xi64>) -> tensor<32xi64> {431  %c = arith.constant 2 : i64432  %0 = linalg.generic #traitc433     ins(%arga: tensor<32xi64, #SV>)434    outs(%argx: tensor<32xi64>) {435      ^bb(%a: i64, %x: i64):436        %0 = arith.shrsi %a, %c : i64437        linalg.yield %0 : i64438  } -> tensor<32xi64>439  return %0 : tensor<32xi64>440}441 442// CHECK-LABEL:   func @lsrbyc(443// CHECK-SAME:                 %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,444// CHECK-SAME:                 %[[VAL_1:.*]]: tensor<32xi64>) -> tensor<32xi64> {445// CHECK-DAG:           %[[VAL_2:.*]] = arith.constant 2 : i64446// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index447// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index448// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>449// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>450// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>451// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>452// CHECK:           %[[VAL_9:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>453// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>454// CHECK:           scf.for %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_4]] {455// CHECK:             %[[VAL_12:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_11]]] : memref<?xindex>456// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_11]]] : memref<?xi64>457// CHECK:             %[[VAL_14:.*]] = arith.shrui %[[VAL_13]], %[[VAL_2]] : i64458// CHECK:             memref.store %[[VAL_14]], %[[VAL_8]]{{\[}}%[[VAL_12]]] : memref<32xi64>459// CHECK:           }460// CHECK:           %[[VAL_15:.*]] = bufferization.to_tensor %[[VAL_8]] : memref<32xi64>461// CHECK:           return %[[VAL_15]] : tensor<32xi64>462// CHECK:         }463func.func @lsrbyc(%arga: tensor<32xi64, #SV>,464                  %argx: tensor<32xi64>) -> tensor<32xi64> {465  %c = arith.constant 2 : i64466  %0 = linalg.generic #traitc467     ins(%arga: tensor<32xi64, #SV>)468    outs(%argx: tensor<32xi64>) {469      ^bb(%a: i64, %x: i64):470        %0 = arith.shrui %a, %c : i64471        linalg.yield %0 : i64472  } -> tensor<32xi64>473  return %0 : tensor<32xi64>474}475 476// CHECK-LABEL:   func @lslbyc(477// CHECK-SAME:                 %[[VAL_0:.*]]: tensor<32xi64, #sparse{{[0-9]*}}>,478// CHECK-SAME:                 %[[VAL_1:.*]]: tensor<32xi64>) -> tensor<32xi64> {479// CHECK-DAG:           %[[VAL_2:.*]] = arith.constant 2 : i64480// CHECK-DAG:           %[[VAL_3:.*]] = arith.constant 0 : index481// CHECK-DAG:           %[[VAL_4:.*]] = arith.constant 1 : index482// CHECK-DAG:           %[[VAL_5:.*]] = sparse_tensor.positions %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>483// CHECK-DAG:           %[[VAL_6:.*]] = sparse_tensor.coordinates %[[VAL_0]] {level = 0 : index} : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xindex>484// CHECK-DAG:           %[[VAL_7:.*]] = sparse_tensor.values %[[VAL_0]] : tensor<32xi64, #sparse{{[0-9]*}}> to memref<?xi64>485// CHECK-DAG:           %[[VAL_8:.*]] = bufferization.to_buffer %[[VAL_1]] : tensor<32xi64> to memref<32xi64>486// CHECK:           %[[VAL_9:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<?xindex>487// CHECK:           %[[VAL_10:.*]] = memref.load %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<?xindex>488// CHECK:           scf.for %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_4]] {489// CHECK:             %[[VAL_12:.*]] = memref.load %[[VAL_6]]{{\[}}%[[VAL_11]]] : memref<?xindex>490// CHECK:             %[[VAL_13:.*]] = memref.load %[[VAL_7]]{{\[}}%[[VAL_11]]] : memref<?xi64>491// CHECK:             %[[VAL_14:.*]] = arith.shli %[[VAL_13]], %[[VAL_2]] : i64492// CHECK:             memref.store %[[VAL_14]], %[[VAL_8]]{{\[}}%[[VAL_12]]] : memref<32xi64>493// CHECK:           }494// CHECK:           %[[VAL_15:.*]] = bufferization.to_tensor %[[VAL_8]] : memref<32xi64>495// CHECK:           return %[[VAL_15]] : tensor<32xi64>496// CHECK:         }497func.func @lslbyc(%arga: tensor<32xi64, #SV>,498                  %argx: tensor<32xi64>) -> tensor<32xi64> {499  %c = arith.constant 2 : i64500  %0 = linalg.generic #traitc501     ins(%arga: tensor<32xi64, #SV>)502    outs(%argx: tensor<32xi64>) {503      ^bb(%a: i64, %x: i64):504        %0 = arith.shli %a, %c : i64505        linalg.yield %0 : i64506  } -> tensor<32xi64>507  return %0 : tensor<32xi64>508}509