blob: 74fda76e1c22b3cca0f6eae27ee601fb7c10b242 [file] [log] [blame] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -passes='early-cse<memssa>' < %s | FileCheck %s
define void @foo(){
; CHECK-LABEL: define void @foo() {
; CHECK-NEXT: call void @fn_write_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: ret void
;
call void @fn_write_target1()
call void @fn_readwrite_target0_read_target1()
call void @fn_write_target1()
call void @fn_readwrite_target0_read_target1()
ret void
}
;; In this case the clobber function is not even called
define void @neg_foo(){
; CHECK-LABEL: define void @neg_foo() {
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: call void @fn_read_target0_readwrite_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: call void @fn_read_target0_readwrite_target1()
; CHECK-NEXT: ret void
;
call void @fn_readwrite_target0_read_target1()
call void @fn_read_target0_readwrite_target1()
call void @fn_readwrite_target0_read_target1()
call void @fn_read_target0_readwrite_target1()
ret void
}
define void @neg_foo_call(){
; CHECK-LABEL: define void @neg_foo_call() {
; CHECK-NEXT: call void @fn_write_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: call void @neg_foo()
; CHECK-NEXT: call void @fn_write_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: ret void
;
call void @fn_write_target1()
call void @fn_readwrite_target0_read_target1()
call void @neg_foo()
call void @fn_write_target1()
call void @fn_readwrite_target0_read_target1()
ret void
}
define void @neg_foo_x(i64 %x, i64 %y){
; CHECK-LABEL: define void @neg_foo_x(
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]]) {
; CHECK-NEXT: call void @fn_write_target1_x(i64 [[X]])
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1_x(i64 [[X]])
; CHECK-NEXT: call void @fn_write_target1_x(i64 [[Y]])
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1_x(i64 [[X]])
; CHECK-NEXT: ret void
;
call void @fn_write_target1_x(i64 %x)
call void @fn_readwrite_target0_read_target1_x(i64 %x)
call void @fn_write_target1_x(i64 %y)
call void @fn_readwrite_target0_read_target1_x(i64 %x)
ret void
}
define void @f1(i64 %x, i64 %y){
; CHECK-LABEL: define void @f1(
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]]) {
; CHECK-NEXT: call void @fn_read_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: call void @fn_readwrite_target0_read_target1()
; CHECK-NEXT: ret void
;
call void @fn_read_target1()
call void @fn_readwrite_target0_read_target1()
call void @fn_read_target1()
call void @fn_readwrite_target0_read_target1()
ret void
}
define void @bar(){
; CHECK-LABEL: define void @bar() {
; CHECK-NEXT: call void @fn_write_target1()
; CHECK-NEXT: call void @fn_write_inaccessiblemem()
; CHECK-NEXT: call void @fn_read_inaccessiblemem()
; CHECK-NEXT: ret void
;
call void @fn_write_target1()
call void @fn_write_inaccessiblemem()
call void @fn_write_target1()
call void @fn_read_inaccessiblemem()
ret void
}
declare void @fn_write_target1()
memory(target_mem1: write)
declare void @fn_read_target1()
memory(target_mem1: read)
declare void @fn_read_target0_readwrite_target1()
memory(target_mem0: read, target_mem1: readwrite)
declare void @fn_read_inaccessiblemem()
memory(inaccessiblemem: read)
declare void @fn_write_inaccessiblemem()
memory(inaccessiblemem: write)
declare void @fn_readwrite_target0_read_target1()
memory(target_mem0: readwrite, target_mem1: read)
declare void @fn_write_target1_x(i64)
memory(target_mem1: write)
declare void @fn_readwrite_target0_read_target1_x(i64)
memory(target_mem0: readwrite, target_mem1: read)