summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/Inline
diff options
context:
space:
mode:
authorPiotr Padlewski <piotr.padlewski@gmail.com>2018-05-23 09:16:44 +0000
committerPiotr Padlewski <piotr.padlewski@gmail.com>2018-05-23 09:16:44 +0000
commitd6f7346a4b4bdbdfef9ba7a5b8619e42091e2440 (patch)
tree9c009d37ea6f02879925ab71d94ac81a32701753 /llvm/test/Transforms/Inline
parenteb13d3d22e9bd303b4065b372a692cd04e4b8cc1 (diff)
downloadbcm5719-llvm-d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440.tar.gz
bcm5719-llvm-d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440.zip
Fix aliasing of launder.invariant.group
Summary: Patch for capture tracking broke bootstrap of clang with -fstict-vtable-pointers which resulted in debbugging nightmare. It was fixed https://reviews.llvm.org/D46900 but as it turned out, there were other parts like inliner (computing of noalias metadata) that I found after bootstraping with enabled assertions. Reviewers: hfinkel, rsmith, chandlerc, amharc, kuhar Subscribers: JDevlieghere, eraman, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D47088 llvm-svn: 333070
Diffstat (limited to 'llvm/test/Transforms/Inline')
-rw-r--r--llvm/test/Transforms/Inline/launder.invariant.group.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Inline/launder.invariant.group.ll b/llvm/test/Transforms/Inline/launder.invariant.group.ll
new file mode 100644
index 00000000000..a11475fdb57
--- /dev/null
+++ b/llvm/test/Transforms/Inline/launder.invariant.group.ll
@@ -0,0 +1,31 @@
+; RUN: opt -S -inline < %s | FileCheck %s
+; RUN: opt -S -O3 < %s | FileCheck %s
+
+; This test checks if value returned from the launder is considered aliasing
+; with its argument. Due to bug caused by handling launder in capture tracking
+; sometimes it would be considered noalias.
+
+%struct.A = type <{ i32 (...)**, i32, [4 x i8] }>
+
+; CHECK: define i32 @bar(%struct.A* noalias
+define i32 @bar(%struct.A* noalias) {
+; CHECK-NOT: noalias
+ %2 = bitcast %struct.A* %0 to i8*
+ %3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %2)
+ %4 = getelementptr inbounds i8, i8* %3, i64 8
+ %5 = bitcast i8* %4 to i32*
+ store i32 42, i32* %5, align 8
+ %6 = getelementptr inbounds %struct.A, %struct.A* %0, i64 0, i32 1
+ %7 = load i32, i32* %6, align 8
+ ret i32 %7
+}
+
+; CHECK-LABEL: define i32 @foo(%struct.A* noalias
+define i32 @foo(%struct.A* noalias) {
+ ; CHECK-NOT: call i32 @bar(
+ ; CHECK-NOT: noalias
+ %2 = tail call i32 @bar(%struct.A* %0)
+ ret i32 %2
+}
+
+declare i8* @llvm.launder.invariant.group.p0i8(i8*)
OpenPOWER on IntegriCloud