[llvm] r352061 - [RS4GC] Be slightly less conservative for gep vector_base, scalar_idx

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 24 08:34:00 PST 2019


Author: reames
Date: Thu Jan 24 08:34:00 2019
New Revision: 352061

URL: http://llvm.org/viewvc/llvm-project?rev=352061&view=rev
Log:
[RS4GC] Be slightly less conservative for gep vector_base, scalar_idx

After submitting https://reviews.llvm.org/D57138, I realized it was slightly more conservative than needed. The scalar indices don't appear to be a problem on a vector gep, we even had a test for that.

Differential Revision: https://reviews.llvm.org/D57161


Modified:
    llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll

Modified: llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp?rev=352061&r1=352060&r2=352061&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp Thu Jan 24 08:34:00 2019
@@ -2611,21 +2611,20 @@ bool RewriteStatepointsForGC::runOnFunct
       continue;
 
     unsigned VF = 0;
-    bool HasScalarOperand = false;
     for (unsigned i = 0; i < I.getNumOperands(); i++)
-      if (I.getOperand(i)->getType()->isVectorTy())
+      if (I.getOperand(i)->getType()->isVectorTy()) {
+        assert(VF == 0 ||
+               VF == I.getOperand(i)->getType()->getVectorNumElements());
         VF = I.getOperand(i)->getType()->getVectorNumElements();
-      else
-        HasScalarOperand = true;
+      }
 
-    if (HasScalarOperand && VF != 0) {
+    // It's the vector to scalar traversal through the pointer operand which
+    // confuses base pointer rewriting, so limit ourselves to that case.
+    if (!I.getOperand(0)->getType()->isVectorTy() && VF != 0) {
       IRBuilder<> B(&I);
-      for (unsigned i = 0; i < I.getNumOperands(); i++)
-        if (!I.getOperand(i)->getType()->isVectorTy()) {
-          auto *Splat = B.CreateVectorSplat(VF, I.getOperand(i));
-          I.setOperand(i, Splat);
-          MadeChange = true;
-        }
+      auto *Splat = B.CreateVectorSplat(VF, I.getOperand(0));
+      I.setOperand(0, Splat);
+      MadeChange = true;
     }
   }
 

Modified: llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll?rev=352061&r1=352060&r2=352061&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll (original)
+++ llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll Thu Jan 24 08:34:00 2019
@@ -253,7 +253,7 @@ define void @test11(<4 x i64 addrspace(1
 ; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf{{.*}}<4 x i64 addrspace(1)*> %vec1)
 ; CHECK: %vec1.relocated = call coldcc <4 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v4p1i8
 ; CHECK: %vec1.relocated.casted = bitcast <4 x i8 addrspace(1)*> %vec1.relocated to <4 x i64 addrspace(1)*>
-; CHECK: %vec2.remat = getelementptr i64, <4 x i64 addrspace(1)*> %vec1.relocated.casted, <4 x i32> <i32 1024, i32 1024, i32 1024, i32 1024>
+; CHECK: %vec2.remat = getelementptr i64, <4 x i64 addrspace(1)*> %vec1.relocated.casted, i32 1024
 ; CHECK: call void @use_vec(<4 x i64 addrspace(1)*> %vec2.remat)
 entry:
   %vec2 = getelementptr i64, <4 x i64 addrspace(1)*> %vec1, i32 1024




More information about the llvm-commits mailing list