Skip to content

Commit 77c8d21

Browse files
authored
[GlobalISel] Fix ZExt known bits for scalable vectors. (#140213)
It was using the full size of the vector as the SrcBitWidth. This patch changes the code to split G_ASSERT_ZEXT away from the others (G_INTTOPTR / G_PTRTOINT / G_ZEXT / G_TRUNC) which are simpler, and make the code match the SDAG equivalent.
1 parent 76c9bfe commit 77c8d21

File tree

4 files changed

+212
-16
lines changed

4 files changed

+212
-16
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -481,27 +481,22 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
481481
break;
482482
// Fall through and handle them the same as zext/trunc.
483483
[[fallthrough]];
484-
case TargetOpcode::G_ASSERT_ZEXT:
485484
case TargetOpcode::G_ZEXT:
486485
case TargetOpcode::G_TRUNC: {
487486
Register SrcReg = MI.getOperand(1).getReg();
488-
LLT SrcTy = MRI.getType(SrcReg);
489-
unsigned SrcBitWidth;
490-
491-
// G_ASSERT_ZEXT stores the original bitwidth in the immediate operand.
492-
if (Opcode == TargetOpcode::G_ASSERT_ZEXT)
493-
SrcBitWidth = MI.getOperand(2).getImm();
494-
else {
495-
SrcBitWidth = SrcTy.isPointer()
496-
? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
497-
: SrcTy.getSizeInBits();
498-
}
499-
assert(SrcBitWidth && "SrcBitWidth can't be zero");
500-
Known = Known.zextOrTrunc(SrcBitWidth);
501487
computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
502488
Known = Known.zextOrTrunc(BitWidth);
503-
if (BitWidth > SrcBitWidth)
504-
Known.Zero.setBitsFrom(SrcBitWidth);
489+
break;
490+
}
491+
case TargetOpcode::G_ASSERT_ZEXT: {
492+
Register SrcReg = MI.getOperand(1).getReg();
493+
computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
494+
495+
unsigned SrcBitWidth = MI.getOperand(2).getImm();
496+
assert(SrcBitWidth && "SrcBitWidth can't be zero");
497+
APInt InMask = APInt::getLowBitsSet(BitWidth, SrcBitWidth);
498+
Known.Zero |= (~InMask);
499+
Known.One &= (~Known.Zero);
505500
break;
506501
}
507502
case TargetOpcode::G_ASSERT_ALIGN: {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple aarch64 -mattr=+sve -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
3+
4+
---
5+
name: ScalarConst
6+
body: |
7+
bb.0:
8+
; CHECK-LABEL: name: @ScalarConst
9+
; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000001111000 SignBits:25
10+
; CHECK-NEXT: %1:_ KnownBits:00000000000000000000000001111000 SignBits:25
11+
%0:_(s32) = G_CONSTANT i32 120
12+
%1:_(s32) = G_ASSERT_ZEXT %0(s32), 16
13+
...
14+
---
15+
name: ScalarVar
16+
body: |
17+
bb.0:
18+
; CHECK-LABEL: name: @ScalarVar
19+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
20+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
21+
%0:_(s32) = COPY $w0
22+
%1:_(s32) = G_ASSERT_ZEXT %0(s32), 16
23+
...
24+
---
25+
name: VectorCst
26+
body: |
27+
bb.0:
28+
; CHECK-LABEL: name: @VectorCst
29+
; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000001111000 SignBits:25
30+
; CHECK-NEXT: %1:_ KnownBits:00000000000000000000000001111000 SignBits:25
31+
; CHECK-NEXT: %2:_ KnownBits:00000000000000000000000001111000 SignBits:25
32+
%0:_(s32) = G_CONSTANT i32 120
33+
%1:_(<4 x s32>) = G_BUILD_VECTOR %0, %0, %0, %0
34+
%2:_(<4 x s32>) = G_ASSERT_ZEXT %1(<4 x s32>), 16
35+
...
36+
---
37+
name: VectorVar
38+
body: |
39+
bb.0:
40+
; CHECK-LABEL: name: @VectorVar
41+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
42+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
43+
%0:_(<4 x s32>) = COPY $q0
44+
%1:_(<4 x s32>) = G_ASSERT_ZEXT %0(<4 x s32>), 16
45+
...
46+
---
47+
name: ScalableCst
48+
body: |
49+
bb.0:
50+
; CHECK-LABEL: name: @ScalableCst
51+
; CHECK-NEXT: %0:_ KnownBits:00000000000000000000000001111000 SignBits:25
52+
; CHECK-NEXT: %1:_ KnownBits:00000000000000000000000001111000 SignBits:25
53+
; CHECK-NEXT: %2:_ KnownBits:00000000000000000000000001111000 SignBits:25
54+
%0:_(s32) = G_CONSTANT i32 120
55+
%1:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %0
56+
%2:_(<vscale x 4 x s32>) = G_ASSERT_ZEXT %1(<vscale x 4 x s32>), 16
57+
...
58+
---
59+
name: ScalableVar
60+
body: |
61+
bb.0:
62+
; CHECK-LABEL: name: @ScalableVar
63+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
64+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
65+
%0:_(<vscale x 4 x s32>) = COPY $z0
66+
%1:_(<vscale x 4 x s32>) = G_ASSERT_ZEXT %0(<vscale x 4 x s32>), 16
67+
...
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
3+
4+
---
5+
name: ScalarConst
6+
body: |
7+
bb.0:
8+
; CHECK-LABEL: name: @ScalarConst
9+
; CHECK-NEXT: %0:_ KnownBits:10101001100001110110010101000011 SignBits:1
10+
; CHECK-NEXT: %1:_ KnownBits:0110010101000011 SignBits:1
11+
%0:_(s32) = G_CONSTANT i32 2844222787
12+
%1:_(s16) = G_TRUNC %0(s32)
13+
...
14+
---
15+
name: ScalarVar
16+
body: |
17+
bb.0:
18+
; CHECK-LABEL: name: @ScalarVar
19+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
20+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:1
21+
%0:_(s32) = COPY $w0
22+
%1:_(s16) = G_TRUNC %0(s32)
23+
...
24+
---
25+
name: VectorCst
26+
body: |
27+
bb.0:
28+
; CHECK-LABEL: name: @VectorCst
29+
; CHECK-NEXT: %0:_ KnownBits:10101001100001110110010101000011 SignBits:1
30+
; CHECK-NEXT: %1:_ KnownBits:10101001100001110110010101000011 SignBits:1
31+
; CHECK-NEXT: %2:_ KnownBits:0110010101000011 SignBits:1
32+
%0:_(s32) = G_CONSTANT i32 2844222787
33+
%1:_(<4 x s32>) = G_BUILD_VECTOR %0, %0, %0, %0
34+
%2:_(<4 x s16>) = G_TRUNC %1(<4 x s32>)
35+
...
36+
---
37+
name: VectorVar
38+
body: |
39+
bb.0:
40+
; CHECK-LABEL: name: @VectorVar
41+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
42+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:1
43+
%0:_(<4 x s32>) = COPY $q0
44+
%1:_(<4 x s16>) = G_TRUNC %0(<4 x s32>)
45+
...
46+
---
47+
name: ScalableCst
48+
body: |
49+
bb.0:
50+
; CHECK-LABEL: name: @ScalableCst
51+
; CHECK-NEXT: %0:_ KnownBits:10101001100001110110010101000011 SignBits:1
52+
; CHECK-NEXT: %1:_ KnownBits:10101001100001110110010101000011 SignBits:1
53+
; CHECK-NEXT: %2:_ KnownBits:0110010101000011 SignBits:1
54+
%0:_(s32) = G_CONSTANT i32 2844222787
55+
%1:_(<vscale x 4 x s32>) = G_SPLAT_VECTOR %0
56+
%2:_(<vscale x 4 x s16>) = G_TRUNC %1(<vscale x 4 x s32>)
57+
...
58+
---
59+
name: ScalableVar
60+
body: |
61+
bb.0:
62+
; CHECK-LABEL: name: @ScalableVar
63+
; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1
64+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:1
65+
%0:_(<vscale x 4 x s32>) = COPY $z0
66+
%1:_(<vscale x 4 x s16>) = G_TRUNC %0(<vscale x 4 x s32>)
67+
...
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple aarch64 -mattr=+sve -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
3+
4+
---
5+
name: ScalarConst
6+
body: |
7+
bb.0:
8+
; CHECK-LABEL: name: @ScalarConst
9+
; CHECK-NEXT: %0:_ KnownBits:0000000000001010 SignBits:12
10+
; CHECK-NEXT: %1:_ KnownBits:00000000000000000000000000001010 SignBits:28
11+
%0:_(s16) = G_CONSTANT i16 10
12+
%1:_(s32) = G_ZEXT %0(s16)
13+
...
14+
---
15+
name: ScalarVar
16+
body: |
17+
bb.0:
18+
; CHECK-LABEL: name: @ScalarVar
19+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
20+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
21+
%0:_(s16) = COPY $h0
22+
%1:_(s32) = G_ZEXT %0(s16)
23+
...
24+
---
25+
name: VectorCst
26+
body: |
27+
bb.0:
28+
; CHECK-LABEL: name: @VectorCst
29+
; CHECK-NEXT: %0:_ KnownBits:0000000000001010 SignBits:12
30+
; CHECK-NEXT: %1:_ KnownBits:0000000000001010 SignBits:12
31+
; CHECK-NEXT: %2:_ KnownBits:00000000000000000000000000001010 SignBits:28
32+
%0:_(s16) = G_CONSTANT i16 10
33+
%1:_(<4 x s16>) = G_BUILD_VECTOR %0, %0, %0, %0
34+
%2:_(<4 x s32>) = G_ZEXT %1(<4 x s16>)
35+
...
36+
---
37+
name: VectorVar
38+
body: |
39+
bb.0:
40+
; CHECK-LABEL: name: @VectorVar
41+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
42+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
43+
%0:_(<4 x s16>) = COPY $d0
44+
%1:_(<4 x s32>) = G_ZEXT %0(<4 x s16>)
45+
...
46+
---
47+
name: ScalableCst
48+
body: |
49+
bb.0:
50+
; CHECK-LABEL: name: @ScalableCst
51+
; CHECK-NEXT: %0:_ KnownBits:0000000000001010 SignBits:12
52+
; CHECK-NEXT: %1:_ KnownBits:0000000000001010 SignBits:1
53+
; CHECK-NEXT: %2:_ KnownBits:00000000000000000000000000001010 SignBits:28
54+
%0:_(s16) = G_CONSTANT i16 10
55+
%1:_(<vscale x 4 x s16>) = G_SPLAT_VECTOR %0
56+
%2:_(<vscale x 4 x s32>) = G_ZEXT %1(<vscale x 4 x s16>)
57+
...
58+
---
59+
name: ScalableVar
60+
body: |
61+
bb.0:
62+
; CHECK-LABEL: name: @ScalableVar
63+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
64+
; CHECK-NEXT: %1:_ KnownBits:0000000000000000???????????????? SignBits:16
65+
%0:_(<vscale x 4 x s16>) = COPY $z0
66+
%1:_(<vscale x 4 x s32>) = G_ZEXT %0(<vscale x 4 x s16>)
67+
...

0 commit comments

Comments
 (0)