CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
274 lines
7.9 KiB
LLVM
274 lines
7.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
|
|
|
define i8 @add-shl-sdiv-scalar0(i8 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-scalar0(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 4
|
|
; CHECK-NEXT: ret i8 [[RZ]]
|
|
;
|
|
%sd = sdiv i8 %x, -4
|
|
%sl = shl i8 %sd, 2
|
|
%rz = add i8 %sl, %x
|
|
ret i8 %rz
|
|
}
|
|
|
|
define i8 @add-shl-sdiv-scalar0_commuted(i8 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-scalar0_commuted(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 4
|
|
; CHECK-NEXT: ret i8 [[RZ]]
|
|
;
|
|
%sd = sdiv i8 %x, -4
|
|
%sl = shl i8 %sd, 2
|
|
%rz = add i8 %x, %sl
|
|
ret i8 %rz
|
|
}
|
|
|
|
define i8 @add-shl-sdiv-scalar1(i8 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-scalar1(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 64
|
|
; CHECK-NEXT: ret i8 [[RZ]]
|
|
;
|
|
%sd = sdiv i8 %x, -64
|
|
%sl = shl i8 %sd, 6
|
|
%rz = add i8 %sl, %x
|
|
ret i8 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-scalar2(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-scalar2(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X:%.*]], 1073741824
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -1073741824
|
|
%sl = shl i32 %sd, 30
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
; Splat vectors
|
|
|
|
define <3 x i8> @add-shl-sdiv-splat0(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-splat0(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem <3 x i8> [[X:%.*]], splat (i8 4)
|
|
; CHECK-NEXT: ret <3 x i8> [[RZ]]
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|
|
|
|
define <4 x i32> @add-shl-sdiv-splat1(<4 x i32> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-splat1(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem <4 x i32> [[X:%.*]], splat (i32 1073741824)
|
|
; CHECK-NEXT: ret <4 x i32> [[RZ]]
|
|
;
|
|
%sd = sdiv <4 x i32> %x, <i32 -1073741824, i32 -1073741824, i32 -1073741824, i32 -1073741824>
|
|
%sl = shl <4 x i32> %sd, <i32 30, i32 30, i32 30, i32 30>
|
|
%rz = add <4 x i32> %sl, %x
|
|
ret <4 x i32> %rz
|
|
}
|
|
|
|
define <2 x i64> @add-shl-sdiv-splat2(<2 x i64> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-splat2(
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem <2 x i64> [[X:%.*]], splat (i64 32)
|
|
; CHECK-NEXT: ret <2 x i64> [[RZ]]
|
|
;
|
|
%sd = sdiv <2 x i64> %x, <i64 -32, i64 -32>
|
|
%sl = shl <2 x i64> %sd, <i64 5, i64 5>
|
|
%rz = add <2 x i64> %sl, %x
|
|
ret <2 x i64> %rz
|
|
}
|
|
|
|
; One-use tests
|
|
|
|
declare void @use32(i32)
|
|
define i32 @add-shl-sdiv-i32-4-use0(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-i32-4-use0(
|
|
; CHECK-NEXT: call void @use32(i32 [[X:%.*]])
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
call void @use32(i32 %x)
|
|
%sd = sdiv i32 %x, -16
|
|
%sl = shl i32 %sd, 4
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-i32-use1(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-i32-use1(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16
|
|
; CHECK-NEXT: call void @use32(i32 [[SD]])
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -16
|
|
call void @use32(i32 %sd)
|
|
%sl = shl i32 %sd, 4
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-i32-use2(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-i32-use2(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16
|
|
; CHECK-NEXT: [[SL:%.*]] = shl i32 [[SD]], 4
|
|
; CHECK-NEXT: call void @use32(i32 [[SL]])
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -16
|
|
%sl = shl i32 %sd, 4
|
|
call void @use32(i32 %sl)
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-i32-use3(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-i32-use3(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16
|
|
; CHECK-NEXT: call void @use32(i32 [[SD]])
|
|
; CHECK-NEXT: [[SL:%.*]] = shl i32 [[SD]], 4
|
|
; CHECK-NEXT: call void @use32(i32 [[SL]])
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -16
|
|
call void @use32(i32 %sd)
|
|
%sl = shl i32 %sd, 4
|
|
call void @use32(i32 %sl)
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
declare void @use3xi8(<3 x i8>)
|
|
define <3 x i8> @add-shl-sdiv-use4(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-use4(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)
|
|
; CHECK-NEXT: call void @use3xi8(<3 x i8> [[SD]])
|
|
; CHECK-NEXT: [[RZ:%.*]] = srem <3 x i8> [[X]], splat (i8 4)
|
|
; CHECK-NEXT: ret <3 x i8> [[RZ]]
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>
|
|
call void @use3xi8(<3 x i8> %sd)
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|
|
|
|
; Negative
|
|
|
|
define i8 @add-shl-sdiv-negative0(i8 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-negative0(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv i8 [[X:%.*]], 4
|
|
; CHECK-NEXT: [[SL:%.*]] = shl nsw i8 [[SD]], 2
|
|
; CHECK-NEXT: [[RZ:%.*]] = add i8 [[SL]], [[X]]
|
|
; CHECK-NEXT: ret i8 [[RZ]]
|
|
;
|
|
%sd = sdiv i8 %x, 4
|
|
%sl = shl i8 %sd, 2
|
|
%rz = add i8 %sl, %x
|
|
ret i8 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-negative1(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-negative1(
|
|
; CHECK-NEXT: [[RZ:%.*]] = sub i32 0, [[X:%.*]]
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -1
|
|
%sl = shl i32 %sd, 1
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
define i32 @add-shl-sdiv-negative2(i32 %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-negative2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], -2147483648
|
|
; CHECK-NEXT: [[SL:%.*]] = select i1 [[TMP1]], i32 -2147483648, i32 0
|
|
; CHECK-NEXT: [[RZ:%.*]] = add i32 [[SL]], [[X]]
|
|
; CHECK-NEXT: ret i32 [[RZ]]
|
|
;
|
|
%sd = sdiv i32 %x, -2147483648
|
|
%sl = shl i32 %sd, 31
|
|
%rz = add i32 %sl, %x
|
|
ret i32 %rz
|
|
}
|
|
|
|
define <3 x i8> @add-shl-sdiv-negative3(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-negative3(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -5)
|
|
; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], splat (i8 2)
|
|
; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]
|
|
; CHECK-NEXT: ret <3 x i8> [[RZ]]
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -5, i8 -5, i8 -5>
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|
|
|
|
define <2 x i64> @add-shl-sdiv-negative4(<2 x i64> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-negative4(
|
|
; CHECK-NEXT: ret <2 x i64> poison
|
|
;
|
|
%sd = sdiv <2 x i64> %x, <i64 32, i64 32>
|
|
%sl = shl <2 x i64> %sd, <i64 -5, i64 -5>
|
|
%rz = add <2 x i64> %sl, %x
|
|
ret <2 x i64> %rz
|
|
}
|
|
|
|
; Vectors with undef values
|
|
|
|
define <3 x i8> @add-shl-sdiv-3xi8-undef0(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-3xi8-undef0(
|
|
; CHECK-NEXT: ret <3 x i8> poison
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -4, i8 undef, i8 -4>
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|
|
|
|
define <3 x i8> @add-shl-sdiv-3xi8-undef1(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-3xi8-undef1(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)
|
|
; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], <i8 2, i8 undef, i8 2>
|
|
; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]
|
|
; CHECK-NEXT: ret <3 x i8> [[RZ]]
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 undef, i8 2>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|
|
|
|
; Non-splat vectors
|
|
|
|
define <2 x i64> @add-shl-sdiv-nonsplat0(<2 x i64> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-nonsplat0(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv <2 x i64> [[X:%.*]], <i64 -32, i64 -64>
|
|
; CHECK-NEXT: [[SL:%.*]] = shl <2 x i64> [[SD]], <i64 5, i64 6>
|
|
; CHECK-NEXT: [[RZ:%.*]] = add <2 x i64> [[SL]], [[X]]
|
|
; CHECK-NEXT: ret <2 x i64> [[RZ]]
|
|
;
|
|
%sd = sdiv <2 x i64> %x, <i64 -32, i64 -64>
|
|
%sl = shl <2 x i64> %sd, <i64 5, i64 6>
|
|
%rz = add <2 x i64> %sl, %x
|
|
ret <2 x i64> %rz
|
|
}
|
|
|
|
define <3 x i8> @add-shl-sdiv-nonsplat1(<3 x i8> %x) {
|
|
; CHECK-LABEL: @add-shl-sdiv-nonsplat1(
|
|
; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)
|
|
; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], <i8 2, i8 2, i8 3>
|
|
; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]
|
|
; CHECK-NEXT: ret <3 x i8> [[RZ]]
|
|
;
|
|
%sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>
|
|
%sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 3>
|
|
%rz = add <3 x i8> %sl, %x
|
|
ret <3 x i8> %rz
|
|
}
|