diff options
| author | Alina Sbirlea <asbirlea@google.com> | 2019-10-31 12:35:46 -0700 |
|---|---|---|
| committer | Alina Sbirlea <asbirlea@google.com> | 2019-11-12 14:24:56 -0800 |
| commit | db69f1b22951ce49bda8e492ec8e6f60d9721668 (patch) | |
| tree | b482fd995ea8f251d95a372afa8680be84eea6dd /llvm/test/Analysis/GlobalsModRef | |
| parent | a247bd1f274e49ea83b2ad39c6ff062753e9e779 (diff) | |
| download | bcm5719-llvm-db69f1b22951ce49bda8e492ec8e6f60d9721668.tar.gz bcm5719-llvm-db69f1b22951ce49bda8e492ec8e6f60d9721668.zip | |
[GlobalsAA] Restrict ModRef result if any internal method has its address taken.
Summary:
If there are any internal methods whose address was taken, conclude there is nothing known in relation of any other internal method and a global.
Reviewers: nlopes, sanjoy.google
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D69690
Diffstat (limited to 'llvm/test/Analysis/GlobalsModRef')
3 files changed, 147 insertions, 0 deletions
diff --git a/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken1.ll b/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken1.ll new file mode 100644 index 00000000000..934534b5b60 --- /dev/null +++ b/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken1.ll @@ -0,0 +1,44 @@ +; RUN: opt -globals-aa -gvn -S < %s | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@deallocCalled = internal global i8 0, align 1 + +; CHECK-LABEL: @main() +define dso_local i32 @main() { +entry: + %tmp0 = call i8* @llvm.objc.autoreleasePoolPush() #1 + %tmp6 = load i8, i8* @deallocCalled, align 1 + %tobool = icmp ne i8 %tmp6, 0 + br i1 %tobool, label %if.else, label %if.end + +if.else: ; preds = %entry + call void @__assert_fail() #0 + unreachable + +; CHECK-LABEL: if.end: +; CHECK-NEXT: call void @llvm.objc.autoreleasePoolPop +; CHECK-NOT: load i8, i8* @deallocCalled +if.end: ; preds = %entry + call void @llvm.objc.autoreleasePoolPop(i8* %tmp0) + %tmp7 = load i8, i8* @deallocCalled, align 1 + %tobool3 = icmp ne i8 %tmp7, 0 + br i1 %tobool3, label %if.end6, label %if.else5 + +if.else5: ; preds = %if.end + call void @__assert_fail() #0 + unreachable + +if.end6: ; preds = %if.end + store i8 0, i8* @deallocCalled, align 1 + ret i32 0 +} + +declare i8* @llvm.objc.autoreleasePoolPush() #1 +declare void @llvm.objc.autoreleasePoolPop(i8*) #1 +declare dso_local void @__assert_fail() #0 + +attributes #0 = { noreturn nounwind } +attributes #1 = { nounwind } + diff --git a/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken2.ll b/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken2.ll new file mode 100644 index 00000000000..d9874d7140d --- /dev/null +++ b/llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken2.ll @@ -0,0 +1,50 @@ +; RUN: opt -globals-aa -gvn -S < %s | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@deallocCalled = internal global i8 0, align 1 + +define internal i8* @_i_Associated__dealloc() { +entry: + store i8 1, i8* @deallocCalled, align 1 + ret i8* null +} + +; CHECK-LABEL: @main() +define dso_local i32 @main() { +entry: + %tmp0 = call i8* @llvm.objc.autoreleasePoolPush() #1 + %tmp6 = load i8, i8* @deallocCalled, align 1 + %tobool = icmp ne i8 %tmp6, 0 + br i1 %tobool, label %if.else, label %if.end + +if.else: ; preds = %entry + call void @__assert_fail() #0 + unreachable + +; CHECK-LABEL: if.end: +; CHECK-NEXT: call void @llvm.objc.autoreleasePoolPop +; CHECK-NOT: load i8, i8* @deallocCalled +if.end: ; preds = %entry + call void @llvm.objc.autoreleasePoolPop(i8* %tmp0) + %tmp7 = load i8, i8* @deallocCalled, align 1 + %tobool3 = icmp ne i8 %tmp7, 0 + br i1 %tobool3, label %if.end6, label %if.else5 + +if.else5: ; preds = %if.end + call void @__assert_fail() #0 + unreachable + +if.end6: ; preds = %if.end + store i8 0, i8* @deallocCalled, align 1 + ret i32 0 +} + +declare i8* @llvm.objc.autoreleasePoolPush() #1 +declare void @llvm.objc.autoreleasePoolPop(i8*) #1 +declare dso_local void @__assert_fail() #0 + +attributes #0 = { noreturn nounwind } +attributes #1 = { nounwind } + diff --git a/llvm/test/Analysis/GlobalsModRef/intrinsic_addresstaken.ll b/llvm/test/Analysis/GlobalsModRef/intrinsic_addresstaken.ll new file mode 100644 index 00000000000..18cf7c2341f --- /dev/null +++ b/llvm/test/Analysis/GlobalsModRef/intrinsic_addresstaken.ll @@ -0,0 +1,53 @@ +; RUN: opt -globals-aa -gvn -S < %s | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@deallocCalled = internal global i8 0, align 1 +@.objc_method_list = internal global { i8* ()* } { i8* ()* @_i_Associated__dealloc }, align 8 +@._OBJC_CLASS_Associated = global { i8* } { i8* bitcast ({ i8* ()* }* @.objc_method_list to i8*) }, align 8 +@._OBJC_INIT_CLASS_Associated = global { i8* }* @._OBJC_CLASS_Associated +@llvm.used = appending global [1 x i8*] [i8* bitcast ({ i8* }** @._OBJC_INIT_CLASS_Associated to i8*)] + +define internal i8* @_i_Associated__dealloc() { +entry: + store i8 1, i8* @deallocCalled, align 1 + ret i8* null +} + +; CHECK-LABEL: @main() +define dso_local i32 @main() { +entry: + %tmp0 = call i8* @llvm.objc.autoreleasePoolPush() #1 + %tmp6 = load i8, i8* @deallocCalled, align 1 + %tobool = icmp ne i8 %tmp6, 0 + br i1 %tobool, label %if.else, label %if.end + +if.else: ; preds = %entry + call void @__assert_fail() #0 + unreachable + +; CHECK-LABEL: if.end: +; CHECK-NEXT: call void @llvm.objc.autoreleasePoolPop +; CHECK-NEXT: load i8, i8* @deallocCalled +if.end: ; preds = %entry + call void @llvm.objc.autoreleasePoolPop(i8* %tmp0) + %tmp7 = load i8, i8* @deallocCalled, align 1 + %tobool3 = icmp ne i8 %tmp7, 0 + br i1 %tobool3, label %if.end6, label %if.else5 + +if.else5: ; preds = %if.end + call void @__assert_fail() #0 + unreachable + +if.end6: ; preds = %if.end + store i8 0, i8* @deallocCalled, align 1 + ret i32 0 +} + +declare i8* @llvm.objc.autoreleasePoolPush() #1 +declare void @llvm.objc.autoreleasePoolPop(i8*) #1 +declare dso_local void @__assert_fail() #0 + +attributes #0 = { noreturn nounwind } +attributes #1 = { nounwind } |

