[llvm] 8e4f7b7 - [Analysis] Fix another issue when querying vscale attributes on functions

David Sherwood via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 24 05:56:12 PDT 2021


Author: David Sherwood
Date: 2021-09-24T13:37:23+01:00
New Revision: 8e4f7b749c2c03809f022c95698686c8584097fc

URL: https://github.com/llvm/llvm-project/commit/8e4f7b749c2c03809f022c95698686c8584097fc
DIFF: https://github.com/llvm/llvm-project/commit/8e4f7b749c2c03809f022c95698686c8584097fc.diff

LOG: [Analysis] Fix another issue when querying vscale attributes on functions

There are several places in the code that are currently broken where
we assume an Instruction is always a member of a BasicBlock that
lives in a Function. This is a problem specifically when
attempting to get the vscale_range attribute. This patch adds checks
that an Instruction's parent also has a parent!

I've added a test for a function-less @llvm.vscale intrinsic call here:

  unittests/Analysis/ValueTrackingTest.cpp

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp
    llvm/unittests/Analysis/ValueTrackingTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index ab5c38847518..35178f888980 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1685,7 +1685,7 @@ static void computeKnownBitsFromOperator(const Operator *I,
           Known.Zero.setBitsFrom(31);
         break;
       case Intrinsic::vscale: {
-        if (!II->getParent() ||
+        if (!II->getParent() || !II->getFunction() ||
             !II->getFunction()->hasFnAttribute(Attribute::VScaleRange))
           break;
 

diff  --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 8d9df979f57f..593100cbcd43 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1606,12 +1606,22 @@ TEST_F(ComputeKnownBitsTest, ComputeKnownBitsUnknownVScale) {
   CallInst *CI = Builder.CreateCall(TheFn, {}, {}, "");
 
   KnownBits Known = computeKnownBits(CI, M.getDataLayout(), /* Depth */ 0);
-  delete CI;
+  // There is no parent function so we cannot look up the vscale_range
+  // attribute to determine the number of bits.
+  EXPECT_EQ(Known.One.getZExtValue(), 0u);
+  EXPECT_EQ(Known.Zero.getZExtValue(), 0u);
 
+  BasicBlock *BB = BasicBlock::Create(Context);
+  BB->getInstList().push_back(CI);
+  Known = computeKnownBits(CI, M.getDataLayout(), /* Depth */ 0);
   // There is no parent function so we cannot look up the vscale_range
   // attribute to determine the number of bits.
   EXPECT_EQ(Known.One.getZExtValue(), 0u);
   EXPECT_EQ(Known.Zero.getZExtValue(), 0u);
+
+  CI->removeFromParent();
+  delete CI;
+  delete BB;
 }
 
 // 512 + [32, 64) doesn't produce overlapping bits.


        


More information about the llvm-commits mailing list