From db69f1b22951ce49bda8e492ec8e6f60d9721668 Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Thu, 31 Oct 2019 12:35:46 -0700 Subject: [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 --- .../GlobalsModRef/intrinsic_addressnottaken1.ll | 44 ++++++++++++++++++ .../GlobalsModRef/intrinsic_addressnottaken2.ll | 50 ++++++++++++++++++++ .../GlobalsModRef/intrinsic_addresstaken.ll | 53 ++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken1.ll create mode 100644 llvm/test/Analysis/GlobalsModRef/intrinsic_addressnottaken2.ll create mode 100644 llvm/test/Analysis/GlobalsModRef/intrinsic_addresstaken.ll (limited to 'llvm/test/Analysis/GlobalsModRef') 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 } -- cgit v1.2.3