blob: 39ab53ad74682b4a443242dcffd070fb72edb17e [file] [log] [blame]
// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// RUN: iree-opt -split-input-file -pass-pipeline='vm.module(test-iree-vm-value-liveness)' %s | IreeFileCheck %s
// CHECK-LABEL: @module
vm.module @module {
// CHECK-LABEL: @single_block
vm.func @single_block(%arg0 : i32) -> i32 {
// CHECK: vm.add.i32
// CHECK-SAME: block_defined = ["%0", "%1", "%arg0"]
// CHECK-SAME: block_live = ["%0", "%1", "%arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%0", "%arg0"]
%0 = vm.add.i32 %arg0, %arg0 : i32
// CHECK: vm.sub.i32
// CHECK-SAME: live = ["%0", "%1", "%arg0"]
%1 = vm.sub.i32 %arg0, %0 : i32
// CHECK: vm.return
// CHECK-SAME: live = ["%1"]
vm.return %1 : i32
}
// CHECK-LABEL: @unused_arg
vm.func @unused_arg(%arg0 : i32, %arg1 : i32) -> i32 {
// CHECK: vm.const.i32.zero
// CHECK-SAME: block_defined = ["%arg0", "%arg1", "%zero"]
// CHECK-SAME: block_live = ["%zero"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%arg0", "%arg1", "%zero"]
%zero = vm.const.i32.zero : i32
// CHECK: vm.return
// CHECK-SAME: live = ["%zero"]
vm.return %zero : i32
}
// CHECK-LABEL: @dominating_values
vm.func @dominating_values(%arg0 : i32, %arg1 : i32) -> i32 {
// CHECK: vm.const.i32.zero
// CHECK-SAME: block_defined = ["%arg0", "%arg1", "%zero"]
// CHECK-SAME: block_live = ["%arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = ["%arg1", "%zero"]
// CHECK-SAME: live = ["%arg0", "%arg1", "%zero"]
%c4 = vm.const.i32.zero : i32
// CHECK: vm.br
// CHECK-SAME: live = ["%arg0", "%arg1", "%zero"]
vm.br ^bb1(%arg0 : i32)
^bb1(%0 : i32):
// CHECK: vm.add.i32
// CHECK-SAME: block_defined = ["%1", "%2", "%bb1_arg0"]
// CHECK-SAME: block_live = ["%1", "%2", "%arg1", "%bb1_arg0", "%zero"]
// CHECK-SAME: block_live_in = ["%arg1", "%zero"]
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%1", "%arg1", "%bb1_arg0", "%zero"]
%1 = vm.add.i32 %0, %arg1 : i32
// CHECK: vm.mul.i32
// CHECK-SAME: live = ["%1", "%2", "%zero"]
%2 = vm.mul.i32 %1, %c4 : i32
// CHECK: vm.return
// CHECK-SAME: live = ["%2"]
vm.return %2 : i32
}
// CHECK-LABEL: @branch_args
vm.func @branch_args(%arg0 : i32, %arg1 : i32) -> i32 {
// CHECK: vm.br
// CHECK-SAME: block_defined = ["%arg0", "%arg1"]
// CHECK-SAME: block_live = ["%arg0", "%arg1"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%arg0", "%arg1"]
vm.br ^bb1(%arg0, %arg1 : i32, i32)
^bb1(%0 : i32, %1 : i32):
// CHECK: vm.return
// CHECK-SAME: block_defined = ["%bb1_arg0", "%bb1_arg1"]
// CHECK-SAME: block_live = ["%bb1_arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%bb1_arg0", "%bb1_arg1"]
vm.return %0 : i32
}
// CHECK-LABEL: @cond_branch_args
vm.func @cond_branch_args(%arg0 : i32, %arg1 : i32, %arg2 : i32) -> i32 {
// CHECK: vm.cond_br
// CHECK-SAME: block_defined = ["%arg0", "%arg1", "%arg2"]
// CHECK-SAME: block_live = ["%arg0", "%arg1", "%arg2"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%arg0", "%arg1", "%arg2"]
vm.cond_br %arg0, ^bb1(%arg1 : i32), ^bb2(%arg2 : i32)
^bb1(%0 : i32):
// CHECK: vm.return
// CHECK-SAME: block_defined = ["%bb1_arg0"]
// CHECK-SAME: block_live = ["%bb1_arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%bb1_arg0"]
vm.return %0 : i32
^bb2(%1 : i32):
// CHECK: vm.return
// CHECK-SAME: block_defined = ["%bb2_arg0"]
// CHECK-SAME: block_live = ["%bb2_arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%bb2_arg0"]
vm.return %1 : i32
}
// CHECK-LABEL: @loop
vm.func @loop() -> i32 {
// CHECK: vm.const.i32
// CHECK-SAME: block_defined = ["%c1", "%c5", "%zero"]
// CHECK-SAME: block_live = ["%zero"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = ["%c1", "%c5"]
// CHECK-SAME: live = ["%c1"]
%c1 = vm.const.i32 1 : i32
// CHECK: vm.const.i32
// CHECK-SAME: live = ["%c1", "%c5"]
%c5 = vm.const.i32 5 : i32
// CHECK: vm.const.i32.zero
// CHECK-SAME: live = ["%c1", "%c5", "%zero"]
%i0 = vm.const.i32.zero : i32
// CHECK: vm.br
// CHECK-SAME: live = ["%c1", "%c5", "%zero"]
vm.br ^loop(%i0 : i32)
^loop(%i : i32):
// CHECK: vm.add.i32
// CHECK-SAME: block_defined = ["%1", "%bb1_arg0", "%slt"]
// CHECK-SAME: block_live = ["%1", "%bb1_arg0", "%c1", "%c5", "%slt"]
// CHECK-SAME: block_live_in = ["%c1", "%c5"]
// CHECK-SAME: block_live_out = ["%c1", "%c5"]
// CHECK-SAME: live = ["%1", "%bb1_arg0", "%c1", "%c5"]
%in = vm.add.i32 %i, %c1 : i32
// CHECK: vm.cmp.lt.i32.s
// CHECK-SAME: live = ["%1", "%c1", "%c5", "%slt"]
%cmp = vm.cmp.lt.i32.s %in, %c5 : i32
// CHECK: vm.cond_br
// CHECK-SAME: live = ["%1", "%c1", "%c5", "%slt"]
vm.cond_br %cmp, ^loop(%in : i32), ^loop_exit(%in : i32)
^loop_exit(%ie : i32):
// CHECK: vm.return
// CHECK-SAME: block_defined = ["%bb2_arg0"]
// CHECK-SAME: block_live = ["%bb2_arg0"]
// CHECK-SAME: block_live_in = []
// CHECK-SAME: block_live_out = []
// CHECK-SAME: live = ["%bb2_arg0"]
vm.return %ie : i32
}
}