[llvm] c79c2b4 - InstCombine: Add some baseline tests for ldexp combines
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 22 11:22:06 PDT 2023
Author: Matt Arsenault
Date: 2023-06-22T14:22:01-04:00
New Revision: c79c2b41c19ce5f42bc0df9bdb40ce32db562c7d
URL: https://github.com/llvm/llvm-project/commit/c79c2b41c19ce5f42bc0df9bdb40ce32db562c7d
DIFF: https://github.com/llvm/llvm-project/commit/c79c2b41c19ce5f42bc0df9bdb40ce32db562c7d.diff
LOG: InstCombine: Add some baseline tests for ldexp combines
Added:
llvm/test/Transforms/InstCombine/ldexp.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/ldexp.ll b/llvm/test/Transforms/InstCombine/ldexp.ll
new file mode 100644
index 0000000000000..49cea9b305c1e
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/ldexp.ll
@@ -0,0 +1,336 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -S -passes=instcombine < %s | FileCheck %s
+
+declare float @llvm.ldexp.f32.i32(float, i32)
+declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)
+declare float @llvm.ldexp.f32.i64(float, i64)
+
+; select c, (ldexp val, e0), (ldexp val, e1) -> ldexp val, (select c, e0, e1)
+define float @select_ldexp_f32_sameval_
diff erentexp(i1 %cond, float %val, i32 %exp0, i32 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_selectflags(i1 %cond, float %val, i32 %exp0, i32 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_selectflags
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select nnan i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ %select = select nnan i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_ldexp_intersect_flags(i1 %cond, float %val, i32 %exp0, i32 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_ldexp_intersect_flags
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call nnan nsz float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_ldexp_intersect_flags_union_select(i1 %cond, float %val, i32 %exp0, i32 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_ldexp_intersect_flags_union_select
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call nnan nsz float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select ninf i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ %select = select ninf i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_multiuse0(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_multiuse0
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: store float [[LDEXP0]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ store float %ldexp0, ptr %ptr
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_multiuse1(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_multiuse1
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: store float [[LDEXP1]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ store float %ldexp1, ptr %ptr
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_multiuse_both(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr0, ptr %ptr1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_multiuse_both
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR0:%.*]], ptr [[PTR1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: store float [[LDEXP0]], ptr [[PTR0]], align 4
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])
+; CHECK-NEXT: store float [[LDEXP1]], ptr [[PTR1]], align 4
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ store float %ldexp0, ptr %ptr0
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)
+ store float %ldexp1, ptr %ptr1
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+; select c, (ldexp val0, e), (ldexp val1, ee) -> ldexp (select c, val0, val1), e
+define float @select_ldexp_f32_
diff erentval_sameexp(i1 %cond, float %val0, float %val1, i32 %exp) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_sameexp_selectflags(i1 %cond, float %val0, float %val1, i32 %exp) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp_selectflags
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select nnan i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ %select = select nnan i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_sameexp_ldexp_intersect_flags(i1 %cond, float %val0, float %val1, i32 %exp) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp_ldexp_intersect_flags
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call nnan nsz float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_sameexp_ldexp_intersect_flags_unino_select(i1 %cond, float %val0, float %val1, i32 %exp) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp_ldexp_intersect_flags_unino_select
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call nnan nsz float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select ninf i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ %select = select ninf i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_sameexp_multiuse0(i1 %cond, float %val0, float %val1, i32 %exp, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp_multiuse0
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: store float [[LDEXP0]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ store float %ldexp0, ptr %ptr
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_sameexp_multiuse1(i1 %cond, float %val0, float %val1, i32 %exp, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_sameexp_multiuse1
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])
+; CHECK-NEXT: store float [[LDEXP1]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)
+ store float %ldexp1, ptr %ptr
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_
diff erentexp(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_
diff erentexp
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse0(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse0
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])
+; CHECK-NEXT: store float [[LDEXP0]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)
+ store float %ldexp0, ptr %ptr
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse1(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse1
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])
+; CHECK-NEXT: store float [[LDEXP1]], ptr [[PTR]], align 4
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)
+ store float %ldexp1, ptr %ptr
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse_both(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr0, ptr %ptr1) {
+; CHECK-LABEL: define float @select_ldexp_f32_
diff erentval_
diff erentexp_multiuse_both
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR0:%.*]], ptr [[PTR1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])
+; CHECK-NEXT: store float [[LDEXP0]], ptr [[PTR0]], align 4
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])
+; CHECK-NEXT: store float [[LDEXP1]], ptr [[PTR1]], align 4
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)
+ store float %ldexp0, ptr %ptr0
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)
+ store float %ldexp1, ptr %ptr1
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define <2 x float> @select_ldexp_v2f32_sameval_
diff erentexp(<2 x i1> %cond, <2 x float> %val, <2 x i32> %exp0, <2 x i32> %exp1) {
+; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_sameval_
diff erentexp
+; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL:%.*]], <2 x i32> [[EXP0:%.*]], <2 x i32> [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL]], <2 x i32> [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL]], <2 x i32> [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> [[COND]], <2 x float> [[LDEXP0]], <2 x float> [[LDEXP1]]
+; CHECK-NEXT: ret <2 x float> [[SELECT]]
+;
+ %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp0)
+ %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp1)
+ %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1
+ ret <2 x float> %select
+}
+
+define <2 x float> @select_ldexp_v2f32_
diff erentval_sameexp(<2 x i1> %cond, <2 x float> %val0, <2 x float> %val1, <2 x i32> %exp) {
+; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_
diff erentval_sameexp
+; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL0:%.*]], <2 x float> [[VAL1:%.*]], <2 x i32> [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL0]], <2 x i32> [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL1]], <2 x i32> [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> [[COND]], <2 x float> [[LDEXP0]], <2 x float> [[LDEXP1]]
+; CHECK-NEXT: ret <2 x float> [[SELECT]]
+;
+ %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val0, <2 x i32> %exp)
+ %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val1, <2 x i32> %exp)
+ %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1
+ ret <2 x float> %select
+}
+
+define <2 x float> @select_ldexp_v2f32_
diff erentval_
diff erentexp(<2 x i1> %cond, <2 x float> %val0, <2 x float> %val1, <2 x i32> %exp0, <2 x i32> %exp1) {
+; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_
diff erentval_
diff erentexp
+; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL0:%.*]], <2 x float> [[VAL1:%.*]], <2 x i32> [[EXP0:%.*]], <2 x i32> [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL0]], <2 x i32> [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL1]], <2 x i32> [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> [[COND]], <2 x float> [[LDEXP0]], <2 x float> [[LDEXP1]]
+; CHECK-NEXT: ret <2 x float> [[SELECT]]
+;
+ %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val0, <2 x i32> %exp0)
+ %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val1, <2 x i32> %exp1)
+ %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1
+ ret <2 x float> %select
+}
+
+define float @select_ldexp_f32_same(i1 %cond, float %val, i32 %exp) {
+; CHECK-LABEL: define float @select_ldexp_f32_same
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp)
+ %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
+
+define float @select_ldexp_f32_sameval_
diff erentexp_types(i1 %cond, float %val, i32 %exp0, i64 %exp1) {
+; CHECK-LABEL: define float @select_ldexp_f32_sameval_
diff erentexp_types
+; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i64 [[EXP1:%.*]]) {
+; CHECK-NEXT: [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])
+; CHECK-NEXT: [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i64(float [[VAL]], i64 [[EXP1]])
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]
+; CHECK-NEXT: ret float [[SELECT]]
+;
+ %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)
+ %ldexp1 = call float @llvm.ldexp.f32.i64(float %val, i64 %exp1)
+ %select = select i1 %cond, float %ldexp0, float %ldexp1
+ ret float %select
+}
More information about the llvm-commits
mailing list