1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -basicaa -objc-arc-aa -gvn < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@x = common global i8* null, align 8 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_retain(i8*) 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @objc_sync_enter(i8*) 7*9880d681SAndroid Build Coastguard Workerdeclare i32 @objc_sync_exit(i8*) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; GVN should be able to eliminate this redundant load, with ARC-specific 10*9880d681SAndroid Build Coastguard Worker; alias analysis. 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK: define i8* @test0(i32 %n) 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %s = load i8*, i8** @x 15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8* %s 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: } 18*9880d681SAndroid Build Coastguard Workerdefine i8* @test0(i32 %n) nounwind { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %s = load i8*, i8** @x 21*9880d681SAndroid Build Coastguard Worker %0 = tail call i8* @objc_retain(i8* %s) nounwind 22*9880d681SAndroid Build Coastguard Worker %t = load i8*, i8** @x 23*9880d681SAndroid Build Coastguard Worker ret i8* %t 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; GVN should not be able to eliminate this redundant load, with ARC-specific 27*9880d681SAndroid Build Coastguard Worker; alias analysis. 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i8* @test1( 30*9880d681SAndroid Build Coastguard Worker; CHECK: load 31*9880d681SAndroid Build Coastguard Worker; CHECK: load 32*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8* %t 33*9880d681SAndroid Build Coastguard Worker; CHECK: } 34*9880d681SAndroid Build Coastguard Workerdefine i8* @test1(i32 %n) nounwind { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker %s = load i8*, i8** @x 37*9880d681SAndroid Build Coastguard Worker %0 = call i32 @objc_sync_enter(i8* %s) 38*9880d681SAndroid Build Coastguard Worker %t = load i8*, i8** @x 39*9880d681SAndroid Build Coastguard Worker %1 = call i32 @objc_sync_exit(i8* %s) 40*9880d681SAndroid Build Coastguard Worker ret i8* %t 41*9880d681SAndroid Build Coastguard Worker} 42