test-liveness.mlir 5.1 KB
// RUN: mlir-opt %s -test-print-liveness -split-input-file 2>&1 | FileCheck %s --dump-input-on-failure

// CHECK-LABEL: Testing : func_empty
func @func_empty() {
  // CHECK: Block: 0
  // CHECK-NEXT: LiveIn:{{ *$}}
  // CHECK-NEXT: LiveOut:{{ *$}}
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: EndLiveness
  return
}

// -----

// CHECK-LABEL: Testing : func_simpleBranch
func @func_simpleBranch(%arg0: i32, %arg1 : i32) -> i32 {
  // CHECK: Block: 0
  // CHECK-NEXT: LiveIn:{{ *$}}
  // CHECK-NEXT: LiveOut: arg0@0 arg1@0
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: EndLiveness
  br ^exit
^exit:
  // CHECK: Block: 1
  // CHECK-NEXT: LiveIn: arg0@0 arg1@0
  // CHECK-NEXT: LiveOut:{{ *$}}
  // CHECK-NEXT: BeginLiveness
  // CHECK: val_std.addi
  // CHECK-NEXT:     %0 = addi
  // CHECK-NEXT:     return
  // CHECK-NEXT: EndLiveness
  %result = addi %arg0, %arg1 : i32
  return %result : i32
}

// -----

// CHECK-LABEL: Testing : func_condBranch
func @func_condBranch(%cond : i1, %arg1: i32, %arg2 : i32) -> i32 {
  // CHECK: Block: 0
  // CHECK-NEXT: LiveIn:{{ *$}}
  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: EndLiveness
  cond_br %cond, ^bb1, ^bb2
^bb1:
  // CHECK: Block: 1
  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
  br ^exit
^bb2:
  // CHECK: Block: 2
  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
  br ^exit
^exit:
  // CHECK: Block: 3
  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
  // CHECK-NEXT: LiveOut:{{ *$}}
  // CHECK-NEXT: BeginLiveness
  // CHECK: val_std.addi
  // CHECK-NEXT:     %0 = addi
  // CHECK-NEXT:     return
  // CHECK-NEXT: EndLiveness
  %result = addi %arg1, %arg2 : i32
  return %result : i32
}

// -----

// CHECK-LABEL: Testing : func_loop
func @func_loop(%arg0 : i32, %arg1 : i32) -> i32 {
  // CHECK: Block: 0
  // CHECK-NEXT: LiveIn:{{ *$}}
  // CHECK-NEXT: LiveOut: arg1@0
  %const0 = constant 0 : i32
  br ^loopHeader(%const0, %arg0 : i32, i32)
^loopHeader(%counter : i32, %i : i32):
  // CHECK: Block: 1
  // CHECK-NEXT: LiveIn: arg1@0
  // CHECK-NEXT: LiveOut: arg1@0 arg0@1
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: val_std.cmpi
  // CHECK-NEXT:     %2 = cmpi
  // CHECK-NEXT:     cond_br
  // CHECK-NEXT: EndLiveness
  %lessThan = cmpi "slt", %counter, %arg1 : i32
  cond_br %lessThan, ^loopBody(%i : i32), ^exit(%i : i32)
^loopBody(%val : i32):
  // CHECK: Block: 2
  // CHECK-NEXT: LiveIn: arg1@0 arg0@1
  // CHECK-NEXT: LiveOut: arg1@0
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: val_std.constant
  // CHECK-NEXT:     %c
  // CHECK-NEXT:     %4 = addi
  // CHECK-NEXT:     %5 = addi
  // CHECK-NEXT: val_std.addi
  // CHECK-NEXT:     %4 = addi
  // CHECK-NEXT:     %5 = addi
  // CHECK-NEXT:     br
  // CHECK: EndLiveness
  %const1 = constant 1 : i32
  %inc = addi %val, %const1 : i32
  %inc2 = addi %counter, %const1 : i32
  br ^loopHeader(%inc, %inc2 : i32, i32)
^exit(%sum : i32):
  // CHECK: Block: 3
  // CHECK-NEXT: LiveIn: arg1@0
  // CHECK-NEXT: LiveOut:{{ *$}}
  %result = addi %sum, %arg1 : i32
  return %result : i32
}

// -----

// CHECK-LABEL: Testing : func_ranges
func @func_ranges(%cond : i1, %arg1 : i32, %arg2 : i32, %arg3 : i32) -> i32 {
  // CHECK: Block: 0
  // CHECK-NEXT: LiveIn:{{ *$}}
  // CHECK-NEXT: LiveOut: arg2@0 val_std.muli val_std.addi
  // CHECK-NEXT: BeginLiveness
  // CHECK-NEXT: val_std.addi
  // CHECK-NEXT:    %0 = addi
  // CHECK-NEXT:    %c
  // CHECK-NEXT:    %1 = addi
  // CHECK-NEXT:    %2 = addi
  // CHECK-NEXT:    %3 = muli
  // CHECK-NEXT: val_std.constant
  // CHECK-NEXT:    %c
  // CHECK-NEXT:    %1 = addi
  // CHECK-NEXT:    %2 = addi
  // CHECK-NEXT:    %3 = muli
  // CHECK-NEXT:    %4 = muli
  // CHECK-NEXT:    %5 = addi
  // CHECK-NEXT: val_std.addi
  // CHECK-NEXT:    %1 = addi
  // CHECK-NEXT:    %2 = addi
  // CHECK-NEXT:    %3 = muli
  // CHECK-NEXT: val_std.addi
  // CHECK-NEXT    %2 = addi
  // CHECK-NEXT    %3 = muli
  // CHECK-NEXT    %4 = muli
  // CHECK: val_std.muli
  // CHECK-NEXT:    %3 = muli
  // CHECK-NEXT:    %4 = muli
  // CHECK-NEXT: val_std.muli
  // CHECK-NEXT:    %4 = muli
  // CHECK-NEXT:    %5 = addi
  // CHECK-NEXT:    cond_br
  // CHECK-NEXT:    %c
  // CHECK-NEXT:    %6 = muli
  // CHECK-NEXT:    %7 = muli
  // CHECK-NEXT:    %8 = addi
  // CHECK-NEXT: val_std.addi
  // CHECK-NEXT:    %5 = addi
  // CHECK-NEXT:    cond_br
  // CHECK-NEXT:    %7
  // CHECK: EndLiveness
  %0 = addi %arg1, %arg2 : i32
  %const1 = constant 1 : i32
  %1 = addi %const1, %arg2 : i32
  %2 = addi %const1, %arg3 : i32
  %3 = muli %0, %1 : i32
  %4 = muli %3, %2 : i32
  %5 = addi %4, %const1 : i32
  cond_br %cond, ^bb1, ^bb2

^bb1:
  // CHECK: Block: 1
  // CHECK-NEXT: LiveIn: arg2@0 val_std.muli
  // CHECK-NEXT: LiveOut: arg2@0
  %const4 = constant 4 : i32
  %6 = muli %4, %const4 : i32
  br ^exit(%6 : i32)

^bb2:
  // CHECK: Block: 2
  // CHECK-NEXT: LiveIn: arg2@0 val_std.muli val_std.addi
  // CHECK-NEXT: LiveOut: arg2@0
  %7 = muli %4, %5 : i32
  %8 = addi %4, %arg2 : i32
  br ^exit(%8 : i32)

^exit(%sum : i32):
  // CHECK: Block: 3
  // CHECK-NEXT: LiveIn: arg2@0
  // CHECK-NEXT: LiveOut:{{ *$}}
  %result = addi %sum, %arg2 : i32
  return %result : i32
}