diff options
| author | Piotr Padlewski <piotr.padlewski@gmail.com> | 2018-05-23 09:16:44 +0000 |
|---|---|---|
| committer | Piotr Padlewski <piotr.padlewski@gmail.com> | 2018-05-23 09:16:44 +0000 |
| commit | d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440 (patch) | |
| tree | 9c009d37ea6f02879925ab71d94ac81a32701753 /llvm/test/Transforms/Inline | |
| parent | eb13d3d22e9bd303b4065b372a692cd04e4b8cc1 (diff) | |
| download | bcm5719-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.ll | 31 |
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*) |

