[PRE] Preserve !invariant.load metadata
authorPhilip Reames <listmail@philipreames.com>
Tue, 17 Nov 2015 00:15:09 +0000 (00:15 +0000)
committerPhilip Reames <listmail@philipreames.com>
Tue, 17 Nov 2015 00:15:09 +0000 (00:15 +0000)
Spoted via inspection.  Test case included.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253275 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/invariant-load.ll

index e2822e320a851e7896d1b85a15908c1fa15c9e49..06faa2d76b61c7a917064e7390495d11d8a69b2f 100644 (file)
@@ -1669,6 +1669,8 @@ bool GVN::PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock,
     if (Tags)
       NewLoad->setAAMetadata(Tags);
 
+    if (auto *MD = LI->getMetadata(LLVMContext::MD_invariant_load))
+      NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
     if (auto *InvGroupMD = LI->getMetadata(LLVMContext::MD_invariant_group))
       NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
 
index 982da8cfe486a6ea0846aad14df3189284b57107..f74fd3392c1806407894b38da057760b33e1ecd2 100644 (file)
@@ -114,6 +114,23 @@ entry:
   ret i32 %res
 }
 
+define i32 @test8(i1 %cnd, i32* %p) {
+; CHECK-LABEL: test8
+; CHECK: @bar
+; CHECK: load i32, i32* %p2, !invariant.load
+; CHECK: br label %merge
+entry:
+  %v1 = load i32, i32* %p, !invariant.load !0
+  br i1 %cnd, label %taken, label %merge
+taken:
+  %p2 = call i32* (...) @bar(i32* %p)
+  br label %merge
+merge:
+  %p3 = phi i32* [%p, %entry], [%p2, %taken]
+  %v2 = load i32, i32* %p3, !invariant.load !0
+  %res = sub i32 %v1, %v2
+  ret i32 %res
+}
 
 !0 = !{ }