1*9880d681SAndroid Build Coastguard Worker; Test that GCSE uses basicaa to do alias analysis, which is capable of 2*9880d681SAndroid Build Coastguard Worker; disambiguating some obvious cases. All loads should be removable in 3*9880d681SAndroid Build Coastguard Worker; this testcase. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -gvn -instcombine -dce -S | FileCheck %s 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@A = global i32 7 8*9880d681SAndroid Build Coastguard Worker@B = global i32 8 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; CHECK: define i32 @test() 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 123, i32* @B 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test() { 15*9880d681SAndroid Build Coastguard Worker %A1 = load i32, i32* @A 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker store i32 123, i32* @B ; Store cannot alias @A 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker %A2 = load i32, i32* @A 20*9880d681SAndroid Build Coastguard Worker %X = sub i32 %A1, %A2 21*9880d681SAndroid Build Coastguard Worker ret i32 %X 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK: define i32 @test2() 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %Loop 26*9880d681SAndroid Build Coastguard Worker; CHECK: Loop: 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 0, i32* @B 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 true, label %out, label %Loop 29*9880d681SAndroid Build Coastguard Worker; CHECK: out: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() { 33*9880d681SAndroid Build Coastguard Worker %A1 = load i32, i32* @A 34*9880d681SAndroid Build Coastguard Worker br label %Loop 35*9880d681SAndroid Build Coastguard WorkerLoop: 36*9880d681SAndroid Build Coastguard Worker %AP = phi i32 [0, %0], [%X, %Loop] 37*9880d681SAndroid Build Coastguard Worker store i32 %AP, i32* @B ; Store cannot alias @A 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker %A2 = load i32, i32* @A 40*9880d681SAndroid Build Coastguard Worker %X = sub i32 %A1, %A2 41*9880d681SAndroid Build Coastguard Worker %c = icmp eq i32 %X, 0 42*9880d681SAndroid Build Coastguard Worker br i1 %c, label %out, label %Loop 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerout: 45*9880d681SAndroid Build Coastguard Worker ret i32 %X 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdeclare void @external() 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK: define i32 @test3() 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @external() 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 7 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i32 @test3() { 55*9880d681SAndroid Build Coastguard Worker %X = alloca i32 56*9880d681SAndroid Build Coastguard Worker store i32 7, i32* %X 57*9880d681SAndroid Build Coastguard Worker call void @external() 58*9880d681SAndroid Build Coastguard Worker %V = load i32, i32* %X 59*9880d681SAndroid Build Coastguard Worker ret i32 %V 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62