diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /test/Transforms/GVN/invariant.group.ll | |
parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
download | src-eb11fae6d08f479c0799db45860a98af528fa6e7.tar.gz src-eb11fae6d08f479c0799db45860a98af528fa6e7.zip |
Vendor import of llvm trunk r338150:vendor/llvm/llvm-trunk-r338150
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=336809
svn path=/vendor/llvm/llvm-trunk-r338150/; revision=336814; tag=vendor/llvm/llvm-trunk-r338150
Diffstat (limited to 'test/Transforms/GVN/invariant.group.ll')
-rw-r--r-- | test/Transforms/GVN/invariant.group.ll | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/test/Transforms/GVN/invariant.group.ll b/test/Transforms/GVN/invariant.group.ll index 1bc1f497264f..6cdd44d16c06 100644 --- a/test/Transforms/GVN/invariant.group.ll +++ b/test/Transforms/GVN/invariant.group.ll @@ -25,7 +25,7 @@ define i8 @optimizable1() { entry: %ptr = alloca i8 store i8 42, i8* %ptr, !invariant.group !0 - %ptr2 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr) + %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr) %a = load i8, i8* %ptr, !invariant.group !0 call void @foo(i8* %ptr2); call to use %ptr2 @@ -51,6 +51,18 @@ entry: ret i8 %b } +; CHECK-LABEL: define i1 @proveEqualityForStrip( +define i1 @proveEqualityForStrip(i8* %a) { +; FIXME: The first call could be also removed by GVN. Right now +; DCE removes it. The second call is CSE'd with the first one. +; CHECK: %b1 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a) + %b1 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a) +; CHECK-NOT: llvm.strip.invariant.group + %b2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a) + %r = icmp eq i8* %b1, %b2 +; CHECK: ret i1 true + ret i1 %r +} ; CHECK-LABEL: define i8 @unoptimizable1() { define i8 @unoptimizable1() { entry: @@ -74,7 +86,7 @@ entry: %2 = bitcast %struct.A* %1 to i8*** ; CHECK: %vtable = load {{.*}} !invariant.group - %vtable = load i8**, i8*** %2, align 8, !invariant.group !2 + %vtable = load i8**, i8*** %2, align 8, !invariant.group !0 %cmp.vtables = icmp eq i8** %vtable, getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1A, i64 0, i64 2) call void @llvm.assume(i1 %cmp.vtables) @@ -83,7 +95,7 @@ entry: %4 = bitcast %struct.A* %3 to void (%struct.A*)*** ; CHECK: call void @_ZN1A3fooEv( - %vtable1 = load void (%struct.A*)**, void (%struct.A*)*** %4, align 8, !invariant.group !2 + %vtable1 = load void (%struct.A*)**, void (%struct.A*)*** %4, align 8, !invariant.group !0 %vfn = getelementptr inbounds void (%struct.A*)*, void (%struct.A*)** %vtable1, i64 0 %5 = load void (%struct.A*)*, void (%struct.A*)** %vfn, align 8 call void %5(%struct.A* %3) @@ -91,7 +103,7 @@ entry: %7 = bitcast %struct.A* %6 to void (%struct.A*)*** ; CHECK: call void @_ZN1A3fooEv( - %vtable2 = load void (%struct.A*)**, void (%struct.A*)*** %7, align 8, !invariant.group !2 + %vtable2 = load void (%struct.A*)**, void (%struct.A*)*** %7, align 8, !invariant.group !0 %vfn3 = getelementptr inbounds void (%struct.A*)*, void (%struct.A*)** %vtable2, i64 0 %8 = load void (%struct.A*)*, void (%struct.A*)** %vfn3, align 8 @@ -99,13 +111,13 @@ entry: %9 = load %struct.A*, %struct.A** %a, align 8 %10 = bitcast %struct.A* %9 to void (%struct.A*)*** - %vtable4 = load void (%struct.A*)**, void (%struct.A*)*** %10, align 8, !invariant.group !2 + %vtable4 = load void (%struct.A*)**, void (%struct.A*)*** %10, align 8, !invariant.group !0 %vfn5 = getelementptr inbounds void (%struct.A*)*, void (%struct.A*)** %vtable4, i64 0 %11 = load void (%struct.A*)*, void (%struct.A*)** %vfn5, align 8 ; CHECK: call void @_ZN1A3fooEv( call void %11(%struct.A* %9) - %vtable5 = load i8**, i8*** %2, align 8, !invariant.group !2 + %vtable5 = load i8**, i8*** %2, align 8, !invariant.group !0 %vfn6 = getelementptr inbounds i8*, i8** %vtable5, i64 0 %12 = bitcast i8** %vfn6 to void (%struct.A*)** %13 = load void (%struct.A*)*, void (%struct.A*)** %12, align 8 @@ -127,7 +139,7 @@ entry: %2 = bitcast %struct.A* %1 to i8*** ; CHECK: %vtable = load {{.*}} !invariant.group - %vtable = load i8**, i8*** %2, align 8, !invariant.group !2 + %vtable = load i8**, i8*** %2, align 8, !invariant.group !0 %cmp.vtables = icmp eq i8** %vtable, getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1A, i64 0, i64 2) store %struct.A* %1, %struct.A** %a, align 8 @@ -135,7 +147,7 @@ entry: %3 = load %struct.A*, %struct.A** %a, align 8 %4 = bitcast %struct.A* %3 to void (%struct.A*)*** - %vtable1 = load void (%struct.A*)**, void (%struct.A*)*** %4, align 8, !invariant.group !2 + %vtable1 = load void (%struct.A*)**, void (%struct.A*)*** %4, align 8, !invariant.group !0 %vfn = getelementptr inbounds void (%struct.A*)*, void (%struct.A*)** %vtable1, i64 0 %5 = load void (%struct.A*)*, void (%struct.A*)** %vfn, align 8 call void %5(%struct.A* %3) @@ -152,7 +164,7 @@ enter: ; CHECK: %[[A:.*]] = load i8, i8* %ptr, !invariant.group %a = load i8, i8* %ptr, !invariant.group !0 ; CHECK-NOT: load - %b = load i8, i8* %ptr, !invariant.group !1 + %b = load i8, i8* %ptr, !invariant.group !0 ; CHECK: call void @bar(i8 %[[A]]) call void @bar(i8 %a) ; CHECK: call void @bar(i8 %[[A]]) @@ -169,7 +181,7 @@ enter: ; CHECK: %[[D:.*]] = load i8, i8* %ptr, !invariant.group %c = load i8, i8* %ptr ; CHECK-NOT: load - %d = load i8, i8* %ptr, !invariant.group !1 + %d = load i8, i8* %ptr, !invariant.group !0 ; CHECK: call void @bar(i8 %[[D]]) call void @bar(i8 %c) ; CHECK: call void @bar(i8 %[[D]]) @@ -184,7 +196,7 @@ enter: store i8 42, i8* %ptr call void @foo(i8* %ptr) ; CHECK: %[[E:.*]] = load i8, i8* %ptr, !invariant.group - %e = load i8, i8* %ptr, !invariant.group !1 + %e = load i8, i8* %ptr, !invariant.group !0 ; CHECK-NOT: load %f = load i8, i8* %ptr ; CHECK: call void @bar(i8 %[[E]]) @@ -200,10 +212,10 @@ enter: %ptr = alloca i8 store i8 42, i8* %ptr call void @foo(i8* %ptr) -; CHECK: %[[E:.*]] = load i8, i8* %ptr, !invariant.group ![[OneMD:[0-9]]] - %e = load i8, i8* %ptr, !invariant.group !1 +; CHECK: %[[E:.*]] = load i8, i8* %ptr, !invariant.group + %e = load i8, i8* %ptr, !invariant.group !0 ; CHECK-NOT: load - %f = load i8, i8* %ptr, !invariant.group !1 + %f = load i8, i8* %ptr, !invariant.group !0 ; CHECK: call void @bar(i8 %[[E]]) call void @bar(i8 %e) ; CHECK: call void @bar(i8 %[[E]]) @@ -242,7 +254,7 @@ define i8 @optimizable4() { entry: %ptr = alloca i8 store i8 42, i8* %ptr, !invariant.group !0 - %ptr2 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr) + %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr) ; CHECK-NOT: load %a = load i8, i8* %ptr2, !invariant.group !0 @@ -298,12 +310,7 @@ entry: %a = load i8, i8* %ptr, !invariant.group !0 ; Can assume that value under %ptr didn't change ; CHECK: call void @bar(i8 42) call void @bar(i8 %a) - - call void @foo(i8* %ptr) - %b = load i8, i8* %ptr, !invariant.group !1 ; Can't assume anything, because group changed -; CHECK: call void @bar(i8 %b) - call void @bar(i8 %b) - + %newPtr = call i8* @getPointer(i8* %ptr) %c = load i8, i8* %newPtr, !invariant.group !0 ; Can't assume anything, because we only have information about %ptr ; CHECK: call void @bar(i8 %c) @@ -314,7 +321,7 @@ entry: ; CHECK: store i8 %unknownValue, i8* %ptr, !invariant.group !0 store i8 %unknownValue, i8* %ptr, !invariant.group !0 - %newPtr2 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr) + %newPtr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr) ; CHECK-NOT: load %d = load i8, i8* %newPtr2, !invariant.group !0 ; CHECK: ret i8 %unknownValue @@ -441,14 +448,11 @@ declare void @_ZN1A3fooEv(%struct.A*) declare void @_ZN1AC1Ev(%struct.A*) declare void @fooBit(i1*, i1) -declare i8* @llvm.invariant.group.barrier.p0i8(i8*) +declare i8* @llvm.launder.invariant.group.p0i8(i8*) +declare i8* @llvm.strip.invariant.group.p0i8(i8*) + -; Function Attrs: nounwind -declare void @llvm.assume(i1 %cmp.vtables) #0 +declare void @llvm.assume(i1 %cmp.vtables) -attributes #0 = { nounwind } -; CHECK: ![[OneMD]] = !{!"other ptr"} -!0 = !{!"magic ptr"} -!1 = !{!"other ptr"} -!2 = !{!"vtable_of_a"} +!0 = !{}
\ No newline at end of file |