Skip to content

Commit 7c99601

Browse files
authored
[GlobalISel] Add G_CONCAT_VECTOR computeKnownBits (#141933)
Code ported from SelectionDAG::computeKnownBits.
1 parent 2a3afa2 commit 7c99601

File tree

3 files changed

+97
-4
lines changed

3 files changed

+97
-4
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,31 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
675675
}
676676
break;
677677
}
678+
case TargetOpcode::G_CONCAT_VECTORS: {
679+
if (MRI.getType(MI.getOperand(0).getReg()).isScalableVector())
680+
break;
681+
// Split DemandedElts and test each of the demanded subvectors.
682+
Known.Zero.setAllBits();
683+
Known.One.setAllBits();
684+
unsigned NumSubVectorElts =
685+
MRI.getType(MI.getOperand(1).getReg()).getNumElements();
686+
unsigned NumSubVectors = MI.getNumOperands() - 1;
687+
688+
for (unsigned i = 0; i != NumSubVectors; ++i) {
689+
APInt DemandedSub =
690+
DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
691+
if (!!DemandedSub) {
692+
computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedSub,
693+
Depth + 1);
694+
695+
Known = Known.intersectWith(Known2);
696+
}
697+
// If we don't know any bits, early out.
698+
if (Known.isUnknown())
699+
break;
700+
}
701+
break;
702+
}
678703
}
679704

680705
LLVM_DEBUG(dumpResult(MI, Known, Depth));
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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: no_knownbits
6+
body: |
7+
bb.0:
8+
9+
; CHECK-LABEL: name: @no_knownbits
10+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
11+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
12+
; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1
13+
%0:_(<2 x s8>) = COPY $h0
14+
%1:_(<2 x s8>) = COPY $h1
15+
%2:_(<4 x s8>) = G_CONCAT_VECTORS %0, %1
16+
...
17+
---
18+
name: zext_concat
19+
body: |
20+
bb.0:
21+
22+
; CHECK-LABEL: name: @zext_concat
23+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
24+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
25+
; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8
26+
; CHECK-NEXT: %zext1:_ KnownBits:00000000???????? SignBits:8
27+
; CHECK-NEXT: %res:_ KnownBits:00000000???????? SignBits:8
28+
%0:_(<2 x s8>) = COPY $h0
29+
%1:_(<2 x s8>) = COPY $h1
30+
%zext0:_(<2 x s16>) = G_ZEXT %0
31+
%zext1:_(<2 x s16>) = G_ZEXT %1
32+
%res:_(<4 x s16>) = G_CONCAT_VECTORS %zext0, %zext1
33+
...
34+
---
35+
36+
name: sext_concat
37+
body: |
38+
bb.0:
39+
40+
; CHECK-LABEL: name: @sext_concat
41+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
42+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
43+
; CHECK-NEXT: %sext0:_ KnownBits:???????????????? SignBits:9
44+
; CHECK-NEXT: %sext1:_ KnownBits:???????????????? SignBits:9
45+
; CHECK-NEXT: %res:_ KnownBits:???????????????? SignBits:1
46+
%0:_(<2 x s8>) = COPY $h0
47+
%1:_(<2 x s8>) = COPY $h1
48+
%sext0:_(<2 x s16>) = G_SEXT %0
49+
%sext1:_(<2 x s16>) = G_SEXT %1
50+
%res:_(<4 x s16>) = G_CONCAT_VECTORS %sext0, %sext1
51+
...
52+
---
53+
54+
name: mixed_ext
55+
body: |
56+
bb.0:
57+
58+
; CHECK-LABEL: name: @mixed_ext
59+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
60+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
61+
; CHECK-NEXT: %zext0:_ KnownBits:00000000???????? SignBits:8
62+
; CHECK-NEXT: %sext1:_ KnownBits:???????????????? SignBits:9
63+
; CHECK-NEXT: %res:_ KnownBits:???????????????? SignBits:1
64+
%0:_(<2 x s8>) = COPY $h0
65+
%1:_(<2 x s8>) = COPY $h1
66+
%zext0:_(<2 x s16>) = G_ZEXT %0
67+
%sext1:_(<2 x s16>) = G_SEXT %1
68+
%res:_(<4 x s16>) = G_CONCAT_VECTORS %zext0, %sext1
69+
...

llvm/test/CodeGen/AArch64/aarch64-smull.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,6 @@ define <4 x i32> @smull_zext_v4i16_v4i32(ptr %A, ptr %B) nounwind {
199199
; CHECK-GI-NEXT: fmov w9, s1
200200
; CHECK-GI-NEXT: fmov w10, s2
201201
; CHECK-GI-NEXT: fmov w11, s3
202-
; CHECK-GI-NEXT: ldr d2, [x1]
203202
; CHECK-GI-NEXT: uxtb w9, w9
204203
; CHECK-GI-NEXT: uxtb w10, w10
205204
; CHECK-GI-NEXT: uxtb w11, w11
@@ -208,9 +207,9 @@ define <4 x i32> @smull_zext_v4i16_v4i32(ptr %A, ptr %B) nounwind {
208207
; CHECK-GI-NEXT: mov v1.h[1], w11
209208
; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
210209
; CHECK-GI-NEXT: ushll v1.4s, v1.4h, #0
211-
; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
212-
; CHECK-GI-NEXT: sshll v1.4s, v2.4h, #0
213-
; CHECK-GI-NEXT: mul v0.4s, v0.4s, v1.4s
210+
; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v1.4h
211+
; CHECK-GI-NEXT: ldr d1, [x1]
212+
; CHECK-GI-NEXT: smull v0.4s, v0.4h, v1.4h
214213
; CHECK-GI-NEXT: ret
215214
%load.A = load <4 x i8>, ptr %A
216215
%load.B = load <4 x i16>, ptr %B

0 commit comments

Comments
 (0)