[llvm-branch-commits] [llvm] a89e04e - [ValueTracking] Add additional tests for computeKnownBits on GEPs (NFC)

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Feb 11 14:17:49 PST 2025


Author: Nikita Popov
Date: 2025-02-11T14:15:45-08:00
New Revision: a89e04e7f0caa28d607e38099b905063b47a88fb

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

LOG: [ValueTracking] Add additional tests for computeKnownBits on GEPs (NFC)

These demonstrate miscompiles in the existing code.

(cherry picked from commit 3dc1ef1650c8389a6f195a474781cf2281208bed)

Added: 
    

Modified: 
    llvm/unittests/Analysis/ValueTrackingTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index ee44aac45594d..39865fa195cf7 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -2679,6 +2679,41 @@ TEST_F(ComputeKnownBitsTest, ComputeKnownBitsAbsoluteSymbol) {
   EXPECT_EQ(0u, Known_0_256_Align8.countMinTrailingOnes());
 }
 
+TEST_F(ComputeKnownBitsTest, ComputeKnownBitsGEPExtendBeforeMul) {
+  // FIXME: The index should be extended before multiplying with the scale.
+  parseAssembly(R"(
+    target datalayout = "p:16:16:16"
+
+    define void @test(i16 %arg) {
+      %and = and i16 %arg, u0x8000
+      %base = inttoptr i16 %and to ptr
+      %A = getelementptr i32, ptr %base, i8 80
+      ret void
+    }
+    )");
+  KnownBits Known = computeKnownBits(A, M->getDataLayout());
+  EXPECT_EQ(~64 & 0x7fff, Known.Zero);
+  EXPECT_EQ(64, Known.One);
+}
+
+TEST_F(ComputeKnownBitsTest, ComputeKnownBitsGEPOnlyIndexBits) {
+  // FIXME: GEP should only affect the index width.
+  parseAssembly(R"(
+    target datalayout = "p:16:16:16:8"
+
+    define void @test(i16 %arg) {
+      %and = and i16 %arg, u0x8000
+      %or = or i16 %and, u0x00ff
+      %base = inttoptr i16 %or to ptr
+      %A = getelementptr i8, ptr %base, i8 1
+      ret void
+    }
+    )");
+  KnownBits Known = computeKnownBits(A, M->getDataLayout());
+  EXPECT_EQ(0x7eff, Known.Zero);
+  EXPECT_EQ(0x100, Known.One);
+}
+
 TEST_F(ValueTrackingTest, HaveNoCommonBitsSet) {
   {
     // Check for an inverted mask: (X & ~M) op (Y & M).


        


More information about the llvm-branch-commits mailing list