
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.
147 lines
4.6 KiB
YAML
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
|
|
...
|