brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · b98d00a Raw
131 lines · plain
1// RUN: mlir-opt -allow-unregistered-dialect %s -inline="default-pipeline=''" | FileCheck %s2 3// Basic test that functions within affine operations are inlined.4func.func @func_with_affine_ops(%N: index) {5  %c = arith.constant 200 : index6  affine.for %i = 1 to 10 {7    affine.if affine_set<(i)[N] : (i - 2 >= 0, 4 - i >= 0)>(%i)[%c]  {8      %w = affine.apply affine_map<(d0,d1)[s0] -> (d0+d1+s0)> (%i, %i) [%N]9    }10  }11  return12}13 14// CHECK-LABEL: func @inline_with_affine_ops15func.func @inline_with_affine_ops() {16  %c = arith.constant 1 : index17 18  // CHECK: affine.for19  // CHECK-NEXT: affine.if20  // CHECK-NEXT: affine.apply21  // CHECK-NOT: call22  call @func_with_affine_ops(%c) : (index) -> ()23  return24}25 26// CHECK-LABEL: func @not_inline_in_affine_op27func.func @not_inline_in_affine_op() {28  %c = arith.constant 1 : index29 30  // CHECK-NOT: affine.if31  // CHECK: call32  affine.for %i = 1 to 10 {33    func.call @func_with_affine_ops(%c) : (index) -> ()34  }35  return36}37 38// -----39 40// Test when an invalid operation is nested in an affine op.41func.func @func_with_invalid_nested_op() {42  affine.for %i = 1 to 10 {43    "foo.opaque"() : () -> ()44  }45  return46}47 48// CHECK-LABEL: func @not_inline_invalid_nest_op49func.func @not_inline_invalid_nest_op() {50  // CHECK: call @func_with_invalid_nested_op51  call @func_with_invalid_nested_op() : () -> ()52  return53}54 55// -----56 57// Test that calls are inlined into affine structures.58func.func @func_noop() {59  return60}61 62// CHECK-LABEL: func @inline_into_affine_ops63func.func @inline_into_affine_ops() {64  // CHECK-NOT: call @func_noop65  affine.for %i = 1 to 10 {66    func.call @func_noop() : () -> ()67  }68  return69}70 71// -----72 73// Test that calls with dimension arguments are properly inlined.74func.func @func_dim(%arg0: index, %arg1: memref<?xf32>) {75  affine.load %arg1[%arg0] : memref<?xf32>76  return77}78 79// CHECK-LABEL: @inline_dimension80// CHECK: (%[[ARG0:.*]]: memref<?xf32>)81func.func @inline_dimension(%arg0: memref<?xf32>) {82  // CHECK: affine.for %[[IV:.*]] =83  affine.for %i = 1 to 42 {84    // CHECK-NOT: call @func_dim85    // CHECK: affine.load %[[ARG0]][%[[IV]]]86    func.call @func_dim(%i, %arg0) : (index, memref<?xf32>) -> ()87  }88  return89}90 91// -----92 93// Test that calls with vector operations are also inlined.94func.func @func_vector_dim(%arg0: index, %arg1: memref<32xf32>) {95  affine.vector_load %arg1[%arg0] : memref<32xf32>, vector<4xf32>96  return97}98 99// CHECK-LABEL: @inline_dimension_vector100// CHECK: (%[[ARG0:.*]]: memref<32xf32>)101func.func @inline_dimension_vector(%arg0: memref<32xf32>) {102  // CHECK: affine.for %[[IV:.*]] =103  affine.for %i = 1 to 42 {104    // CHECK-NOT: call @func_dim105    // CHECK: affine.vector_load %[[ARG0]][%[[IV]]]106    func.call @func_vector_dim(%i, %arg0) : (index, memref<32xf32>) -> ()107  }108  return109}110 111// -----112 113// Test that calls that would result in violation of affine value114// categorization (top-level value stop being top-level) are not inlined.115func.func private @get_index() -> index116 117func.func @func_top_level(%arg0: memref<?xf32>) {118  %0 = call @get_index() : () -> index119  affine.load %arg0[%0] : memref<?xf32>120  return121}122 123// CHECK-LABEL: @no_inline_not_top_level124func.func @no_inline_not_top_level(%arg0: memref<?xf32>) {125  affine.for %i = 1 to 42 {126    // CHECK: call @func_top_level127    func.call @func_top_level(%arg0) : (memref<?xf32>) -> ()128  }129  return130}131