Skip to content

Commit c2f0af5

Browse files
authored
[GISelValueTracking] Add test case for G_PTRTOINT
While we can only reason about the index/address, the G_PTRTOINT operations returns all representation bits, so we can't assume the remaining ones are all zeroes. This behaviour was clarified as part of the discussion in https://discourse.llvm.org/t/clarifiying-the-semantics-of-ptrtoint/83987/54. The LangRef semantics of ptrtoint being a full representation bitcast were documented in #139349. Prior to 77c8d21 we were incorrectly assuming known zeroes beyond the index size even if the input was completely unknown. This commit adds a test case for G_PTRTOINT which was omitted from that change. See #139598 Reviewed By: arsenm Pull Request: #139608
1 parent 66f533e commit c2f0af5

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=amdgcn -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
3+
## Check that we don't incorrectly assume known zeroes for and extend of a truncated ptrtoint
4+
## Test case for https://github.com/llvm/llvm-project/issues/139598
5+
---
6+
## We should see 128 unknown bits.
7+
name: PtrToInt
8+
body: |
9+
bb.0:
10+
; CHECK-LABEL: name: @PtrToInt
11+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
12+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
13+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
14+
; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
15+
; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
16+
; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
17+
%0:_(s32) = COPY $vgpr0
18+
%1:_(s32) = COPY $vgpr1
19+
%2:_(s32) = COPY $vgpr2
20+
%3:_(s32) = COPY $vgpr3
21+
%4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32)
22+
%5:_(s128) = G_PTRTOINT %4(p8)
23+
...
24+
---
25+
## We should see 128 high zeroes followed by 128 unknown bits for extending ptrtoint.
26+
name: PtrToIntExt
27+
body: |
28+
bb.0:
29+
; CHECK-LABEL: name: @PtrToIntExt
30+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
31+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
32+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
33+
; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
34+
; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
35+
; CHECK-NEXT: %5:_ KnownBits:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:128
36+
%0:_(s32) = COPY $vgpr0
37+
%1:_(s32) = COPY $vgpr1
38+
%2:_(s32) = COPY $vgpr2
39+
%3:_(s32) = COPY $vgpr3
40+
%4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32)
41+
%5:_(s256) = G_PTRTOINT %4(p8)
42+
...
43+
---
44+
## We should see 48 unknown bits for truncating ptrtoint.
45+
name: PtrToIntTrunc
46+
body: |
47+
bb.0:
48+
; CHECK-LABEL: name: @PtrToIntTrunc
49+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
50+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
51+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
52+
; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
53+
; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
54+
; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????? SignBits:1
55+
%0:_(s32) = COPY $vgpr0
56+
%1:_(s32) = COPY $vgpr1
57+
%2:_(s32) = COPY $vgpr2
58+
%3:_(s32) = COPY $vgpr3
59+
%4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32)
60+
%5:_(s48) = G_PTRTOINT %4(p8)
61+
...
62+
---
63+
## This is the test for issue 139598: Truncating and then extending the
64+
## G_PTRTOINT result was filling all bits above the index bitwidth with known
65+
## zeroes even though the incoming value is completely unknown and G_PTRTOINT.
66+
## is lowered to a bitwise copy.
67+
## We should see all zero high bits with 48 unknown bits.
68+
name: PtrToIntTruncExplicitExt
69+
body: |
70+
bb.0:
71+
; CHECK-LABEL: name: @PtrToIntTruncExplicitExt
72+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
73+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
74+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
75+
; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
76+
; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
77+
; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
78+
; CHECK-NEXT: %6:_ KnownBits:???????????????????????????????????????????????? SignBits:1
79+
; CHECK-NEXT: %7:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????? SignBits:208
80+
%0:_(s32) = COPY $vgpr0
81+
%1:_(s32) = COPY $vgpr1
82+
%2:_(s32) = COPY $vgpr2
83+
%3:_(s32) = COPY $vgpr3
84+
%4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32)
85+
%5:_(s128) = G_PTRTOINT %4(p8)
86+
%6:_(s48) = G_TRUNC %5(s128)
87+
%7:_(s256) = G_ZEXT %6(s48)
88+
...
89+
---
90+
## Same test again but this time have the G_PTRTOINT do the truncation.
91+
## We should see all zero high bits with 48 unknown bits.
92+
name: PtrToIntTruncImplicitExt
93+
body: |
94+
bb.0:
95+
; CHECK-LABEL: name: @PtrToIntTruncImplicitExt
96+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
97+
; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1
98+
; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1
99+
; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1
100+
; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1
101+
; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????? SignBits:1
102+
; CHECK-NEXT: %6:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????? SignBits:208
103+
%0:_(s32) = COPY $vgpr0
104+
%1:_(s32) = COPY $vgpr1
105+
%2:_(s32) = COPY $vgpr2
106+
%3:_(s32) = COPY $vgpr3
107+
%4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32)
108+
%5:_(s48) = G_PTRTOINT %4(p8)
109+
%6:_(s256) = G_ZEXT %5(s48)
110+
...

0 commit comments

Comments
 (0)