Skip to content

Commit a46edff

Browse files
authored
[GlobalISel] Add G_ABS computeKnownBits (#154413)
The code is taken from `SelectionDAG::computeKnownBits`. This ticks off ABS from #150515
1 parent 26192f0 commit a46edff

File tree

4 files changed

+98
-20
lines changed

4 files changed

+98
-20
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,14 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
675675
}
676676
break;
677677
}
678+
case TargetOpcode::G_ABS: {
679+
Register SrcReg = MI.getOperand(1).getReg();
680+
computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
681+
Known = Known.abs();
682+
Known.Zero.setHighBits(computeNumSignBits(SrcReg, DemandedElts, Depth + 1) -
683+
1);
684+
break;
685+
}
678686
}
679687

680688
LLVM_DEBUG(dumpResult(MI, Known, Depth));
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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>' -filetype=null %s 2>&1 | FileCheck %s
3+
4+
---
5+
name: Cst
6+
body: |
7+
bb.0:
8+
; CHECK-LABEL: name: @Cst
9+
; CHECK-NEXT: %0:_ KnownBits:00010011 SignBits:3
10+
; CHECK-NEXT: %1:_ KnownBits:00010011 SignBits:3
11+
%0:_(s8) = G_CONSTANT i8 19
12+
%1:_(s8) = G_ABS %0
13+
...
14+
---
15+
name: CstNeg
16+
body: |
17+
bb.0:
18+
; CHECK-LABEL: name: @CstNeg
19+
; CHECK-NEXT: %0:_ KnownBits:11101110 SignBits:3
20+
; CHECK-NEXT: %1:_ KnownBits:00010010 SignBits:3
21+
%0:_(s8) = G_CONSTANT i8 238
22+
%1:_(s8) = G_ABS %0
23+
...
24+
---
25+
name: SplatVecCst
26+
body: |
27+
bb.0:
28+
; CHECK-LABEL: name: @SplatVecCst
29+
; CHECK-NEXT: %0:_ KnownBits:11111010 SignBits:5
30+
; CHECK-NEXT: %1:_ KnownBits:11111010 SignBits:5
31+
; CHECK-NEXT: %2:_ KnownBits:00000110 SignBits:5
32+
%0:_(s8) = G_CONSTANT i8 250
33+
%1:_(<vscale x 16 x s8>) = G_SPLAT_VECTOR %0(s8)
34+
%2:_(<vscale x 16 x s8>) = G_ABS %1
35+
...
36+
---
37+
name: VecCst
38+
body: |
39+
bb.0:
40+
; CHECK-LABEL: name: @VecCst
41+
; CHECK-NEXT: %0:_ KnownBits:00011001 SignBits:3
42+
; CHECK-NEXT: %1:_ KnownBits:11100001 SignBits:3
43+
; CHECK-NEXT: %2:_ KnownBits:?????001 SignBits:3
44+
; CHECK-NEXT: %3:_ KnownBits:00?????1 SignBits:2
45+
%0:_(s8) = G_CONSTANT i8 25
46+
%1:_(s8) = G_CONSTANT i8 225
47+
%2:_(<2 x s8>) = G_BUILD_VECTOR %0:_(s8), %1:_(s8)
48+
%3:_(<2 x s8>) = G_ABS %2
49+
...
50+
---
51+
name: ImplicitDef
52+
body: |
53+
bb.0:
54+
; CHECK-LABEL: name: @ImplicitDef
55+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
56+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
57+
%0:_(s8) = G_IMPLICIT_DEF
58+
%1:_(s8) = G_ABS %0
59+
...
60+
---
61+
name: CstSext
62+
body: |
63+
bb.0:
64+
; CHECK-LABEL: name: @CstSext
65+
; CHECK-NEXT: %0:_ KnownBits:11000111 SignBits:2
66+
; CHECK-NEXT: %1:_ KnownBits:1111111111000111 SignBits:10
67+
; CHECK-NEXT: %2:_ KnownBits:0000000000111001 SignBits:10
68+
%0:_(s8) = G_CONSTANT i8 199
69+
%1:_(s16) = G_SEXT %0
70+
%2:_(s16) = G_ABS %1
71+
...
72+
---
73+
name: ImplicitDefSext
74+
body: |
75+
bb.0:
76+
; CHECK-LABEL: name: @ImplicitDefSext
77+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
78+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:9
79+
; CHECK-NEXT: %2:_ KnownBits:00000000???????? SignBits:8
80+
%0:_(s8) = G_IMPLICIT_DEF
81+
%1:_(s16) = G_SEXT %0
82+
%2:_(s16) = G_ABS %1
83+
...

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-abs.mir

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,8 @@ body: |
302302
; SI-NEXT: [[ABS:%[0-9]+]]:_(s32) = G_ABS [[SEXT_INREG]]
303303
; SI-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s32) = G_SEXT_INREG [[LSHR]], 16
304304
; SI-NEXT: [[ABS1:%[0-9]+]]:_(s32) = G_ABS [[SEXT_INREG1]]
305-
; SI-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
306-
; SI-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ABS]], [[C1]]
307-
; SI-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ABS1]], [[C1]]
308-
; SI-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C]](s32)
309-
; SI-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
305+
; SI-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ABS1]], [[C]](s32)
306+
; SI-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[ABS]], [[SHL]]
310307
; SI-NEXT: [[BITCAST1:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[OR]](s32)
311308
; SI-NEXT: $vgpr0 = COPY [[BITCAST1]](<2 x s16>)
312309
;
@@ -429,16 +426,11 @@ body: |
429426
; SI-NEXT: [[ABS2:%[0-9]+]]:_(s32) = G_ABS [[SEXT_INREG2]]
430427
; SI-NEXT: [[SEXT_INREG3:%[0-9]+]]:_(s32) = G_SEXT_INREG [[LSHR1]], 16
431428
; SI-NEXT: [[ABS3:%[0-9]+]]:_(s32) = G_ABS [[SEXT_INREG3]]
432-
; SI-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
433-
; SI-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ABS]], [[C1]]
434-
; SI-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[ABS1]], [[C1]]
435-
; SI-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C]](s32)
436-
; SI-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
429+
; SI-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ABS1]], [[C]](s32)
430+
; SI-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[ABS]], [[SHL]]
437431
; SI-NEXT: [[BITCAST2:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[OR]](s32)
438-
; SI-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[ABS2]], [[C1]]
439-
; SI-NEXT: [[AND3:%[0-9]+]]:_(s32) = G_AND [[ABS3]], [[C1]]
440-
; SI-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[AND3]], [[C]](s32)
441-
; SI-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL1]]
432+
; SI-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[ABS3]], [[C]](s32)
433+
; SI-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[ABS2]], [[SHL1]]
442434
; SI-NEXT: [[BITCAST3:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[OR1]](s32)
443435
; SI-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s16>) = G_CONCAT_VECTORS [[BITCAST2]](<2 x s16>), [[BITCAST3]](<2 x s16>)
444436
; SI-NEXT: $vgpr0_vgpr1 = COPY [[CONCAT_VECTORS]](<4 x s16>)

llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.abs.ll

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,6 @@ define amdgpu_cs <2 x i16> @abs_sgpr_v2i16(<2 x i16> inreg %arg) {
459459
; GFX8-NEXT: s_sext_i32_i16 s0, s0
460460
; GFX8-NEXT: s_abs_i32 s1, s1
461461
; GFX8-NEXT: s_abs_i32 s0, s0
462-
; GFX8-NEXT: s_and_b32 s1, 0xffff, s1
463-
; GFX8-NEXT: s_and_b32 s0, 0xffff, s0
464462
; GFX8-NEXT: s_lshl_b32 s1, s1, 16
465463
; GFX8-NEXT: s_or_b32 s0, s0, s1
466464
; GFX8-NEXT: ; return to shader part epilog
@@ -548,12 +546,9 @@ define amdgpu_cs <3 x i16> @abs_sgpr_v3i16(<3 x i16> inreg %arg) {
548546
; GFX8-NEXT: s_abs_i32 s2, s2
549547
; GFX8-NEXT: s_abs_i32 s0, s0
550548
; GFX8-NEXT: s_sext_i32_i16 s1, s1
551-
; GFX8-NEXT: s_and_b32 s2, 0xffff, s2
552-
; GFX8-NEXT: s_abs_i32 s1, s1
553-
; GFX8-NEXT: s_and_b32 s0, 0xffff, s0
554549
; GFX8-NEXT: s_lshl_b32 s2, s2, 16
550+
; GFX8-NEXT: s_abs_i32 s1, s1
555551
; GFX8-NEXT: s_or_b32 s0, s0, s2
556-
; GFX8-NEXT: s_and_b32 s1, 0xffff, s1
557552
; GFX8-NEXT: ; return to shader part epilog
558553
;
559554
; GFX10-LABEL: abs_sgpr_v3i16:

0 commit comments

Comments
 (0)