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
941 lines
34 KiB
LLVM
941 lines
34 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instcombine -S | FileCheck %s --check-prefixes=CHECK,CONSTVEC
|
|
; RUN: opt < %s -passes=instcombine -S -use-constant-int-for-fixed-length-splat | FileCheck %s --check-prefixes=CHECK,CONSTSPLAT
|
|
|
|
define i32 @add_select_cmp_and1(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and2(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 5
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 4
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 288
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and3(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and3(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 7
|
|
; CHECK-NEXT: [[TEMP1:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[TEMP1]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%temp = or disjoint i32 %sel0, %sel1
|
|
%bitop2 = and i32 %in, 4
|
|
%cmp2 = icmp eq i32 %bitop2, 0
|
|
%sel2 = select i1 %cmp2, i32 0, i32 288
|
|
%out = or disjoint i32 %temp, %sel2
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and4(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and4(
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IN:%.*]], 15
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[TMP2]], 72
|
|
; CHECK-NEXT: ret i32 [[TEMP2]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%temp = or disjoint i32 %sel0, %sel1
|
|
%bitop2 = and i32 %in, 4
|
|
%cmp2 = icmp eq i32 %bitop2, 0
|
|
%bitop3 = and i32 %in, 8
|
|
%cmp3 = icmp eq i32 %bitop3, 0
|
|
%sel2 = select i1 %cmp2, i32 0, i32 288
|
|
%sel3 = select i1 %cmp3, i32 0, i32 576
|
|
%temp2 = or disjoint i32 %sel2, %sel3
|
|
%out = or disjoint i32 %temp, %temp2
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_pred1(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_pred1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp ne i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 72, i32 0
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_pred2(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_pred2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp ne i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 144, i32 0
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_pred3(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_pred3(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp ne i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp ne i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 72, i32 0
|
|
%sel1 = select i1 %cmp1, i32 144, i32 0
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_trunc(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_trunc(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%cmp0 = trunc i32 %in to i1
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 72, i32 0
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_trunc1(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_trunc1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%cmp0 = trunc i32 %in to i1
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp ne i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 72, i32 0
|
|
%sel1 = select i1 %cmp1, i32 144, i32 0
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
|
|
define i32 @add_select_cmp_and_const_mismatch(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_const_mismatch(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and i32 [[IN]], 2
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[BITOP1]], 0
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 72
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 288
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 288
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_value_mismatch(i32 %in, i32 %in1) {
|
|
; CHECK-LABEL: @add_select_cmp_and_value_mismatch(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and i32 [[IN1:%.*]], 2
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[BITOP1]], 0
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 72
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 144
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in1, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_negative(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_negative(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[IN]], 2
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 72
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 -144
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, -2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 -144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_bitsel_overlap(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_bitsel_overlap(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 2
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 144
|
|
; CHECK-NEXT: ret i32 [[SEL0]]
|
|
;
|
|
%bitop0 = and i32 %in, 2
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 144
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
; We cannot combine into and-mul, as %bitop1 may not be exactly 6
|
|
|
|
define i32 @add_select_cmp_and_multbit_mask(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_multbit_mask(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and i32 [[IN]], 6
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[BITOP1]], 0
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 72
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 432
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 6
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = select i1 %cmp1, i32 0, i32 432
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
|
|
define <2 x i32> @add_select_cmp_vec(<2 x i32> %in) {
|
|
; CHECK-LABEL: @add_select_cmp_vec(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[IN:%.*]], splat (i32 3)
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw <2 x i32> [[TMP1]], splat (i32 72)
|
|
; CHECK-NEXT: ret <2 x i32> [[OUT]]
|
|
;
|
|
%bitop0 = and <2 x i32> %in, <i32 1, i32 1>
|
|
%cmp0 = icmp eq <2 x i32> %bitop0, <i32 0, i32 0>
|
|
%bitop1 = and <2 x i32> %in, <i32 2, i32 2>
|
|
%cmp1 = icmp eq <2 x i32> %bitop1, <i32 0, i32 0>
|
|
%sel0 = select <2 x i1> %cmp0, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 72, i32 72>
|
|
%sel1 = select <2 x i1> %cmp1, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 144, i32 144>
|
|
%out = or disjoint <2 x i32> %sel0, %sel1
|
|
ret <2 x i32> %out
|
|
}
|
|
|
|
define <2 x i32> @add_select_cmp_vec_poison(<2 x i32> %in) {
|
|
; CHECK-LABEL: @add_select_cmp_vec_poison(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and <2 x i32> [[IN:%.*]], splat (i32 1)
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq <2 x i32> [[BITOP0]], zeroinitializer
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and <2 x i32> [[IN]], splat (i32 2)
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <2 x i32> [[BITOP1]], zeroinitializer
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> zeroinitializer, <2 x i32> <i32 poison, i32 144>
|
|
; CHECK-NEXT: [[OUT:%.*]] = select <2 x i1> [[CMP0]], <2 x i32> [[SEL1]], <2 x i32> <i32 72, i32 poison>
|
|
; CHECK-NEXT: ret <2 x i32> [[OUT]]
|
|
;
|
|
%bitop0 = and <2 x i32> %in, <i32 1, i32 1>
|
|
%cmp0 = icmp eq <2 x i32> %bitop0, <i32 0, i32 0>
|
|
%bitop1 = and <2 x i32> %in, <i32 2, i32 2>
|
|
%cmp1 = icmp eq <2 x i32> %bitop1, <i32 0, i32 0>
|
|
%sel0 = select <2 x i1> %cmp0, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 72, i32 poison>
|
|
%sel1 = select <2 x i1> %cmp1, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 poison, i32 144>
|
|
%out = or disjoint <2 x i32> %sel0, %sel1
|
|
ret <2 x i32> %out
|
|
}
|
|
|
|
define <2 x i32> @add_select_cmp_vec_nonunique(<2 x i32> %in) {
|
|
; CHECK-LABEL: @add_select_cmp_vec_nonunique(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and <2 x i32> [[IN:%.*]], <i32 1, i32 2>
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq <2 x i32> [[BITOP0]], zeroinitializer
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and <2 x i32> [[IN]], <i32 4, i32 8>
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <2 x i32> [[BITOP1]], zeroinitializer
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select <2 x i1> [[CMP0]], <2 x i32> zeroinitializer, <2 x i32> <i32 72, i32 144>
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> zeroinitializer, <2 x i32> <i32 288, i32 576>
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint <2 x i32> [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret <2 x i32> [[OUT]]
|
|
;
|
|
%bitop0 = and <2 x i32> %in, <i32 1, i32 2>
|
|
%cmp0 = icmp eq <2 x i32> %bitop0, <i32 0, i32 0>
|
|
%bitop1 = and <2 x i32> %in, <i32 4, i32 8>
|
|
%cmp1 = icmp eq <2 x i32> %bitop1, <i32 0, i32 0>
|
|
%sel0 = select <2 x i1> %cmp0, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 72, i32 144>
|
|
%sel1 = select <2 x i1> %cmp1, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 288, i32 576>
|
|
%out = or disjoint <2 x i32> %sel0, %sel1
|
|
ret <2 x i32> %out
|
|
}
|
|
|
|
define i64 @mask_select_types(i32 %in) {
|
|
; CHECK-LABEL: @mask_select_types(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0_NOT:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[BITOP1:%.*]] = and i32 [[IN]], 2
|
|
; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i32 [[BITOP1]], 0
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0_NOT]], i64 0, i64 72
|
|
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1_NOT]], i64 0, i64 144
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i64 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i64 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp ne i32 %bitop0, 0
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp ne i32 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i64 72, i64 0
|
|
%sel1 = select i1 %cmp1, i64 144, i64 0
|
|
%out = or disjoint i64 %sel0, %sel1
|
|
ret i64 %out
|
|
}
|
|
|
|
define i64 @mask_select_types_1(i64 %in) {
|
|
; CHECK-LABEL: @mask_select_types_1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i64 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i64 [[OUT]]
|
|
;
|
|
%bitop0 = and i64 %in, 1
|
|
%cmp0 = icmp ne i64 %bitop0, 0
|
|
%bitop1 = and i64 %in, 2
|
|
%cmp1 = icmp ne i64 %bitop1, 0
|
|
%sel0 = select i1 %cmp0, i64 72, i64 0
|
|
%sel1 = select i1 %cmp1, i64 144, i64 0
|
|
%out = or disjoint i64 %sel0, %sel1
|
|
ret i64 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_mixed1(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_mixed1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%mask = and i32 %in, 1
|
|
%sel0 = mul i32 %mask, 72
|
|
%bitop1 = and i32 %in, 2
|
|
%cmp1 = icmp eq i32 %bitop1, 0
|
|
%sel1 = select i1 %cmp1, i32 0, i32 144
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_mixed2(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_mixed2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%mask = and i32 %in, 2
|
|
%sel0 = select i1 %cmp0, i32 0, i32 72
|
|
%sel1 = mul i32 %mask, 72
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_mul(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_mul(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%mask0 = and i32 %in, 1
|
|
%sel0 = mul i32 %mask0, 72
|
|
%mask1 = and i32 %in, 2
|
|
%sel1 = mul i32 %mask1, 72
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_mixed2_mismatch(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_mixed2_mismatch(
|
|
; CHECK-NEXT: [[BITOP0:%.*]] = and i32 [[IN:%.*]], 1
|
|
; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i32 [[BITOP0]], 0
|
|
; CHECK-NEXT: [[MASK:%.*]] = and i32 [[IN]], 2
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[CMP0]], i32 0, i32 73
|
|
; CHECK-NEXT: [[SEL1:%.*]] = mul nuw nsw i32 [[MASK]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%bitop0 = and i32 %in, 1
|
|
%cmp0 = icmp eq i32 %bitop0, 0
|
|
%mask = and i32 %in, 2
|
|
%sel0 = select i1 %cmp0, i32 0, i32 73
|
|
%sel1 = mul i32 %mask, 72
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @add_select_cmp_and_mul_mismatch(i32 %in) {
|
|
; CHECK-LABEL: @add_select_cmp_and_mul_mismatch(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[IN:%.*]] to i1
|
|
; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[TMP1]], i32 73, i32 0
|
|
; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[IN]], 2
|
|
; CHECK-NEXT: [[SEL1:%.*]] = mul nuw nsw i32 [[MASK1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[SEL0]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%mask0 = and i32 %in, 1
|
|
%sel0 = mul i32 %mask0, 73
|
|
%mask1 = and i32 %in, 2
|
|
%sel1 = mul i32 %mask1, 72
|
|
%out = or disjoint i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @and_mul_non_disjoint(i32 %in) {
|
|
; CHECK-LABEL: @and_mul_non_disjoint(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 2
|
|
; CHECK-NEXT: [[OUT:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[IN]], 4
|
|
; CHECK-NEXT: [[SEL1:%.*]] = mul nuw nsw i32 [[MASK1]], 72
|
|
; CHECK-NEXT: [[OUT1:%.*]] = or i32 [[OUT]], [[SEL1]]
|
|
; CHECK-NEXT: ret i32 [[OUT1]]
|
|
;
|
|
%mask0 = and i32 %in, 2
|
|
%sel0 = mul i32 %mask0, 72
|
|
%mask1 = and i32 %in, 4
|
|
%sel1 = mul i32 %mask1, 72
|
|
%out = or i32 %sel0, %sel1
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @unrelated_ops(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp, %temp3
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops1(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @unrelated_ops1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops2(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[TMP2]], [[IN4:%.*]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[IN2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN3:%.*]], [[IN2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops3(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops3(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 2
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND0]], 0
|
|
; CHECK-NEXT: [[TEMP:%.*]] = select i1 [[CMP]], i32 0, i32 144
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[TEMP]], [[IN3:%.*]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[TMP2]], 72
|
|
; CHECK-NEXT: [[TEMP4:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TEMP4]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 2
|
|
%cmp = icmp eq i32 %and0, 0
|
|
%temp = select i1 %cmp, i32 0, i32 144
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops4(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops4(
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IN:%.*]], 12
|
|
; CHECK-NEXT: [[TMP3:%.*]] = mul nuw nsw i32 [[TMP2]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN4:%.*]], [[TMP3]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 2
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND1]], 0
|
|
; CHECK-NEXT: [[IN3:%.*]] = select i1 [[CMP]], i32 0, i32 144
|
|
; CHECK-NEXT: [[TMP4:%.*]] = or disjoint i32 [[IN3]], [[IN2:%.*]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TMP4]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 12
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%and1 = and i32 %in, 2
|
|
%cmp = icmp eq i32 %and1, 0
|
|
%temp2 = select i1 %cmp, i32 0, i32 144
|
|
%temp4 = or disjoint i32 %temp2, %in3
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops5(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops5(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 2
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND0]], 0
|
|
; CHECK-NEXT: [[IN3:%.*]] = select i1 [[CMP]], i32 0, i32 144
|
|
; CHECK-NEXT: [[TMP4:%.*]] = or disjoint i32 [[IN3]], [[IN2:%.*]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 4
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[AND1]], 0
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = select i1 [[CMP2]], i32 0, i32 288
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN4:%.*]], [[TEMP2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP4]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 2
|
|
%cmp = icmp eq i32 %and0, 0
|
|
%temp = select i1 %cmp, i32 0, i32 144
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 4
|
|
%cmp2 = icmp eq i32 %and1, 0
|
|
%temp2 = select i1 %cmp2, i32 0, i32 288
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops6(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops6(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN4:%.*]], [[TMP2]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[IN2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN3:%.*]], [[IN2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %in3, %temp
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops7(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops7(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN4:%.*]], [[TMP2]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[IN3:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN3]], [[IN2:%.*]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %in3, %temp
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %temp2, %in2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops8(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops8(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[TMP2]], [[IN4:%.*]]
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[IN3:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN3]], [[IN2:%.*]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %temp2, %in2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops_nocombine(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops_nocombine(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TMP4:%.*]] = or disjoint i32 [[TEMP]], [[IN3:%.*]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IN]], 7
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[TMP2]], 72
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP4]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 7
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_ops_nocombine1(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @unrelated_ops_nocombine1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TMP4:%.*]] = or disjoint i32 [[TEMP]], [[IN3:%.*]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[TMP2]], 36
|
|
; CHECK-NEXT: [[TMP3:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP2]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP4]], [[TMP3]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 36
|
|
%temp4 = or disjoint i32 %in2, %temp2
|
|
%out = or disjoint i32 %temp3, %temp4
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_nondisjoint(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @unrelated_nondisjoint(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or i32 [[TEMP3]], [[TEMP2]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or i32 %temp3, %temp2
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @unrelated_nondisjoint1(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @unrelated_nondisjoint1(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or i32 [[IN2:%.*]], [[TEMP]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TEMP2]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
ret i32 %out
|
|
}
|
|
|
|
declare void @use(i32)
|
|
|
|
define i32 @multi_use(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[OUT]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %out)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use1(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use1(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TEMP2]]
|
|
; CHECK-NEXT: call void @use(i32 [[TEMP3]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %temp3)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use2(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use2(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[IN2:%.*]], [[TEMP]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[TEMP2]]
|
|
; CHECK-NEXT: call void @use(i32 [[TEMP3]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %temp3)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use3(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use3(
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN:%.*]], 12
|
|
; CHECK-NEXT: [[TEMP2:%.*]] = mul nuw nsw i32 [[AND1]], 72
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[TEMP2]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %temp2)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use4(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use4(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[TEMP]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %temp)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use5(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use5(
|
|
; CHECK-NEXT: [[AND1:%.*]] = and i32 [[IN:%.*]], 12
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[AND1]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %and1)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use6(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use6(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[AND0]], 72
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[TEMP]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %temp)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @multi_use7(i32 %in, i32 %in2) {
|
|
; CHECK-LABEL: @multi_use7(
|
|
; CHECK-NEXT: [[AND0:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN]], 15
|
|
; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TMP2]], [[IN2:%.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[AND0]])
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%and1 = and i32 %in, 12
|
|
%temp2 = mul nuw nsw i32 %and1, 72
|
|
%temp3 = or disjoint i32 %in2, %temp
|
|
%out = or disjoint i32 %temp3, %temp2
|
|
call void @use(i32 %and0)
|
|
ret i32 %out
|
|
}
|
|
|
|
define i32 @no_chain(i32 %in, i32 %in2, i32 %in3) {
|
|
; CHECK-LABEL: @no_chain(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IN:%.*]], 3
|
|
; CHECK-NEXT: [[TEMP:%.*]] = mul nuw nsw i32 [[TMP1]], 72
|
|
; CHECK-NEXT: [[TEMP3:%.*]] = or disjoint i32 [[TEMP]], [[IN3:%.*]]
|
|
; CHECK-NEXT: [[OUT:%.*]] = or disjoint i32 [[TEMP3]], [[IN2:%.*]]
|
|
; CHECK-NEXT: ret i32 [[OUT]]
|
|
;
|
|
%and0 = and i32 %in, 3
|
|
%temp = mul nuw nsw i32 %and0, 72
|
|
%temp3 = or disjoint i32 %temp, %in3
|
|
%out = or disjoint i32 %temp3, %in2
|
|
ret i32 %out
|
|
}
|
|
|
|
define <2 x i64> @issue199506_1(i64 %idx) {
|
|
; CHECK-LABEL: @issue199506_1(
|
|
; CHECK-NEXT: [[B0:%.*]] = and i64 [[IDX:%.*]], 1
|
|
; CHECK-NEXT: [[C0:%.*]] = icmp eq i64 [[B0]], 0
|
|
; CHECK-NEXT: [[B1:%.*]] = and i64 [[IDX]], 2
|
|
; CHECK-NEXT: [[C1:%.*]] = icmp eq i64 [[B1]], 0
|
|
; CHECK-NEXT: [[HI:%.*]] = select i1 [[C1]], <2 x i64> zeroinitializer, <2 x i64> splat (i64 -6148914691236517206)
|
|
; CHECK-NEXT: [[LO:%.*]] = select i1 [[C0]], <2 x i64> zeroinitializer, <2 x i64> splat (i64 6148914691236517205)
|
|
; CHECK-NEXT: [[OR:%.*]] = or disjoint <2 x i64> [[HI]], [[LO]]
|
|
; CHECK-NEXT: ret <2 x i64> [[OR]]
|
|
;
|
|
%b0 = and i64 %idx, 1
|
|
%c0 = icmp eq i64 %b0, 0
|
|
%b1 = and i64 %idx, 2
|
|
%c1 = icmp eq i64 %b1, 0
|
|
%hi = select i1 %c1, <2 x i64> zeroinitializer, <2 x i64> splat (i64 -6148914691236517206) ; 0xAAAA…
|
|
%lo = select i1 %c0, <2 x i64> zeroinitializer, <2 x i64> splat (i64 6148914691236517205) ; 0x5555…
|
|
%or = or <2 x i64> %hi, %lo
|
|
ret <2 x i64> %or
|
|
}
|
|
|
|
define <2 x i64> @issue199506_2(i64 %idx) {
|
|
; CHECK-LABEL: @issue199506_2(
|
|
; CHECK-NEXT: [[B0:%.*]] = and i64 [[IDX:%.*]], 1
|
|
; CHECK-NEXT: [[C0_NOT:%.*]] = icmp eq i64 [[B0]], 0
|
|
; CHECK-NEXT: [[B1:%.*]] = and i64 [[IDX]], 2
|
|
; CHECK-NEXT: [[C1_NOT:%.*]] = icmp eq i64 [[B1]], 0
|
|
; CHECK-NEXT: [[HI:%.*]] = select i1 [[C1_NOT]], <2 x i64> zeroinitializer, <2 x i64> splat (i64 -6148914691236517206)
|
|
; CHECK-NEXT: [[LO:%.*]] = select i1 [[C0_NOT]], <2 x i64> zeroinitializer, <2 x i64> splat (i64 6148914691236517205)
|
|
; CHECK-NEXT: [[OR:%.*]] = or disjoint <2 x i64> [[HI]], [[LO]]
|
|
; CHECK-NEXT: ret <2 x i64> [[OR]]
|
|
;
|
|
%b0 = and i64 %idx, 1
|
|
%c0 = icmp ne i64 %b0, 0
|
|
%b1 = and i64 %idx, 2
|
|
%c1 = icmp ne i64 %b1, 0
|
|
%hi = select i1 %c1, <2 x i64> splat (i64 -6148914691236517206), <2 x i64> zeroinitializer
|
|
%lo = select i1 %c0, <2 x i64> splat (i64 6148914691236517205), <2 x i64> zeroinitializer
|
|
%or = or <2 x i64> %hi, %lo
|
|
ret <2 x i64> %or
|
|
}
|
|
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; CONSTSPLAT: {{.*}}
|
|
; CONSTVEC: {{.*}}
|