; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -S -passes='early-cse' < %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)