Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions llvm/include/llvm/Target/GlobalISel/Combine.td
Original file line number Diff line number Diff line change
Expand Up @@ -1791,20 +1791,24 @@ class integer_of_opcode<Instruction castOpcode> : GICombineRule <

def integer_of_truncate : integer_of_opcode<G_TRUNC>;

def cast_combines: GICombineGroup<[
def cast_of_cast_combines: GICombineGroup<[
truncate_of_zext,
truncate_of_sext,
truncate_of_anyext,
select_of_zext,
select_of_anyext,
select_of_truncate,
zext_of_zext,
zext_of_anyext,
sext_of_sext,
sext_of_anyext,
anyext_of_anyext,
anyext_of_zext,
anyext_of_sext,
anyext_of_sext
]>;

def cast_combines: GICombineGroup<[
cast_of_cast_combines,
select_of_zext,
select_of_anyext,
select_of_truncate,
buildvector_of_truncate,
narrow_binop_add,
narrow_binop_sub,
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Target/AArch64/AArch64Combine.td
Original file line number Diff line number Diff line change
Expand Up @@ -314,9 +314,9 @@ def AArch64PostLegalizerLowering
// Post-legalization combines which are primarily optimizations.
def AArch64PostLegalizerCombiner
: GICombiner<"AArch64PostLegalizerCombinerImpl",
[copy_prop, combines_for_extload,
combine_indexed_load_store,
sext_trunc_sextload, mutate_anyext_to_zext,
[copy_prop, cast_of_cast_combines, buildvector_of_truncate,
integer_of_truncate, mutate_anyext_to_zext,
combines_for_extload, combine_indexed_load_store, sext_trunc_sextload,
hoist_logic_op_with_same_opcode_hands,
redundant_and, xor_of_and_with_same_reg,
extractvecelt_pairwise_add, redundant_or,
Expand Down
21 changes: 7 additions & 14 deletions llvm/test/CodeGen/AArch64/GlobalISel/combine-cast.mir
Original file line number Diff line number Diff line change
Expand Up @@ -135,20 +135,13 @@ name: test_combine_trunc_build_vector
legalized: true
body: |
bb.1:
; CHECK-PRE-LABEL: name: test_combine_trunc_build_vector
; CHECK-PRE: %arg1:_(s64) = COPY $x0
; CHECK-PRE-NEXT: %arg2:_(s64) = COPY $x0
; CHECK-PRE-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC %arg1(s64)
; CHECK-PRE-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC %arg2(s64)
; CHECK-PRE-NEXT: %small:_(<2 x s32>) = G_BUILD_VECTOR [[TRUNC]](s32), [[TRUNC1]](s32)
; CHECK-PRE-NEXT: $x0 = COPY %small(<2 x s32>)
;
; CHECK-POST-LABEL: name: test_combine_trunc_build_vector
; CHECK-POST: %arg1:_(s64) = COPY $x0
; CHECK-POST-NEXT: %arg2:_(s64) = COPY $x0
; CHECK-POST-NEXT: %bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
; CHECK-POST-NEXT: %small:_(<2 x s32>) = G_TRUNC %bv(<2 x s64>)
; CHECK-POST-NEXT: $x0 = COPY %small(<2 x s32>)
; CHECK-LABEL: name: test_combine_trunc_build_vector
; CHECK: %arg1:_(s64) = COPY $x0
; CHECK-NEXT: %arg2:_(s64) = COPY $x0
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC %arg1(s64)
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC %arg2(s64)
; CHECK-NEXT: %small:_(<2 x s32>) = G_BUILD_VECTOR [[TRUNC]](s32), [[TRUNC1]](s32)
; CHECK-NEXT: $x0 = COPY %small(<2 x s32>)
%arg1:_(s64) = COPY $x0
%arg2:_(s64) = COPY $x0
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
Expand Down
98 changes: 29 additions & 69 deletions llvm/test/CodeGen/AArch64/GlobalISel/combine-trunc.mir
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,12 @@ legalized: true
body: |
bb.1:
liveins: $h0
; CHECK-PRE-LABEL: name: test_combine_trunc_anyext_s32_s16
; CHECK-PRE: liveins: $h0
; CHECK-PRE-NEXT: {{ $}}
; CHECK-PRE-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-PRE-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s16)
; CHECK-PRE-NEXT: $w0 = COPY [[ANYEXT]](s32)
;
; CHECK-POST-LABEL: name: test_combine_trunc_anyext_s32_s16
; CHECK-POST: liveins: $h0
; CHECK-POST-NEXT: {{ $}}
; CHECK-POST-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-POST-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s16)
; CHECK-POST-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ANYEXT]](s64)
; CHECK-POST-NEXT: $w0 = COPY [[TRUNC]](s32)
; CHECK-LABEL: name: test_combine_trunc_anyext_s32_s16
; CHECK: liveins: $h0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[COPY]](s16)
; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)
%0:_(s16) = COPY $h0
%1:_(s64) = G_ANYEXT %0(s16)
%2:_(s32) = G_TRUNC %1(s64)
Expand Down Expand Up @@ -82,20 +74,12 @@ legalized: true
body: |
bb.1:
liveins: $h0
; CHECK-PRE-LABEL: name: test_combine_trunc_sext_s32_s16
; CHECK-PRE: liveins: $h0
; CHECK-PRE-NEXT: {{ $}}
; CHECK-PRE-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-PRE-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s16)
; CHECK-PRE-NEXT: $w0 = COPY [[SEXT]](s32)
;
; CHECK-POST-LABEL: name: test_combine_trunc_sext_s32_s16
; CHECK-POST: liveins: $h0
; CHECK-POST-NEXT: {{ $}}
; CHECK-POST-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-POST-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s16)
; CHECK-POST-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[SEXT]](s64)
; CHECK-POST-NEXT: $w0 = COPY [[TRUNC]](s32)
; CHECK-LABEL: name: test_combine_trunc_sext_s32_s16
; CHECK: liveins: $h0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[COPY]](s16)
; CHECK-NEXT: $w0 = COPY [[SEXT]](s32)
%0:_(s16) = COPY $h0
%1:_(s64) = G_SEXT %0(s16)
%2:_(s32) = G_TRUNC %1(s64)
Expand All @@ -107,20 +91,12 @@ legalized: true
body: |
bb.1:
liveins: $h0
; CHECK-PRE-LABEL: name: test_combine_trunc_zext_s32_s16
; CHECK-PRE: liveins: $h0
; CHECK-PRE-NEXT: {{ $}}
; CHECK-PRE-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-PRE-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s16)
; CHECK-PRE-NEXT: $w0 = COPY [[ZEXT]](s32)
;
; CHECK-POST-LABEL: name: test_combine_trunc_zext_s32_s16
; CHECK-POST: liveins: $h0
; CHECK-POST-NEXT: {{ $}}
; CHECK-POST-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-POST-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s16)
; CHECK-POST-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ZEXT]](s64)
; CHECK-POST-NEXT: $w0 = COPY [[TRUNC]](s32)
; CHECK-LABEL: name: test_combine_trunc_zext_s32_s16
; CHECK: liveins: $h0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $h0
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[COPY]](s16)
; CHECK-NEXT: $w0 = COPY [[ZEXT]](s32)
%0:_(s16) = COPY $h0
%1:_(s64) = G_ZEXT %0(s16)
%2:_(s32) = G_TRUNC %1(s64)
Expand All @@ -132,19 +108,11 @@ legalized: true
body: |
bb.1:
liveins: $w0
; CHECK-PRE-LABEL: name: test_combine_trunc_anyext_s32_s32
; CHECK-PRE: liveins: $w0
; CHECK-PRE-NEXT: {{ $}}
; CHECK-PRE-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
; CHECK-PRE-NEXT: $w0 = COPY [[COPY]](s32)
;
; CHECK-POST-LABEL: name: test_combine_trunc_anyext_s32_s32
; CHECK-POST: liveins: $w0
; CHECK-POST-NEXT: {{ $}}
; CHECK-POST-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
; CHECK-POST-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s32)
; CHECK-POST-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ANYEXT]](s64)
; CHECK-POST-NEXT: $w0 = COPY [[TRUNC]](s32)
; CHECK-LABEL: name: test_combine_trunc_anyext_s32_s32
; CHECK: liveins: $w0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
%0:_(s32) = COPY $w0
%1:_(s64) = G_ANYEXT %0(s32)
%2:_(s32) = G_TRUNC %1(s64)
Expand All @@ -156,20 +124,12 @@ legalized: true
body: |
bb.1:
liveins: $x0
; CHECK-PRE-LABEL: name: test_combine_trunc_anyext_s32_s64
; CHECK-PRE: liveins: $x0
; CHECK-PRE-NEXT: {{ $}}
; CHECK-PRE-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
; CHECK-PRE-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
; CHECK-PRE-NEXT: $w0 = COPY [[TRUNC]](s32)
;
; CHECK-POST-LABEL: name: test_combine_trunc_anyext_s32_s64
; CHECK-POST: liveins: $x0
; CHECK-POST-NEXT: {{ $}}
; CHECK-POST-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
; CHECK-POST-NEXT: [[ANYEXT:%[0-9]+]]:_(s128) = G_ANYEXT [[COPY]](s64)
; CHECK-POST-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[ANYEXT]](s128)
; CHECK-POST-NEXT: $w0 = COPY [[TRUNC]](s32)
; CHECK-LABEL: name: test_combine_trunc_anyext_s32_s64
; CHECK: liveins: $x0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
; CHECK-NEXT: $w0 = COPY [[TRUNC]](s32)
%0:_(s64) = COPY $x0
%1:_(s128) = G_ANYEXT %0(s64)
%2:_(s32) = G_TRUNC %1(s128)
Expand Down
6 changes: 1 addition & 5 deletions llvm/test/CodeGen/AArch64/add.ll
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,7 @@ define void @v4i8(ptr %p1, ptr %p2) {
; CHECK-GI-NEXT: ushll v0.8h, v3.8b, #0
; CHECK-GI-NEXT: ushll v1.8h, v5.8b, #0
; CHECK-GI-NEXT: add v0.4h, v0.4h, v1.4h
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: fmov w8, s0
; CHECK-GI-NEXT: str w8, [x0]
; CHECK-GI-NEXT: ret
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/AArch64/and-mask-removal.ll
Original file line number Diff line number Diff line change
Expand Up @@ -530,10 +530,10 @@ define i64 @test_2_selects(i8 zeroext %a) {
; CHECK-LABEL: test_2_selects:
; CHECK: ; %bb.0:
; CHECK-NEXT: add w9, w0, #24
; CHECK-NEXT: mov w8, #131
; CHECK-NEXT: mov w8, #131 ; =0x83
; CHECK-NEXT: and w9, w9, #0xff
; CHECK-NEXT: cmp w9, #81
; CHECK-NEXT: mov w9, #57
; CHECK-NEXT: mov w9, #57 ; =0x39
; CHECK-NEXT: csel x8, x8, xzr, lo
; CHECK-NEXT: csel x9, xzr, x9, eq
; CHECK-NEXT: add x0, x8, x9
Expand Down
18 changes: 3 additions & 15 deletions llvm/test/CodeGen/AArch64/andorxor.ll
Original file line number Diff line number Diff line change
Expand Up @@ -463,11 +463,7 @@ define void @and_v4i8(ptr %p1, ptr %p2) {
; CHECK-GI-NEXT: ushll v0.8h, v3.8b, #0
; CHECK-GI-NEXT: ushll v1.8h, v5.8b, #0
; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: fmov w8, s0
; CHECK-GI-NEXT: str w8, [x0]
; CHECK-GI-NEXT: ret
Expand Down Expand Up @@ -514,11 +510,7 @@ define void @or_v4i8(ptr %p1, ptr %p2) {
; CHECK-GI-NEXT: ushll v0.8h, v3.8b, #0
; CHECK-GI-NEXT: ushll v1.8h, v5.8b, #0
; CHECK-GI-NEXT: orr v0.8b, v0.8b, v1.8b
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: fmov w8, s0
; CHECK-GI-NEXT: str w8, [x0]
; CHECK-GI-NEXT: ret
Expand Down Expand Up @@ -565,11 +557,7 @@ define void @xor_v4i8(ptr %p1, ptr %p2) {
; CHECK-GI-NEXT: ushll v0.8h, v3.8b, #0
; CHECK-GI-NEXT: ushll v1.8h, v5.8b, #0
; CHECK-GI-NEXT: eor v0.8b, v0.8b, v1.8b
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: fmov w8, s0
; CHECK-GI-NEXT: str w8, [x0]
; CHECK-GI-NEXT: ret
Expand Down
20 changes: 4 additions & 16 deletions llvm/test/CodeGen/AArch64/bitcast.ll
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,7 @@ define i32 @bitcast_v4i8_i32(<4 x i8> %a, <4 x i8> %b){
; CHECK-GI-LABEL: bitcast_v4i8_i32:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: add v0.4h, v0.4h, v1.4h
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: fmov w0, s0
; CHECK-GI-NEXT: ret
%c = add <4 x i8> %a, %b
Expand Down Expand Up @@ -116,9 +112,7 @@ define i32 @bitcast_v2i16_i32(<2 x i16> %a, <2 x i16> %b){
; CHECK-GI-LABEL: bitcast_v2i16_i32:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: add v0.2s, v0.2s, v1.2s
; CHECK-GI-NEXT: mov v1.s[0], v0.s[0]
; CHECK-GI-NEXT: mov v1.s[1], v0.s[1]
; CHECK-GI-NEXT: xtn v0.4h, v1.4s
; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
; CHECK-GI-NEXT: fmov w0, s0
; CHECK-GI-NEXT: ret
%c = add <2 x i16> %a, %b
Expand Down Expand Up @@ -418,9 +412,7 @@ define <4 x i8> @bitcast_v2i16_v4i8(<2 x i16> %a, <2 x i16> %b){
; CHECK-GI-LABEL: bitcast_v2i16_v4i8:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: add v0.2s, v0.2s, v1.2s
; CHECK-GI-NEXT: mov v1.s[0], v0.s[0]
; CHECK-GI-NEXT: mov v1.s[1], v0.s[1]
; CHECK-GI-NEXT: xtn v0.4h, v1.4s
; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
; CHECK-GI-NEXT: mov b1, v0.b[1]
; CHECK-GI-NEXT: mov v2.b[0], v0.b[0]
; CHECK-GI-NEXT: mov b3, v0.b[2]
Expand Down Expand Up @@ -455,11 +447,7 @@ define <2 x i16> @bitcast_v4i8_v2i16(<4 x i8> %a, <4 x i8> %b){
; CHECK-GI-LABEL: bitcast_v4i8_v2i16:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: add v0.4h, v0.4h, v1.4h
; CHECK-GI-NEXT: mov v1.h[0], v0.h[0]
; CHECK-GI-NEXT: mov v1.h[1], v0.h[1]
; CHECK-GI-NEXT: mov v1.h[2], v0.h[2]
; CHECK-GI-NEXT: mov v1.h[3], v0.h[3]
; CHECK-GI-NEXT: xtn v0.8b, v1.8h
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
; CHECK-GI-NEXT: mov h1, v0.h[1]
; CHECK-GI-NEXT: mov v0.h[1], v1.h[0]
; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
Expand Down
Loading