1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -sink -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_load_global() nounwind readonly 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_load_arg(i32*) nounwind readonly argmemonly 5*9880d681SAndroid Build Coastguard Workerdeclare void @f_store_global(i32) nounwind 6*9880d681SAndroid Build Coastguard Workerdeclare void @f_store_arg(i32*) nounwind argmemonly 7*9880d681SAndroid Build Coastguard Workerdeclare void @f_readonly_arg(i32* readonly, i32*) nounwind argmemonly 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @f_readnone(i32) nounwind readnone 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@A = external global i32 11*9880d681SAndroid Build Coastguard Worker@B = external global i32 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; Sink readonly call if no stores are in the way. 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_no_stores( 16*9880d681SAndroid Build Coastguard Worker; CHECK: true: 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_global 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l 19*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_no_stores(i1 %z) { 20*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_global() 21*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 22*9880d681SAndroid Build Coastguard Workertrue: 23*9880d681SAndroid Build Coastguard Worker ret i32 %l 24*9880d681SAndroid Build Coastguard Workerfalse: 25*9880d681SAndroid Build Coastguard Worker ret i32 0 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_store( 29*9880d681SAndroid Build Coastguard Worker; CHECK: true: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l 32*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_store(i1 %z) { 33*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_arg(i32* @A) 34*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @B 35*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 36*9880d681SAndroid Build Coastguard Workertrue: 37*9880d681SAndroid Build Coastguard Worker ret i32 %l 38*9880d681SAndroid Build Coastguard Workerfalse: 39*9880d681SAndroid Build Coastguard Worker ret i32 0 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_call( 43*9880d681SAndroid Build Coastguard Worker; CHECK: true: 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l 46*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_call(i1 %z) { 47*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_arg(i32* @A) 48*9880d681SAndroid Build Coastguard Worker call void @f_store_arg(i32* @B) 49*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 50*9880d681SAndroid Build Coastguard Workertrue: 51*9880d681SAndroid Build Coastguard Worker ret i32 %l 52*9880d681SAndroid Build Coastguard Workerfalse: 53*9880d681SAndroid Build Coastguard Worker ret i32 0 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_argmem_multiple( 57*9880d681SAndroid Build Coastguard Worker; CHECK: true: 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_load_arg 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l 60*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_argmem_multiple(i1 %z) { 61*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_arg(i32* @A) 62*9880d681SAndroid Build Coastguard Worker call void @f_readonly_arg(i32* @A, i32* @B) 63*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 64*9880d681SAndroid Build Coastguard Workertrue: 65*9880d681SAndroid Build Coastguard Worker ret i32 %l 66*9880d681SAndroid Build Coastguard Workerfalse: 67*9880d681SAndroid Build Coastguard Worker ret i32 0 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; But don't sink if there is a store. 71*9880d681SAndroid Build Coastguard Worker; 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_nosink_store( 73*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f_load_global 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 75*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nosink_store(i1 %z) { 76*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_global() 77*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @A 78*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 79*9880d681SAndroid Build Coastguard Workertrue: 80*9880d681SAndroid Build Coastguard Worker ret i32 %l 81*9880d681SAndroid Build Coastguard Workerfalse: 82*9880d681SAndroid Build Coastguard Worker ret i32 0 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_nosink_call( 86*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f_load_global 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f_store_global 88*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nosink_call(i1 %z) { 89*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_load_global() 90*9880d681SAndroid Build Coastguard Worker call void @f_store_global(i32 0) 91*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 92*9880d681SAndroid Build Coastguard Workertrue: 93*9880d681SAndroid Build Coastguard Worker ret i32 %l 94*9880d681SAndroid Build Coastguard Workerfalse: 95*9880d681SAndroid Build Coastguard Worker ret i32 0 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; readnone calls are sunk across stores. 99*9880d681SAndroid Build Coastguard Worker; 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sink_readnone( 101*9880d681SAndroid Build Coastguard Worker; CHECK: true: 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %l = call i32 @f_readnone( 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %l 104*9880d681SAndroid Build Coastguard Workerdefine i32 @test_sink_readnone(i1 %z) { 105*9880d681SAndroid Build Coastguard Worker %l = call i32 @f_readnone(i32 0) 106*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @A 107*9880d681SAndroid Build Coastguard Worker br i1 %z, label %true, label %false 108*9880d681SAndroid Build Coastguard Workertrue: 109*9880d681SAndroid Build Coastguard Worker ret i32 %l 110*9880d681SAndroid Build Coastguard Workerfalse: 111*9880d681SAndroid Build Coastguard Worker ret i32 0 112*9880d681SAndroid Build Coastguard Worker} 113