llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-shift-amount-zext.mir
Pierre van Houtryve 4e63e0457c
[AMDGPU] Canonicalize G_ZEXT of the shift amount in RegBankCombiner (#131792)
Canonicalize it to a G_AND instead so that ISel patterns can pick it
up and ignore it, as the shift instructions only read low bits.
G_ZEXT would be lowered to a v/s_and anyway in most cases.

I'm also looking at making a DAG version of this in a separate patch.
2025-05-14 10:48:51 +02:00

147 lines
4.6 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=amdgcn -run-pass=amdgpu-regbank-combiner %s -o - | FileCheck %s
---
name: lshr_zext_i16
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: lshr_zext_i16
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 65535
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_LSHR %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s16) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_LSHR %src, %zextamt
$sgpr0 = COPY %res
...
---
name: ashr_zext_i16
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: ashr_zext_i16
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 65535
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_ASHR %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s16) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_ASHR %src, %zextamt
$sgpr0 = COPY %res
...
---
name: shl_zext_i16
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: shl_zext_i16
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 65535
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_SHL %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s16) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_SHL %src, %zextamt
$sgpr0 = COPY %res
...
---
name: lshr_zext_i8
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: lshr_zext_i8
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 255
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_LSHR %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s8) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_LSHR %src, %zextamt
$sgpr0 = COPY %res
...
---
name: ashr_zext_i8
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: ashr_zext_i8
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 255
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_ASHR %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s8) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_ASHR %src, %zextamt
$sgpr0 = COPY %res
...
---
name: shl_zext_i8
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr0, $sgpr1
; CHECK-LABEL: name: shl_zext_i8
; CHECK: liveins: $sgpr0, $sgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %src:sgpr(s32) = COPY $sgpr0
; CHECK-NEXT: %regamt:sgpr(s32) = COPY $sgpr1
; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 255
; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s32) = G_AND %regamt, [[C]]
; CHECK-NEXT: %res:sgpr(s32) = G_SHL %src, [[AND]](s32)
; CHECK-NEXT: $sgpr0 = COPY %res(s32)
%src:sgpr(s32) = COPY $sgpr0
%regamt:sgpr(s32) = COPY $sgpr1
%amt:sgpr(s8) = G_TRUNC %regamt
%zextamt:sgpr(s32) = G_ZEXT %amt
%res:sgpr(s32) = G_SHL %src, %zextamt
$sgpr0 = COPY %res
...