108 lines · plain
1// RUN: mlir-opt --expand-realloc %s --split-input-file --verify-diagnostics | FileCheck %s2// RUN: mlir-opt --expand-realloc=emit-deallocs=false %s --split-input-file --verify-diagnostics | FileCheck %s --check-prefix=NODEALLOC3 4func.func @reallow_lowering_example(%init_size: index, %new_size: index) -> memref<?xf32> {5 %alloc = memref.alloc(%init_size) : memref<?xf32>6 %realloc = memref.realloc %alloc (%new_size) {alignment = 8}: memref<?xf32> to memref<?xf32>7 return %realloc : memref<?xf32>8}9 10// CHECK-LABEL: func @reallow_lowering_example11// CHECK-SAME: ([[INIT_SIZE:%.+]]: index, [[NEW_SIZE:%.+]]: index)12// CHECK-NEXT: [[OLD_ALLOC:%.+]] = memref.alloc([[INIT_SIZE]]) : memref<?xf32>13// CHECK-NEXT: [[C0:%.+]] = arith.constant 014// CHECK-NEXT: [[CURR_SIZE:%.+]] = memref.dim [[OLD_ALLOC]], [[C0]]15// CHECK-NEXT: [[COND:%.+]] = arith.cmpi ult, [[CURR_SIZE]], [[NEW_SIZE]]16// CHECK-NEXT: [[REALLOC:%.+]] = scf.if [[COND]]17// CHECK-NEXT: [[NEW_ALLOC:%.+]] = memref.alloc([[NEW_SIZE]]) {alignment = 8 : i64} : memref<?xf32>18// CHECK-NEXT: [[SUBVIEW:%.+]] = memref.subview [[NEW_ALLOC]][0] [[[CURR_SIZE]]] [1]19// CHECK-NEXT: memref.copy [[OLD_ALLOC]], [[SUBVIEW]]20// CHECK-NEXT: memref.dealloc [[OLD_ALLOC]]21// CHECK-NEXT: scf.yield [[NEW_ALLOC]]22// CHECK: [[CAST:%.+]] = memref.reinterpret_cast [[OLD_ALLOC]] to offset: [0], sizes: [[[NEW_SIZE]]], strides: [1] : memref<?xf32> to memref<?xf32>23// CHECK-NEXT: scf.yield [[CAST]]24// CHECK: return [[REALLOC]]25 26// NODEALLOC-LABEL: func @reallow_lowering_example27// NODEALLOC-NOT: dealloc28 29// -----30 31func.func @reallow_lowering_example() -> memref<4xf32> {32 %alloc = memref.alloc() : memref<2xf32>33 %realloc = memref.realloc %alloc {alignment = 8}: memref<2xf32> to memref<4xf32>34 return %realloc : memref<4xf32>35}36 37// CHECK-LABEL: func @reallow_lowering_example38// CHECK-NEXT: [[OLD_ALLOC:%.+]] = memref.alloc() : memref<2xf32>39// CHECK-NEXT: [[CURR_SIZE:%.+]] = arith.constant 240// CHECK-NEXT: [[NEW_SIZE:%.+]] = arith.constant 441// CHECK-NEXT: [[COND:%.+]] = arith.cmpi ult, [[CURR_SIZE]], [[NEW_SIZE]]42// CHECK-NEXT: [[REALLOC:%.+]] = scf.if [[COND]]43// CHECK-NEXT: [[NEW_ALLOC:%.+]] = memref.alloc() {alignment = 8 : i64} : memref<4xf32>44// CHECK-NEXT: [[SUBVIEW:%.+]] = memref.subview [[NEW_ALLOC]][0] [2] [1]45// CHECK-NEXT: memref.copy [[OLD_ALLOC]], [[SUBVIEW]]46// CHECK-NEXT: memref.dealloc [[OLD_ALLOC]]47// CHECK-NEXT: scf.yield [[NEW_ALLOC]]48// CHECK: [[CAST:%.+]] = memref.reinterpret_cast [[OLD_ALLOC]] to offset: [0], sizes: [4], strides: [1] : memref<2xf32> to memref<4xf32>49// CHECK-NEXT: scf.yield [[CAST]]50// CHECK: return [[REALLOC]]51 52// NODEALLOC-LABEL: func @reallow_lowering_example53// NODEALLOC-NOT: dealloc54 55// -----56 57func.func @reallow_lowering_example(%init_size: index) -> memref<4xf32> {58 %alloc = memref.alloc(%init_size) : memref<?xf32>59 %realloc = memref.realloc %alloc : memref<?xf32> to memref<4xf32>60 return %realloc : memref<4xf32>61}62 63// CHECK-LABEL: func @reallow_lowering_example64// CHECK-SAME: ([[INIT_SIZE:%.+]]: index)65// CHECK-NEXT: [[OLD_ALLOC:%.+]] = memref.alloc([[INIT_SIZE]]) : memref<?xf32>66// CHECK-NEXT: [[C0:%.+]] = arith.constant 067// CHECK-NEXT: [[CURR_SIZE:%.+]] = memref.dim [[OLD_ALLOC]], [[C0]]68// CHECK-NEXT: [[NEW_SIZE:%.+]] = arith.constant 469// CHECK-NEXT: [[COND:%.+]] = arith.cmpi ult, [[CURR_SIZE]], [[NEW_SIZE]]70// CHECK-NEXT: [[REALLOC:%.+]] = scf.if [[COND]]71// CHECK-NEXT: [[NEW_ALLOC:%.+]] = memref.alloc() : memref<4xf32>72// CHECK-NEXT: [[SUBVIEW:%.+]] = memref.subview [[NEW_ALLOC]][0] [[[CURR_SIZE]]] [1]73// CHECK-NEXT: memref.copy [[OLD_ALLOC]], [[SUBVIEW]]74// CHECK-NEXT: memref.dealloc [[OLD_ALLOC]]75// CHECK-NEXT: scf.yield [[NEW_ALLOC]]76// CHECK: [[CAST:%.+]] = memref.reinterpret_cast [[OLD_ALLOC]] to offset: [0], sizes: [4], strides: [1] : memref<?xf32> to memref<4xf32>77// CHECK-NEXT: scf.yield [[CAST]]78// CHECK: return [[REALLOC]]79 80// NODEALLOC-LABEL: func @reallow_lowering_example81// NODEALLOC-NOT: dealloc82 83// -----84 85func.func @reallow_lowering_example(%new_size: index) -> memref<?xf32> {86 %alloc = memref.alloc() : memref<2xf32>87 %realloc = memref.realloc %alloc(%new_size) : memref<2xf32> to memref<?xf32>88 return %realloc : memref<?xf32>89}90 91// CHECK-LABEL: func @reallow_lowering_example92// CHECK-SAME: ([[NEW_SIZE:%.+]]: index)93// CHECK-NEXT: [[OLD_ALLOC:%.+]] = memref.alloc() : memref<2xf32>94// CHECK-NEXT: [[CURR_SIZE:%.+]] = arith.constant 295// CHECK-NEXT: [[COND:%.+]] = arith.cmpi ult, [[CURR_SIZE]], [[NEW_SIZE]]96// CHECK-NEXT: [[REALLOC:%.+]] = scf.if [[COND]]97// CHECK-NEXT: [[NEW_ALLOC:%.+]] = memref.alloc([[NEW_SIZE]]) : memref<?xf32>98// CHECK-NEXT: [[SUBVIEW:%.+]] = memref.subview [[NEW_ALLOC]][0] [2] [1]99// CHECK-NEXT: memref.copy [[OLD_ALLOC]], [[SUBVIEW]]100// CHECK-NEXT: memref.dealloc [[OLD_ALLOC]]101// CHECK-NEXT: scf.yield [[NEW_ALLOC]]102// CHECK: [[CAST:%.+]] = memref.reinterpret_cast [[OLD_ALLOC]] to offset: [0], sizes: [[[NEW_SIZE]]], strides: [1] : memref<2xf32> to memref<?xf32>103// CHECK-NEXT: scf.yield [[CAST]]104// CHECK: return [[REALLOC]]105 106// NODEALLOC-LABEL: func @reallow_lowering_example107// NODEALLOC-NOT: dealloc108