[llvm-branch-commits] [GIselValueTracking] Correctly truncate/zext G_PTRTOADDR (PR #143816)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jun 11 16:52:11 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-globalisel

@llvm/pr-subscribers-backend-amdgpu

Author: Alexander Richardson (arichardson)

<details>
<summary>Changes</summary>

G_PTRTOADDR is defined to return a zero-extended pointer address, so in
case of ptr addrspace(8) 48 bits follwed by zeroes. Fixes the
PtrToAddrExt test case in knownbits-ptrtoaddr.mir.


---
Full diff: https://github.com/llvm/llvm-project/pull/143816.diff


2 Files Affected:

- (modified) llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp (+12-1) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/knownbits-ptrtoaddr.mir (+1-2) 


``````````diff
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 0fe2a0955883c..cac8400e79637 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -489,9 +489,20 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
     Known = KnownBits::shl(LHSKnown, RHSKnown);
     break;
   }
+  case TargetOpcode::G_PTRTOADDR: {
+    if (DstTy.isVector())
+      break;
+    Register SrcReg = MI.getOperand(1).getReg();
+    computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
+    unsigned PtrAS = MRI.getType(SrcReg).getAddressSpace();
+    unsigned AddrWidth = DL.getAddressSizeInBits(PtrAS);
+    if (AddrWidth < BitWidth)
+      Known = Known.trunc(AddrWidth);
+    Known = Known.zextOrTrunc(BitWidth);
+    break;
+  }
   case TargetOpcode::G_INTTOPTR:
   case TargetOpcode::G_PTRTOINT:
-  case TargetOpcode::G_PTRTOADDR:
     if (DstTy.isVector())
       break;
     // Fall through and handle them the same as zext/trunc.
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/knownbits-ptrtoaddr.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/knownbits-ptrtoaddr.mir
index 3fcd24ca0d031..df14fae1082ce 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/knownbits-ptrtoaddr.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/knownbits-ptrtoaddr.mir
@@ -22,7 +22,6 @@ body:             |
 ...
 ---
 ## We should see 208 high zeroes followed by 48 unknown bits for extending PtrToAddr.
-## FIXME: this is currently wrong
 name:            PtrToAddrExt
 body:             |
   bb.0:
@@ -32,7 +31,7 @@ body:             |
   ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
   ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
   ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
-  ; CHECK-NEXT: %5:_ KnownBits:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:128
+  ; CHECK-NEXT: %5:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????? SignBits:208
     %0:_(s32) = COPY $vgpr0
     %1:_(s32) = COPY $vgpr1
     %2:_(s32) = COPY $vgpr2

``````````

</details>


https://github.com/llvm/llvm-project/pull/143816


More information about the llvm-branch-commits mailing list