Skip to content

Commit a1aaa61

Browse files
committed
[GlobalISel] Combine G_ZEXT of undef -> 0
Pull out of llvm#113616 Legality checks for CombinerHelper::replaceInstWithConstant.
1 parent 3fc0d94 commit a1aaa61

File tree

6 files changed

+29
-24
lines changed

6 files changed

+29
-24
lines changed

llvm/include/llvm/Target/GlobalISel/Combine.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ def binop_right_undef_to_undef: GICombineRule<
412412

413413
def unary_undef_to_zero: GICombineRule<
414414
(defs root:$root),
415-
(match (wip_match_opcode G_ABS):$root,
415+
(match (wip_match_opcode G_ABS, G_ZEXT):$root,
416416
[{ return Helper.matchOperandIsUndef(*${root}, 1); }]),
417417
(apply [{ Helper.replaceInstWithConstant(*${root}, 0); }])>;
418418

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2916,8 +2916,11 @@ void CombinerHelper::replaceInstWithFConstant(MachineInstr &MI, double C) {
29162916

29172917
void CombinerHelper::replaceInstWithConstant(MachineInstr &MI, int64_t C) {
29182918
assert(MI.getNumDefs() == 1 && "Expected only one def?");
2919-
Builder.buildConstant(MI.getOperand(0), C);
2920-
MI.eraseFromParent();
2919+
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
2920+
if (isConstantLegalOrBeforeLegalizer(DstTy)) {
2921+
Builder.buildConstant(MI.getOperand(0), C);
2922+
MI.eraseFromParent();
2923+
}
29212924
}
29222925

29232926
void CombinerHelper::replaceInstWithConstant(MachineInstr &MI, APInt C) {

llvm/test/CodeGen/AArch64/GlobalISel/combine-cast.mir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,19 @@ body: |
217217
%large:_(<2 x s64>) = G_ANYEXT %bv(<2 x s32>)
218218
$q0 = COPY %large(<2 x s64>)
219219
$d0 = COPY %bv(<2 x s32>)
220+
...
221+
---
222+
name: test_combine_zext_undef
223+
legalized: true
224+
body: |
225+
bb.1:
226+
; CHECK-LABEL: name: test_combine_zext_undef
227+
; CHECK: %undef:_(<2 x s32>) = G_IMPLICIT_DEF
228+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
229+
; CHECK-NEXT: %large:_(<2 x s64>) = G_BUILD_VECTOR [[C]](s64), [[C]](s64)
230+
; CHECK-NEXT: $q0 = COPY %large(<2 x s64>)
231+
; CHECK-NEXT: $d0 = COPY %undef(<2 x s32>)
232+
%undef:_(<2 x s32>) = G_IMPLICIT_DEF
233+
%large:_(<2 x s64>) = G_ZEXT %undef(<2 x s32>)
234+
$q0 = COPY %large(<2 x s64>)
235+
$d0 = COPY %undef(<2 x s32>)

llvm/test/CodeGen/AArch64/extract-vector-elt.ll

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,10 @@
88
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v4i32_vector_extract_const
99

1010
define i64 @extract_v2i64_undef_index(<2 x i64> %a, i32 %c) {
11-
; CHECK-SD-LABEL: extract_v2i64_undef_index:
12-
; CHECK-SD: // %bb.0: // %entry
13-
; CHECK-SD-NEXT: fmov x0, d0
14-
; CHECK-SD-NEXT: ret
15-
;
16-
; CHECK-GI-LABEL: extract_v2i64_undef_index:
17-
; CHECK-GI: // %bb.0: // %entry
18-
; CHECK-GI-NEXT: str q0, [sp, #-16]!
19-
; CHECK-GI-NEXT: .cfi_def_cfa_offset 16
20-
; CHECK-GI-NEXT: ldr x0, [sp], #16
21-
; CHECK-GI-NEXT: ret
11+
; CHECK-LABEL: extract_v2i64_undef_index:
12+
; CHECK: // %bb.0: // %entry
13+
; CHECK-NEXT: fmov x0, d0
14+
; CHECK-NEXT: ret
2215
entry:
2316
%d = extractelement <2 x i64> %a, i32 undef
2417
ret i64 %d

llvm/test/CodeGen/AMDGPU/GlobalISel/combine-amdgpu-cvt-f32-ubyte.mir

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,7 @@ body: |
261261
; CHECK-LABEL: name: cvt_f32_ubyte0_zext_lshr_16
262262
; CHECK: liveins: $vgpr0
263263
; CHECK-NEXT: {{ $}}
264-
; CHECK-NEXT: %shift:_(s16) = G_IMPLICIT_DEF
265-
; CHECK-NEXT: %zext:_(s32) = G_ZEXT %shift(s16)
264+
; CHECK-NEXT: %zext:_(s32) = G_CONSTANT i32 0
266265
; CHECK-NEXT: %result:_(s32) = G_AMDGPU_CVT_F32_UBYTE0 %zext
267266
; CHECK-NEXT: $vgpr0 = COPY %result(s32)
268267
%arg:_(s32) = COPY $vgpr0
@@ -284,8 +283,7 @@ body: |
284283
; CHECK-LABEL: name: cvt_f32_ubyte0_zext_lshr_24
285284
; CHECK: liveins: $vgpr0
286285
; CHECK-NEXT: {{ $}}
287-
; CHECK-NEXT: %shift:_(s16) = G_IMPLICIT_DEF
288-
; CHECK-NEXT: %zext:_(s32) = G_ZEXT %shift(s16)
286+
; CHECK-NEXT: %zext:_(s32) = G_CONSTANT i32 0
289287
; CHECK-NEXT: %result:_(s32) = G_AMDGPU_CVT_F32_UBYTE0 %zext
290288
; CHECK-NEXT: $vgpr0 = COPY %result(s32)
291289
%arg:_(s32) = COPY $vgpr0

llvm/test/CodeGen/AMDGPU/shrink-add-sub-constant.ll

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3962,14 +3962,12 @@ define amdgpu_kernel void @v_test_v2i16_x_add_undef_neg32(ptr addrspace(1) %out,
39623962
; VI-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
39633963
; VI-GISEL-NEXT: flat_load_dword v3, v[0:1]
39643964
; VI-GISEL-NEXT: v_mov_b32_e32 v0, s0
3965+
; VI-GISEL-NEXT: v_mov_b32_e32 v1, s1
39653966
; VI-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
39663967
; VI-GISEL-NEXT: v_not_b32_e32 v2, 31
3967-
; VI-GISEL-NEXT: v_mov_b32_e32 v1, s1
3968-
; VI-GISEL-NEXT: s_and_b32 s0, 0xffff, s0
39693968
; VI-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
39703969
; VI-GISEL-NEXT: s_waitcnt vmcnt(0)
39713970
; VI-GISEL-NEXT: v_add_u16_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3972-
; VI-GISEL-NEXT: v_or_b32_e32 v2, s0, v2
39733971
; VI-GISEL-NEXT: flat_store_dword v[0:1], v2
39743972
; VI-GISEL-NEXT: s_endpgm
39753973
;
@@ -4079,15 +4077,12 @@ define amdgpu_kernel void @v_test_v2i16_x_add_neg32_undef(ptr addrspace(1) %out,
40794077
; VI-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
40804078
; VI-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
40814079
; VI-GISEL-NEXT: flat_load_dword v3, v[0:1]
4082-
; VI-GISEL-NEXT: s_and_b32 s2, 0xffff, s0
40834080
; VI-GISEL-NEXT: v_mov_b32_e32 v0, s0
40844081
; VI-GISEL-NEXT: v_mov_b32_e32 v1, s1
40854082
; VI-GISEL-NEXT: v_add_u32_e32 v0, vcc, v0, v2
4086-
; VI-GISEL-NEXT: s_lshl_b32 s0, s2, 16
40874083
; VI-GISEL-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
40884084
; VI-GISEL-NEXT: s_waitcnt vmcnt(0)
40894085
; VI-GISEL-NEXT: v_add_u16_e32 v2, 0xffe0, v3
4090-
; VI-GISEL-NEXT: v_or_b32_e32 v2, s0, v2
40914086
; VI-GISEL-NEXT: flat_store_dword v[0:1], v2
40924087
; VI-GISEL-NEXT: s_endpgm
40934088
;

0 commit comments

Comments
 (0)