blob: d401790d6171f7bae55d444d9e45b6025fa7755e [file] [edit]
// RUN: %eopt --print-activity-analysis="dataflow=false annotate=true" %s --split-input-file 2>&1 | FileCheck %s
// A view's activity depends on its source, not the memory containing its shape.
// CHECK-LABEL: func.func @inactive_reshape(
// CHECK: memref.reshape {{.*}}enzyme.ici = true, enzyme.res_icv0 = true
// CHECK: memref.load {{.*}}enzyme.ici = true, enzyme.res_icv0 = true
func.func @inactive_reshape(%source: memref<4xf64> {enzyme.const}, %shape: memref<2xindex>) -> f64 {
%view = memref.reshape %source(%shape) : (memref<4xf64>, memref<2xindex>) -> memref<?x?xf64>
%c0 = arith.constant 0 : index
%value = memref.load %view[%c0, %c0] : memref<?x?xf64>
return %value : f64
}
// -----
// CHECK-LABEL: func.func @active_reshape(
// CHECK: memref.reshape {{.*}}enzyme.ici = false, enzyme.res_icv0 = false
// CHECK: memref.load {{.*}}enzyme.ici = false, enzyme.res_icv0 = false
func.func @active_reshape(%source: memref<4xf64>, %shape: memref<2xindex> {enzyme.const}) -> f64 {
%view = memref.reshape %source(%shape) : (memref<4xf64>, memref<2xindex>) -> memref<?x?xf64>
%c0 = arith.constant 0 : index
%value = memref.load %view[%c0, %c0] : memref<?x?xf64>
return %value : f64
}
// -----
// Follow a nonzero-offset view to its allocation when checking memory activity.
// CHECK-LABEL: func.func @view_of_allocation(
// CHECK: memref.subview {{.*}}enzyme.ici = false, enzyme.res_icv0 = false
// CHECK: memref.load {{.*}}enzyme.ici = false, enzyme.res_icv0 = false
func.func @view_of_allocation(%value: f64) -> f64 {
%source = memref.alloca() : memref<4xf64>
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
memref.store %value, %source[%c1] : memref<4xf64>
%view = memref.subview %source[1] [2] [1] : memref<4xf64> to memref<2xf64, strided<[1], offset: 1>>
%result = memref.load %view[%c0] : memref<2xf64, strided<[1], offset: 1>>
return %result : f64
}