Skip to content

Commit ef1f27d

Browse files
committed
[GlobalIsel][X86] Legalize G_CTPOP and G_CTLZ
G_BSWAP was reverted -> added to this diff. check plan: ninja check-llvm-codegen-x86 Future work: G_SUB and G_ZEXT need some modernization. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D150677
1 parent 0f1a92b commit ef1f27d

File tree

6 files changed

+385
-28
lines changed

6 files changed

+385
-28
lines changed

llvm/lib/Target/X86/X86LegalizerInfo.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
6565
setLegalizerInfoSSE1();
6666
setLegalizerInfoSSE2();
6767
setLegalizerInfoSSE41();
68+
setLegalizerInfoSSE42();
6869
setLegalizerInfoAVX();
6970
setLegalizerInfoAVX2();
7071
setLegalizerInfoAVX512();
@@ -286,6 +287,10 @@ void X86LegalizerInfo::setLegalizerInfo64bit() {
286287
LegacyLegalizeActions::Legal);
287288
LegacyInfo.setAction({G_MERGE_VALUES, 1, s128}, LegacyLegalizeActions::Legal);
288289
LegacyInfo.setAction({G_UNMERGE_VALUES, s128}, LegacyLegalizeActions::Legal);
290+
getActionDefinitionsBuilder(G_BSWAP)
291+
.legalFor({s32, s64})
292+
.widenScalarToNextPow2(1, /*Min=*/32)
293+
.clampScalar(0, s32, s64);
289294
}
290295

291296
void X86LegalizerInfo::setLegalizerInfoSSE1() {
@@ -384,6 +389,28 @@ void X86LegalizerInfo::setLegalizerInfoSSE41() {
384389
LegacyInfo.setAction({G_MUL, v4s32}, LegacyLegalizeActions::Legal);
385390
}
386391

392+
void X86LegalizerInfo::setLegalizerInfoSSE42() {
393+
if (!Subtarget.hasSSE42())
394+
return;
395+
396+
const LLT s16 = LLT::scalar(16);
397+
const LLT s32 = LLT::scalar(32);
398+
const LLT s64 = LLT::scalar(64);
399+
400+
// popcount
401+
getActionDefinitionsBuilder(G_CTPOP)
402+
.legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
403+
.widenScalarToNextPow2(1, /*Min=*/16)
404+
.clampScalar(1, s16, s64);
405+
406+
// count leading zeros (LZCNT)
407+
getActionDefinitionsBuilder(G_CTLZ)
408+
.legalFor({{s16, s16}, {s32, s32}, {s64, s64}})
409+
.widenScalarToNextPow2(1, /*Min=*/16)
410+
.clampScalar(1, s16, s64);
411+
}
412+
413+
387414
void X86LegalizerInfo::setLegalizerInfoAVX() {
388415
if (!Subtarget.hasAVX())
389416
return;

llvm/lib/Target/X86/X86LegalizerInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class X86LegalizerInfo : public LegalizerInfo {
4141
void setLegalizerInfoSSE1();
4242
void setLegalizerInfoSSE2();
4343
void setLegalizerInfoSSE41();
44+
void setLegalizerInfoSSE42();
4445
void setLegalizerInfoAVX();
4546
void setLegalizerInfoAVX2();
4647
void setLegalizerInfoAVX512();
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
2+
# RUN: llc -mtriple=x86_64-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s
3+
4+
# test BSWAP s32 and s64
5+
6+
---
7+
name: test_bswap_s96
8+
alignment: 16
9+
legalized: false
10+
regBankSelected: false
11+
registers:
12+
- { id: 0, class: _, preferred-register: '' }
13+
- { id: 1, class: _, preferred-register: '' }
14+
body: |
15+
bb.1:
16+
; CHECK-LABEL: name: test_bswap_s96
17+
; CHECK: [[DEF:%[0-9]+]]:_(s96) = IMPLICIT_DEF
18+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s96)
19+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
20+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 -64
21+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
22+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s96) = G_TRUNC [[LSHR]](s32)
23+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s96) = COPY [[TRUNC]](s96)
24+
; CHECK-NEXT: RET 0, implicit [[COPY]](s96)
25+
%0:_(s96) = IMPLICIT_DEF
26+
%1:_(s96) = G_BSWAP %0
27+
%2:_(s96) = COPY %1(s96)
28+
RET 0, implicit %2
29+
30+
...
31+
---
32+
name: test_bswaps64
33+
alignment: 16
34+
legalized: false
35+
regBankSelected: false
36+
registers:
37+
- { id: 0, class: _, preferred-register: '' }
38+
- { id: 1, class: _, preferred-register: '' }
39+
body: |
40+
bb.1:
41+
; CHECK-LABEL: name: test_bswaps64
42+
; CHECK: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF
43+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(s64) = G_BSWAP [[DEF]]
44+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[BSWAP]](s64)
45+
; CHECK-NEXT: RET 0, implicit [[COPY]](s64)
46+
%0:_(s64) = IMPLICIT_DEF
47+
%1:_(s64) = G_BSWAP %0
48+
%2:_(s64) = COPY %1(s64)
49+
RET 0, implicit %2
50+
51+
...
52+
---
53+
name: test_bswap_s32
54+
alignment: 16
55+
legalized: false
56+
regBankSelected: false
57+
registers:
58+
- { id: 0, class: _, preferred-register: '' }
59+
- { id: 1, class: _, preferred-register: '' }
60+
body: |
61+
bb.1:
62+
; CHECK-LABEL: name: test_bswap_s32
63+
; CHECK: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF
64+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[DEF]]
65+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[BSWAP]](s32)
66+
; CHECK-NEXT: RET 0, implicit [[COPY]](s32)
67+
%0:_(s32) = IMPLICIT_DEF
68+
%1:_(s32) = G_BSWAP %0
69+
%2:_(s32) = COPY %1(s32)
70+
RET 0, implicit %2
71+
72+
...
73+
---
74+
name: test_bswap_s16
75+
alignment: 16
76+
legalized: false
77+
regBankSelected: false
78+
registers:
79+
- { id: 0, class: _, preferred-register: '' }
80+
- { id: 1, class: _, preferred-register: '' }
81+
body: |
82+
bb.1:
83+
; CHECK-LABEL: name: test_bswap_s16
84+
; CHECK: [[DEF:%[0-9]+]]:_(s16) = IMPLICIT_DEF
85+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s16)
86+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[ANYEXT]]
87+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 16
88+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s8)
89+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32)
90+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[TRUNC]](s16)
91+
; CHECK-NEXT: RET 0, implicit [[COPY]](s16)
92+
%0:_(s16) = IMPLICIT_DEF
93+
%1:_(s16) = G_BSWAP %0
94+
%2:_(s16) = COPY %1(s16)
95+
RET 0, implicit %2
96+
97+
...

llvm/test/CodeGen/X86/GlobalISel/legalize-constant.mir

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,30 @@ body: |
1919
bb.1 (%ir-block.0):
2020
; X32-LABEL: name: test_constant
2121
; X32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
22-
; X32: $eax = COPY [[C]](s32)
23-
; X32: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8
24-
; X32: $al = COPY [[C1]](s8)
25-
; X32: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16
26-
; X32: $ax = COPY [[C2]](s16)
27-
; X32: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
28-
; X32: $eax = COPY [[C3]](s32)
29-
; X32: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 64
30-
; X32: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
31-
; X32: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C4]](s32), [[C5]](s32)
32-
; X32: $rax = COPY [[MV]](s64)
33-
; X32: RET 0
22+
; X32-NEXT: $eax = COPY [[C]](s32)
23+
; X32-NEXT: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8
24+
; X32-NEXT: $al = COPY [[C1]](s8)
25+
; X32-NEXT: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16
26+
; X32-NEXT: $ax = COPY [[C2]](s16)
27+
; X32-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
28+
; X32-NEXT: $eax = COPY [[C3]](s32)
29+
; X32-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 64
30+
; X32-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
31+
; X32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C4]](s32), [[C5]](s32)
32+
; X32-NEXT: $rax = COPY [[MV]](s64)
33+
; X32-NEXT: RET 0
3434
; X64-LABEL: name: test_constant
3535
; X64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
36-
; X64: $eax = COPY [[C]](s32)
37-
; X64: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8
38-
; X64: $al = COPY [[C1]](s8)
39-
; X64: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16
40-
; X64: $ax = COPY [[C2]](s16)
41-
; X64: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
42-
; X64: $eax = COPY [[C3]](s32)
43-
; X64: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
44-
; X64: $rax = COPY [[C4]](s64)
45-
; X64: RET 0
36+
; X64-NEXT: $eax = COPY [[C]](s32)
37+
; X64-NEXT: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 8
38+
; X64-NEXT: $al = COPY [[C1]](s8)
39+
; X64-NEXT: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 16
40+
; X64-NEXT: $ax = COPY [[C2]](s16)
41+
; X64-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
42+
; X64-NEXT: $eax = COPY [[C3]](s32)
43+
; X64-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
44+
; X64-NEXT: $rax = COPY [[C4]](s64)
45+
; X64-NEXT: RET 0
4646
%0(s1) = G_CONSTANT i1 1
4747
%5:_(s32) = G_ANYEXT %0
4848
$eax = COPY %5
@@ -71,14 +71,14 @@ body: |
7171
7272
; X32-LABEL: name: test_fconstant
7373
; X32: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00
74-
; X32: $eax = COPY [[C]](s32)
75-
; X32: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
76-
; X32: $rax = COPY [[C1]](s64)
74+
; X32-NEXT: $eax = COPY [[C]](s32)
75+
; X32-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
76+
; X32-NEXT: $rax = COPY [[C1]](s64)
7777
; X64-LABEL: name: test_fconstant
7878
; X64: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00
79-
; X64: $eax = COPY [[C]](s32)
80-
; X64: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
81-
; X64: $rax = COPY [[C1]](s64)
79+
; X64-NEXT: $eax = COPY [[C]](s32)
80+
; X64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
81+
; X64-NEXT: $rax = COPY [[C1]](s64)
8282
%0(s32) = G_FCONSTANT float 1.0
8383
$eax = COPY %0
8484
%1(s64) = G_FCONSTANT double 2.0
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
2+
# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sse4.2 -run-pass=legalizer %s -o - | FileCheck %s
3+
4+
# test popcount for s16, s32, and s64
5+
6+
---
7+
name: test_ctpop35
8+
alignment: 16
9+
legalized: false
10+
regBankSelected: false
11+
registers:
12+
- { id: 0, class: _, preferred-register: '' }
13+
- { id: 1, class: _, preferred-register: '' }
14+
body: |
15+
bb.1:
16+
; CHECK-LABEL: name: test_ctpop35
17+
; CHECK: [[DEF:%[0-9]+]]:_(s35) = IMPLICIT_DEF
18+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[DEF]](s35)
19+
; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(s64) = G_CTPOP [[ZEXT]](s64)
20+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[CTPOP]](s64)
21+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s35) = COPY [[TRUNC]](s35)
22+
; CHECK-NEXT: RET 0, implicit [[COPY]](s35)
23+
%0:_(s35) = IMPLICIT_DEF
24+
%1:_(s35) = G_CTPOP %0
25+
%2:_(s35) = COPY %1(s35)
26+
RET 0, implicit %2
27+
28+
...
29+
---
30+
name: test_ctpop8
31+
alignment: 16
32+
legalized: false
33+
regBankSelected: false
34+
registers:
35+
- { id: 0, class: _, preferred-register: '' }
36+
- { id: 1, class: _, preferred-register: '' }
37+
body: |
38+
bb.1:
39+
; CHECK-LABEL: name: test_ctpop8
40+
; CHECK: [[DEF:%[0-9]+]]:_(s8) = IMPLICIT_DEF
41+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[DEF]](s8)
42+
; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(s16) = G_CTPOP [[ZEXT]](s16)
43+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[CTPOP]](s16)
44+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY [[TRUNC]](s8)
45+
; CHECK-NEXT: RET 0, implicit [[COPY]](s8)
46+
%0:_(s8) = IMPLICIT_DEF
47+
%1:_(s8) = G_CTPOP %0
48+
%2:_(s8) = COPY %1(s8)
49+
RET 0, implicit %2
50+
51+
...
52+
---
53+
name: test_ctpop64
54+
alignment: 16
55+
legalized: false
56+
regBankSelected: false
57+
registers:
58+
- { id: 0, class: _, preferred-register: '' }
59+
- { id: 1, class: _, preferred-register: '' }
60+
body: |
61+
bb.1:
62+
; CHECK-LABEL: name: test_ctpop64
63+
; CHECK: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF
64+
; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(s64) = G_CTPOP [[DEF]](s64)
65+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[CTPOP]](s64)
66+
; CHECK-NEXT: RET 0, implicit [[COPY]](s64)
67+
%0:_(s64) = IMPLICIT_DEF
68+
%1:_(s64) = G_CTPOP %0
69+
%2:_(s64) = COPY %1(s64)
70+
RET 0, implicit %2
71+
72+
...
73+
---
74+
name: test_ctpop32
75+
alignment: 16
76+
legalized: false
77+
regBankSelected: false
78+
registers:
79+
- { id: 0, class: _, preferred-register: '' }
80+
- { id: 1, class: _, preferred-register: '' }
81+
body: |
82+
bb.1:
83+
; CHECK-LABEL: name: test_ctpop32
84+
; CHECK: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF
85+
; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(s32) = G_CTPOP [[DEF]](s32)
86+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[CTPOP]](s32)
87+
; CHECK-NEXT: RET 0, implicit [[COPY]](s32)
88+
%0:_(s32) = IMPLICIT_DEF
89+
%1:_(s32) = G_CTPOP %0
90+
%2:_(s32) = COPY %1(s32)
91+
RET 0, implicit %2
92+
93+
...
94+
---
95+
name: test_ctpop16
96+
alignment: 16
97+
legalized: false
98+
regBankSelected: false
99+
registers:
100+
- { id: 0, class: _, preferred-register: '' }
101+
- { id: 1, class: _, preferred-register: '' }
102+
body: |
103+
bb.1:
104+
; CHECK-LABEL: name: test_ctpop16
105+
; CHECK: [[DEF:%[0-9]+]]:_(s16) = IMPLICIT_DEF
106+
; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(s16) = G_CTPOP [[DEF]](s16)
107+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[CTPOP]](s16)
108+
; CHECK-NEXT: RET 0, implicit [[COPY]](s16)
109+
%0:_(s16) = IMPLICIT_DEF
110+
%1:_(s16) = G_CTPOP %0
111+
%2:_(s16) = COPY %1(s16)
112+
RET 0, implicit %2
113+
114+
...

0 commit comments

Comments
 (0)