Skip to content

Commit 82c4169

Browse files
committed
[GlobalIsel][AArch64] Add ADDO combine to the postlegalizer combiner
1 parent dae7fb8 commit 82c4169

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

llvm/lib/Target/AArch64/AArch64Combine.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -322,5 +322,5 @@ def AArch64PostLegalizerCombiner
322322
select_to_minmax, or_to_bsp, combine_concat_vector,
323323
commute_constant_to_rhs,
324324
push_freeze_to_prevent_poison_from_propagating,
325-
combine_mul_cmlt]> {
325+
combine_mul_cmlt, match_addos]> {
326326
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
2+
# RUN: llc -mtriple aarch64 -run-pass=legalizer,aarch64-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
---
5+
name: add_s128_unknown_bits
6+
body: |
7+
bb.0:
8+
liveins: $q0, $q1
9+
; CHECK-LABEL: name: add_s128_unknown_bits
10+
; CHECK: liveins: $q0, $q1
11+
; CHECK-NEXT: {{ $}}
12+
; CHECK-NEXT: %lhs:_(s128) = COPY $q0
13+
; CHECK-NEXT: %rhs:_(s128) = COPY $q1
14+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %lhs(s128)
15+
; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %rhs(s128)
16+
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO [[UV]], [[UV2]]
17+
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE [[UV1]], [[UV3]], [[UADDO1]]
18+
; CHECK-NEXT: %res:_(s128) = G_MERGE_VALUES [[UADDO]](s64), [[UADDE]](s64)
19+
; CHECK-NEXT: $q0 = COPY %res(s128)
20+
%lhs:_(s128) = COPY $q0
21+
%rhs:_(s128) = COPY $q1
22+
%res:_(s128) = G_ADD %lhs, %rhs
23+
$q0 = COPY %res(s128)
24+
...
25+
26+
---
27+
name: add_s128_low64_known_nonzero
28+
body: |
29+
bb.0:
30+
liveins: $q0, $q1
31+
; CHECK-LABEL: name: add_s128_low64_known_nonzero
32+
; CHECK: liveins: $q0, $q1
33+
; CHECK-NEXT: {{ $}}
34+
; CHECK-NEXT: %a:_(s128) = COPY $q0
35+
; CHECK-NEXT: %rhs:_(s128) = COPY $q1
36+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
37+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %a(s128)
38+
; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %rhs(s128)
39+
; CHECK-NEXT: [[UADDO:%[0-9]+]]:_(s64), [[UADDO1:%[0-9]+]]:_(s32) = G_UADDO [[UV2]], [[C]]
40+
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE [[UV1]], [[UV3]], [[UADDO1]]
41+
; CHECK-NEXT: %res:_(s128) = G_MERGE_VALUES [[UADDO]](s64), [[UADDE]](s64)
42+
; CHECK-NEXT: $q0 = COPY %res(s128)
43+
%a:_(s128) = COPY $q0
44+
%rhs:_(s128) = COPY $q1
45+
%mask:_(s128) = G_CONSTANT i128 18446744073709551615
46+
%lhs:_(s128) = G_OR %a, %mask
47+
%res:_(s128) = G_ADD %lhs, %rhs
48+
$q0 = COPY %res(s128)
49+
...
50+
51+
---
52+
name: add_s128_low64_known_zero
53+
body: |
54+
bb.0:
55+
liveins: $q0, $q1
56+
; CHECK-LABEL: name: add_s128_low64_known_zero
57+
; CHECK: liveins: $q0, $q1
58+
; CHECK-NEXT: {{ $}}
59+
; CHECK-NEXT: %a:_(s128) = COPY $q0
60+
; CHECK-NEXT: %rhs:_(s128) = COPY $q1
61+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %a(s128)
62+
; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES %rhs(s128)
63+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
64+
; CHECK-NEXT: [[UADDE:%[0-9]+]]:_(s64), [[UADDE1:%[0-9]+]]:_(s32) = G_UADDE [[UV1]], [[UV3]], [[C]]
65+
; CHECK-NEXT: %res:_(s128) = G_MERGE_VALUES [[UV2]](s64), [[UADDE]](s64)
66+
; CHECK-NEXT: $q0 = COPY %res(s128)
67+
%a:_(s128) = COPY $q0
68+
%rhs:_(s128) = COPY $q1
69+
%mask:_(s128) = G_CONSTANT i128 -18446744073709551616
70+
%lhs:_(s128) = G_AND %a, %mask
71+
%res:_(s128) = G_ADD %lhs, %rhs
72+
$q0 = COPY %res(s128)
73+
...

llvm/test/CodeGen/AArch64/popcount.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ define i16 @popcount256(ptr nocapture nonnull readonly %0) {
113113
;
114114
; GISEL-LABEL: popcount256:
115115
; GISEL: // %bb.0: // %Entry
116-
; GISEL-NEXT: ldp x8, x9, [x0, #16]
116+
; GISEL-NEXT: ldp x8, x9, [x0]
117117
; GISEL-NEXT: mov v0.d[0], x8
118-
; GISEL-NEXT: ldp x8, x10, [x0]
118+
; GISEL-NEXT: ldp x8, x10, [x0, #16]
119119
; GISEL-NEXT: mov v1.d[0], x8
120120
; GISEL-NEXT: mov v0.d[1], x9
121121
; GISEL-NEXT: mov v1.d[1], x10

0 commit comments

Comments
 (0)