canonicalize.mlir 1006 Bytes
// RUN: mlir-opt -pass-pipeline='func(canonicalize)' %s | FileCheck %s

// CHECK-LABEL: @propagate_constant
// CHECK-SAME:  %[[arg1:.*]]: memref
func @propagate_constant(%arg1: memref<?xf32>) {
  // The outer constant must be preserved because it still has uses.
  // CHECK: %[[outer_cst:.*]] = constant 1
  %c1 = constant 1 : index

  // The constant must be dropped from the args list, but the memref should
  // remain.
  // CHECK: gpu.launch
  // CHECK-SAME: args(%[[inner_arg:.*]] = %[[arg1]]) : memref
  gpu.launch blocks(%bx, %by, %bz) in (%sbx = %c1, %sby = %c1, %sbz = %c1)
             threads(%tx, %ty, %tz) in (%stx = %c1, %sty = %c1, %stz = %c1)
             args(%x = %c1, %y = %arg1) : index, memref<?xf32> {
    // The constant is propagated into the kernel body and used.
    // CHECK: %[[inner_cst:.*]] = constant 1
    // CHECK: "foo"(%[[inner_cst]])
    "foo"(%x) : (index) -> ()

    // CHECK: "bar"(%[[inner_arg]])
    "bar"(%y) : (memref<?xf32>) -> ()
    gpu.return
  }
  return
}