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