brintos

brintos / llvm-project-archived public Read only

0
0
Text · 47.2 KiB · 8908d47 Raw
1021 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4declare float @llvm.ldexp.f32.i32(float, i32)5declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>)6declare float @llvm.ldexp.f32.i64(float, i64)7 8; select c, (ldexp val, e0), (ldexp val, e1) -> ldexp val, (select c, e0, e1)9define float @select_ldexp_f32_sameval_differentexp(i1 %cond, float %val, i32 %exp0, i32 %exp1) {10; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp11; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {12; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]13; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])14; CHECK-NEXT:    ret float [[SELECT]]15;16  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)17  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)18  %select = select i1 %cond, float %ldexp0, float %ldexp119  ret float %select20}21 22define float @select_ldexp_f32_sameval_differentexp_selectflags(i1 %cond, float %val, i32 %exp0, i32 %exp1) {23; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_selectflags24; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {25; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]26; CHECK-NEXT:    [[SELECT:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])27; CHECK-NEXT:    ret float [[SELECT]]28;29  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)30  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)31  %select = select nnan i1 %cond, float %ldexp0, float %ldexp132  ret float %select33}34 35define float @select_ldexp_f32_sameval_differentexp_ldexp_intersect_flags(i1 %cond, float %val, i32 %exp0, i32 %exp1) {36; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_ldexp_intersect_flags37; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {38; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]39; CHECK-NEXT:    [[SELECT:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])40; CHECK-NEXT:    ret float [[SELECT]]41;42  %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val, i32 %exp0)43  %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val, i32 %exp1)44  %select = select i1 %cond, float %ldexp0, float %ldexp145  ret float %select46}47 48define float @select_ldexp_f32_sameval_differentexp_ldexp_intersect_flags_union_select(i1 %cond, float %val, i32 %exp0, i32 %exp1) {49; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_ldexp_intersect_flags_union_select50; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {51; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]52; CHECK-NEXT:    [[SELECT:%.*]] = call nnan ninf float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])53; CHECK-NEXT:    ret float [[SELECT]]54;55  %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val, i32 %exp0)56  %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val, i32 %exp1)57  %select = select ninf i1 %cond, float %ldexp0, float %ldexp158  ret float %select59}60 61define float @select_ldexp_f32_sameval_differentexp_multiuse0(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr) {62; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_multiuse063; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {64; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])65; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR]], align 466; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]67; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])68; CHECK-NEXT:    ret float [[SELECT]]69;70  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)71  store float %ldexp0, ptr %ptr72  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)73  %select = select i1 %cond, float %ldexp0, float %ldexp174  ret float %select75}76 77define float @select_ldexp_f32_sameval_differentexp_multiuse1(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr) {78; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_multiuse179; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {80; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])81; CHECK-NEXT:    store float [[LDEXP1]], ptr [[PTR]], align 482; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]83; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[TMP1]])84; CHECK-NEXT:    ret float [[SELECT]]85;86  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)87  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)88  store float %ldexp1, ptr %ptr89  %select = select i1 %cond, float %ldexp0, float %ldexp190  ret float %select91}92 93define float @select_ldexp_f32_sameval_differentexp_multiuse_both(i1 %cond, float %val, i32 %exp0, i32 %exp1, ptr %ptr0, ptr %ptr1) {94; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_multiuse_both95; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR0:%.*]], ptr [[PTR1:%.*]]) {96; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])97; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR0]], align 498; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP1]])99; CHECK-NEXT:    store float [[LDEXP1]], ptr [[PTR1]], align 4100; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]101; CHECK-NEXT:    ret float [[SELECT]]102;103  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)104  store float %ldexp0, ptr %ptr0105  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp1)106  store float %ldexp1, ptr %ptr1107  %select = select i1 %cond, float %ldexp0, float %ldexp1108  ret float %select109}110 111; select c, (ldexp val0, e), (ldexp val1, ee) -> ldexp (select c, val0, val1), e112define float @select_ldexp_f32_differentval_sameexp(i1 %cond, float %val0, float %val1, i32 %exp) {113; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp114; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {115; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]116; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])117; CHECK-NEXT:    ret float [[SELECT]]118;119  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)120  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)121  %select = select i1 %cond, float %ldexp0, float %ldexp1122  ret float %select123}124 125define float @select_ldexp_f32_differentval_sameexp_selectflags(i1 %cond, float %val0, float %val1, i32 %exp) {126; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp_selectflags127; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {128; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]129; CHECK-NEXT:    [[SELECT:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])130; CHECK-NEXT:    ret float [[SELECT]]131;132  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)133  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)134  %select = select nnan i1 %cond, float %ldexp0, float %ldexp1135  ret float %select136}137 138define float @select_ldexp_f32_differentval_sameexp_ldexp_intersect_flags(i1 %cond, float %val0, float %val1, i32 %exp) {139; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp_ldexp_intersect_flags140; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {141; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]142; CHECK-NEXT:    [[SELECT:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])143; CHECK-NEXT:    ret float [[SELECT]]144;145  %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val0, i32 %exp)146  %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val1, i32 %exp)147  %select = select i1 %cond, float %ldexp0, float %ldexp1148  ret float %select149}150 151define float @select_ldexp_f32_differentval_sameexp_ldexp_intersect_flags_unino_select(i1 %cond, float %val0, float %val1, i32 %exp) {152; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp_ldexp_intersect_flags_unino_select153; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]]) {154; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]155; CHECK-NEXT:    [[SELECT:%.*]] = call nnan ninf float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])156; CHECK-NEXT:    ret float [[SELECT]]157;158  %ldexp0 = call nnan nsz float @llvm.ldexp.f32.i32(float %val0, i32 %exp)159  %ldexp1 = call nnan float @llvm.ldexp.f32.i32(float %val1, i32 %exp)160  %select = select ninf i1 %cond, float %ldexp0, float %ldexp1161  ret float %select162}163 164define float @select_ldexp_f32_differentval_sameexp_multiuse0(i1 %cond, float %val0, float %val1, i32 %exp, ptr %ptr) {165; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp_multiuse0166; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]], ptr [[PTR:%.*]]) {167; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP]])168; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR]], align 4169; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]170; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])171; CHECK-NEXT:    ret float [[SELECT]]172;173  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)174  store float %ldexp0, ptr %ptr175  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)176  %select = select i1 %cond, float %ldexp0, float %ldexp1177  ret float %select178}179 180define float @select_ldexp_f32_differentval_sameexp_multiuse1(i1 %cond, float %val0, float %val1, i32 %exp, ptr %ptr) {181; CHECK-LABEL: define float @select_ldexp_f32_differentval_sameexp_multiuse1182; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP:%.*]], ptr [[PTR:%.*]]) {183; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP]])184; CHECK-NEXT:    store float [[LDEXP1]], ptr [[PTR]], align 4185; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]186; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[EXP]])187; CHECK-NEXT:    ret float [[SELECT]]188;189  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp)190  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp)191  store float %ldexp1, ptr %ptr192  %select = select i1 %cond, float %ldexp0, float %ldexp1193  ret float %select194}195 196define float @select_ldexp_f32_differentval_differentexp(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1) {197; CHECK-LABEL: define float @select_ldexp_f32_differentval_differentexp198; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]]) {199; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]200; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]201; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[TMP2]])202; CHECK-NEXT:    ret float [[SELECT]]203;204  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)205  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)206  %select = select i1 %cond, float %ldexp0, float %ldexp1207  ret float %select208}209 210define float @select_ldexp_f32_differentval_differentexp_multiuse0(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr) {211; CHECK-LABEL: define float @select_ldexp_f32_differentval_differentexp_multiuse0212; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {213; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])214; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR]], align 4215; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]216; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]217; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[TMP2]])218; CHECK-NEXT:    ret float [[SELECT]]219;220  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)221  store float %ldexp0, ptr %ptr222  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)223  %select = select i1 %cond, float %ldexp0, float %ldexp1224  ret float %select225}226 227define float @select_ldexp_f32_differentval_differentexp_multiuse1(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr) {228; CHECK-LABEL: define float @select_ldexp_f32_differentval_differentexp_multiuse1229; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR:%.*]]) {230; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])231; CHECK-NEXT:    store float [[LDEXP1]], ptr [[PTR]], align 4232; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[COND]], float [[VAL0]], float [[VAL1]]233; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[COND]], i32 [[EXP0]], i32 [[EXP1]]234; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP1]], i32 [[TMP2]])235; CHECK-NEXT:    ret float [[SELECT]]236;237  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)238  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)239  store float %ldexp1, ptr %ptr240  %select = select i1 %cond, float %ldexp0, float %ldexp1241  ret float %select242}243 244define float @select_ldexp_f32_differentval_differentexp_multiuse_both(i1 %cond, float %val0, float %val1, i32 %exp0, i32 %exp1, ptr %ptr0, ptr %ptr1) {245; CHECK-LABEL: define float @select_ldexp_f32_differentval_differentexp_multiuse_both246; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL0:%.*]], float [[VAL1:%.*]], i32 [[EXP0:%.*]], i32 [[EXP1:%.*]], ptr [[PTR0:%.*]], ptr [[PTR1:%.*]]) {247; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL0]], i32 [[EXP0]])248; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR0]], align 4249; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL1]], i32 [[EXP1]])250; CHECK-NEXT:    store float [[LDEXP1]], ptr [[PTR1]], align 4251; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]252; CHECK-NEXT:    ret float [[SELECT]]253;254  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val0, i32 %exp0)255  store float %ldexp0, ptr %ptr0256  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val1, i32 %exp1)257  store float %ldexp1, ptr %ptr1258  %select = select i1 %cond, float %ldexp0, float %ldexp1259  ret float %select260}261 262define <2 x float> @select_ldexp_v2f32_sameval_differentexp(<2 x i1> %cond, <2 x float> %val, <2 x i32> %exp0, <2 x i32> %exp1) {263; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_sameval_differentexp264; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL:%.*]], <2 x i32> [[EXP0:%.*]], <2 x i32> [[EXP1:%.*]]) {265; CHECK-NEXT:    [[TMP1:%.*]] = select <2 x i1> [[COND]], <2 x i32> [[EXP0]], <2 x i32> [[EXP1]]266; CHECK-NEXT:    [[SELECT:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[VAL]], <2 x i32> [[TMP1]])267; CHECK-NEXT:    ret <2 x float> [[SELECT]]268;269  %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp0)270  %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp1)271  %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1272  ret <2 x float> %select273}274 275define <2 x float> @select_ldexp_v2f32_differentval_sameexp(<2 x i1> %cond, <2 x float> %val0, <2 x float> %val1, <2 x i32> %exp) {276; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_differentval_sameexp277; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL0:%.*]], <2 x float> [[VAL1:%.*]], <2 x i32> [[EXP:%.*]]) {278; CHECK-NEXT:    [[TMP1:%.*]] = select <2 x i1> [[COND]], <2 x float> [[VAL0]], <2 x float> [[VAL1]]279; CHECK-NEXT:    [[SELECT:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[TMP1]], <2 x i32> [[EXP]])280; CHECK-NEXT:    ret <2 x float> [[SELECT]]281;282  %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val0, <2 x i32> %exp)283  %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val1, <2 x i32> %exp)284  %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1285  ret <2 x float> %select286}287 288define <2 x float> @select_ldexp_v2f32_differentval_differentexp(<2 x i1> %cond, <2 x float> %val0, <2 x float> %val1, <2 x i32> %exp0, <2 x i32> %exp1) {289; CHECK-LABEL: define <2 x float> @select_ldexp_v2f32_differentval_differentexp290; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[VAL0:%.*]], <2 x float> [[VAL1:%.*]], <2 x i32> [[EXP0:%.*]], <2 x i32> [[EXP1:%.*]]) {291; CHECK-NEXT:    [[TMP1:%.*]] = select <2 x i1> [[COND]], <2 x float> [[VAL0]], <2 x float> [[VAL1]]292; CHECK-NEXT:    [[TMP2:%.*]] = select <2 x i1> [[COND]], <2 x i32> [[EXP0]], <2 x i32> [[EXP1]]293; CHECK-NEXT:    [[SELECT:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[TMP1]], <2 x i32> [[TMP2]])294; CHECK-NEXT:    ret <2 x float> [[SELECT]]295;296  %ldexp0 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val0, <2 x i32> %exp0)297  %ldexp1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val1, <2 x i32> %exp1)298  %select = select <2 x i1> %cond, <2 x float> %ldexp0, <2 x float> %ldexp1299  ret <2 x float> %select300}301 302define float @select_ldexp_f32_same(i1 %cond, float %val, i32 %exp) {303; CHECK-LABEL: define float @select_ldexp_f32_same304; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP:%.*]]) {305; CHECK-NEXT:    [[SELECT:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP]])306; CHECK-NEXT:    ret float [[SELECT]]307;308  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp)309  %ldexp1 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp)310  %select = select i1 %cond, float %ldexp0, float %ldexp1311  ret float %select312}313 314define float @select_ldexp_f32_sameval_differentexp_types(i1 %cond, float %val, i32 %exp0, i64 %exp1) {315; CHECK-LABEL: define float @select_ldexp_f32_sameval_differentexp_types316; CHECK-SAME: (i1 [[COND:%.*]], float [[VAL:%.*]], i32 [[EXP0:%.*]], i64 [[EXP1:%.*]]) {317; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[VAL]], i32 [[EXP0]])318; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i64(float [[VAL]], i64 [[EXP1]])319; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[LDEXP0]], float [[LDEXP1]]320; CHECK-NEXT:    ret float [[SELECT]]321;322  %ldexp0 = call float @llvm.ldexp.f32.i32(float %val, i32 %exp0)323  %ldexp1 = call float @llvm.ldexp.f32.i64(float %val, i64 %exp1)324  %select = select i1 %cond, float %ldexp0, float %ldexp1325  ret float %select326}327 328;---------------------------------------------------------------------329; ldexp(ldexp(x, a), b) -> ldexp(x, a + b)330;---------------------------------------------------------------------331 332define float @ldexp_ldexp(float %x, i32 %a, i32 %b) {333; CHECK-LABEL: define float @ldexp_ldexp334; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {335; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])336; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])337; CHECK-NEXT:    ret float [[LDEXP1]]338;339  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)340  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)341  ret float %ldexp1342}343 344define float @ldexp_reassoc_ldexp(float %x, i32 %a, i32 %b) {345; CHECK-LABEL: define float @ldexp_reassoc_ldexp346; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {347; CHECK-NEXT:    [[LDEXP0:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])348; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])349; CHECK-NEXT:    ret float [[LDEXP1]]350;351  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 %a)352  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)353  ret float %ldexp1354}355 356define float @ldexp_ldexp_reassoc(float %x, i32 %a, i32 %b) {357; CHECK-LABEL: define float @ldexp_ldexp_reassoc358; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {359; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])360; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])361; CHECK-NEXT:    ret float [[LDEXP1]]362;363  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)364  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)365  ret float %ldexp1366}367 368define float @ldexp_reassoc_ldexp_reassoc(float %x, i32 %a, i32 %b) {369; CHECK-LABEL: define float @ldexp_reassoc_ldexp_reassoc370; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {371; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[A]], [[B]]372; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])373; CHECK-NEXT:    ret float [[LDEXP1]]374;375  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 %a)376  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)377  ret float %ldexp1378}379 380define float @ldexp_reassoc_nsz_ldexp_reassoc_nsz(float %x, i32 %a, i32 %b) {381; CHECK-LABEL: define float @ldexp_reassoc_nsz_ldexp_reassoc_nsz382; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {383; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[A]], [[B]]384; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])385; CHECK-NEXT:    ret float [[LDEXP1]]386;387  %ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 %a)388  %ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)389  ret float %ldexp1390}391 392; Test that we or the inner and outer flags393define float @ldexp_reassoc_ldexp_reassoc_preserve_flags(float %x, i32 %a, i32 %b) {394; CHECK-LABEL: define float @ldexp_reassoc_ldexp_reassoc_preserve_flags395; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {396; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[A]], [[B]]397; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc nnan ninf float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])398; CHECK-NEXT:    ret float [[LDEXP1]]399;400  %ldexp0 = call reassoc ninf float @llvm.ldexp.f32.i32(float %x, i32 %a)401  %ldexp1 = call reassoc nnan float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)402  ret float %ldexp1403}404 405define <2 x float> @ldexp_reassoc_ldexp_reassoc_vec(<2 x float> %x, <2 x i32> %a, <2 x i32> %b) {406; CHECK-LABEL: define <2 x float> @ldexp_reassoc_ldexp_reassoc_vec407; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) {408; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i32> [[A]], [[B]]409; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[TMP1]])410; CHECK-NEXT:    ret <2 x float> [[LDEXP1]]411;412  %ldexp0 = call reassoc <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> %a)413  %ldexp1 = call reassoc <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %ldexp0, <2 x i32> %b)414  ret <2 x float> %ldexp1415}416 417define float @ldexp_multi_use_ldexp(float %x, i32 %a, i32 %b, ptr %ptr) {418; CHECK-LABEL: define float @ldexp_multi_use_ldexp419; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]], ptr [[PTR:%.*]]) {420; CHECK-NEXT:    [[LDEXP0:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])421; CHECK-NEXT:    store float [[LDEXP0]], ptr [[PTR]], align 4422; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])423; CHECK-NEXT:    ret float [[LDEXP1]]424;425  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 %a)426  store float %ldexp0, ptr %ptr427  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)428  ret float %ldexp1429}430 431; Test edge case where the intrinsic is declared with different int types.432define float @ldexp_ldexp_different_exp_type(float %x, i32 %a, i64 %b) {433; CHECK-LABEL: define float @ldexp_ldexp_different_exp_type434; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i64 [[B:%.*]]) {435; CHECK-NEXT:    [[LDEXP0:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])436; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i64(float [[LDEXP0]], i64 [[B]])437; CHECK-NEXT:    ret float [[LDEXP1]]438;439  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 %a)440  %ldexp1 = call reassoc float @llvm.ldexp.f32.i64(float %ldexp0, i64 %b)441  ret float %ldexp1442}443 444define float @ldexp_ldexp_constants(float %x) {445; CHECK-LABEL: define float @ldexp_ldexp_constants446; CHECK-SAME: (float [[X:%.*]]) {447; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 32)448; CHECK-NEXT:    ret float [[LDEXP1]]449;450  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 8)451  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)452  ret float %ldexp1453}454 455define float @ldexp_ldexp_constants_nsz(float %x) {456; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz457; CHECK-SAME: (float [[X:%.*]]) {458; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)459; CHECK-NEXT:    ret float [[LDEXP1]]460;461  %ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 8)462  %ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)463  ret float %ldexp1464}465 466define float @ldexp_ldexp_constants_nsz0(float %x) {467; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz0468; CHECK-SAME: (float [[X:%.*]]) {469; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)470; CHECK-NEXT:    ret float [[LDEXP1]]471;472  %ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 8)473  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)474  ret float %ldexp1475}476 477define float @ldexp_ldexp_constants_nsz1(float %x) {478; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz1479; CHECK-SAME: (float [[X:%.*]]) {480; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)481; CHECK-NEXT:    ret float [[LDEXP1]]482;483  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 8)484  %ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)485  ret float %ldexp1486}487 488define float @ldexp_ldexp_opposite_constants(float %x) {489; CHECK-LABEL: define float @ldexp_ldexp_opposite_constants490; CHECK-SAME: (float [[X:%.*]]) {491; CHECK-NEXT:    ret float [[X]]492;493  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 8)494  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 -8)495  ret float %ldexp1496}497 498define float @ldexp_ldexp_negated_variable_reassoc(float %x, i32 %a) {499; CHECK-LABEL: define float @ldexp_ldexp_negated_variable_reassoc500; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]]) {501; CHECK-NEXT:    ret float [[X]]502;503  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 %a)504  %neg.a = sub i32 0, %a505  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 %neg.a)506  ret float %ldexp1507}508 509define float @ldexp_ldexp_negated_variable(float %x, i32 %a) {510; CHECK-LABEL: define float @ldexp_ldexp_negated_variable511; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]]) {512; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])513; CHECK-NEXT:    [[NEG_A:%.*]] = sub i32 0, [[A]]514; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[NEG_A]])515; CHECK-NEXT:    ret float [[LDEXP1]]516;517  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)518  %neg.a = sub i32 0, %a519  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %neg.a)520  ret float %ldexp1521}522 523define float @ldexp_ldexp_first_exp_known_positive(float %x, i32 %a.arg, i32 %b) {524; CHECK-LABEL: define float @ldexp_ldexp_first_exp_known_positive525; CHECK-SAME: (float [[X:%.*]], i32 [[A_ARG:%.*]], i32 [[B:%.*]]) {526; CHECK-NEXT:    [[A:%.*]] = and i32 [[A_ARG]], 127527; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])528; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])529; CHECK-NEXT:    ret float [[LDEXP1]]530;531  %a = and i32 %a.arg, 127532  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)533  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)534  ret float %ldexp1535}536 537define float @ldexp_ldexp_first_second_known_positive(float %x, i32 %a, i32 %b.arg) {538; CHECK-LABEL: define float @ldexp_ldexp_first_second_known_positive539; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B_ARG:%.*]]) {540; CHECK-NEXT:    [[B:%.*]] = and i32 [[B_ARG]], 127541; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])542; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])543; CHECK-NEXT:    ret float [[LDEXP1]]544;545  %b = and i32 %b.arg, 127546  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)547  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)548  ret float %ldexp1549}550 551define float @ldexp_ldexp_both_exp_known_positive(float %x, i32 %a.arg, i32 %b.arg) {552; CHECK-LABEL: define float @ldexp_ldexp_both_exp_known_positive553; CHECK-SAME: (float [[X:%.*]], i32 [[A_ARG:%.*]], i32 [[B_ARG:%.*]]) {554; CHECK-NEXT:    [[A:%.*]] = and i32 [[A_ARG]], 127555; CHECK-NEXT:    [[B:%.*]] = and i32 [[B_ARG]], 127556; CHECK-NEXT:    [[TMP1:%.*]] = add nuw nsw i32 [[A]], [[B]]557; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])558; CHECK-NEXT:    ret float [[LDEXP1]]559;560  %a = and i32 %a.arg, 127561  %b = and i32 %b.arg, 127562  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)563  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)564  ret float %ldexp1565}566 567define float @ldexp_ldexp_both_exp_known_negative(float %x, ptr %a.ptr, ptr %b.ptr) {568; CHECK-LABEL: define float @ldexp_ldexp_both_exp_known_negative569; CHECK-SAME: (float [[X:%.*]], ptr [[A_PTR:%.*]], ptr [[B_PTR:%.*]]) {570; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[A_PTR]], align 4, !range [[RNG0:![0-9]+]]571; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[B_PTR]], align 4, !range [[RNG0]]572; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i32 [[A]], [[B]]573; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])574; CHECK-NEXT:    ret float [[LDEXP1]]575;576  %a = load i32, ptr %a.ptr, !range !0577  %b = load i32, ptr %b.ptr, !range !0578  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)579  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)580  ret float %ldexp1581}582 583define float @ldexp_ldexp_exp_known_negative_and_positive(float %x, ptr %a.ptr, ptr %b.ptr) {584; CHECK-LABEL: define float @ldexp_ldexp_exp_known_negative_and_positive585; CHECK-SAME: (float [[X:%.*]], ptr [[A_PTR:%.*]], ptr [[B_PTR:%.*]]) {586; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[A_PTR]], align 4, !range [[RNG0]]587; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[B_PTR]], align 4, !range [[RNG1:![0-9]+]]588; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])589; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])590; CHECK-NEXT:    ret float [[LDEXP1]]591;592  %a = load i32, ptr %a.ptr, !range !0593  %b = load i32, ptr %b.ptr, !range !1594  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)595  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)596  ret float %ldexp1597}598 599define float @ldexp_ldexp_exp_known_positive_and_negative(float %x, ptr %a.ptr, ptr %b.ptr) {600; CHECK-LABEL: define float @ldexp_ldexp_exp_known_positive_and_negative601; CHECK-SAME: (float [[X:%.*]], ptr [[A_PTR:%.*]], ptr [[B_PTR:%.*]]) {602; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[A_PTR]], align 4, !range [[RNG1]]603; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[B_PTR]], align 4, !range [[RNG0]]604; CHECK-NEXT:    [[LDEXP0:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[A]])605; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[LDEXP0]], i32 [[B]])606; CHECK-NEXT:    ret float [[LDEXP1]]607;608  %a = load i32, ptr %a.ptr, !range !1609  %b = load i32, ptr %b.ptr, !range !0610  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 %a)611  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)612  ret float %ldexp1613}614 615define float @ldexp_reassoc_ldexp_reassoc_0(float %x, i32 %y) {616; CHECK-LABEL: define float @ldexp_reassoc_ldexp_reassoc_0617; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {618; CHECK-NEXT:    [[LDEXP1:%.*]] = call reassoc float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])619; CHECK-NEXT:    ret float [[LDEXP1]]620;621  %ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 0)622  %ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 %y)623  ret float %ldexp1624}625 626define float @ldexp_ldexp_0(float %x, i32 %y) {627; CHECK-LABEL: define float @ldexp_ldexp_0628; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) {629; CHECK-NEXT:    [[LDEXP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])630; CHECK-NEXT:    ret float [[LDEXP1]]631;632  %ldexp0 = call float @llvm.ldexp.f32.i32(float %x, i32 0)633  %ldexp1 = call float @llvm.ldexp.f32.i32(float %ldexp0, i32 %y)634  ret float %ldexp1635}636 637;---------------------------------------------------------------------638; ldexp(x, k) -> fmul x, 2**k639;---------------------------------------------------------------------640 641define float @ldexp_neg150(float %x) {642; CHECK-LABEL: define float @ldexp_neg150643; CHECK-SAME: (float [[X:%.*]]) {644; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -150)645; CHECK-NEXT:    ret float [[LDEXP]]646;647  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -150)648  ret float %ldexp649}650 651define float @ldexp_neg149(float %x) {652; CHECK-LABEL: define float @ldexp_neg149653; CHECK-SAME: (float [[X:%.*]]) {654; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -149)655; CHECK-NEXT:    ret float [[LDEXP]]656;657  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -149)658  ret float %ldexp659}660 661define float @ldexp_neg148(float %x) {662; CHECK-LABEL: define float @ldexp_neg148663; CHECK-SAME: (float [[X:%.*]]) {664; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -148)665; CHECK-NEXT:    ret float [[LDEXP]]666;667  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -148)668  ret float %ldexp669}670 671define float @ldexp_neg127(float %x) {672; CHECK-LABEL: define float @ldexp_neg127673; CHECK-SAME: (float [[X:%.*]]) {674; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -127)675; CHECK-NEXT:    ret float [[LDEXP]]676;677  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -127)678  ret float %ldexp679}680 681define float @ldexp_neg126(float %x) {682; CHECK-LABEL: define float @ldexp_neg126683; CHECK-SAME: (float [[X:%.*]]) {684; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -126)685; CHECK-NEXT:    ret float [[LDEXP]]686;687  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -126)688  ret float %ldexp689}690 691define float @ldexp_neg125(float %x) {692; CHECK-LABEL: define float @ldexp_neg125693; CHECK-SAME: (float [[X:%.*]]) {694; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -125)695; CHECK-NEXT:    ret float [[LDEXP]]696;697  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -125)698  ret float %ldexp699}700 701define float @ldexp_neg16(float %x) {702; CHECK-LABEL: define float @ldexp_neg16703; CHECK-SAME: (float [[X:%.*]]) {704; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -16)705; CHECK-NEXT:    ret float [[LDEXP]]706;707  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -16)708  ret float %ldexp709}710 711define float @ldexp_neg8(float %x) {712; CHECK-LABEL: define float @ldexp_neg8713; CHECK-SAME: (float [[X:%.*]]) {714; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -8)715; CHECK-NEXT:    ret float [[LDEXP]]716;717  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -8)718  ret float %ldexp719}720 721define float @ldexp_neg4(float %x) {722; CHECK-LABEL: define float @ldexp_neg4723; CHECK-SAME: (float [[X:%.*]]) {724; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -4)725; CHECK-NEXT:    ret float [[LDEXP]]726;727  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -4)728  ret float %ldexp729}730 731define float @ldexp_neg2(float %x) {732; CHECK-LABEL: define float @ldexp_neg2733; CHECK-SAME: (float [[X:%.*]]) {734; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -2)735; CHECK-NEXT:    ret float [[LDEXP]]736;737  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -2)738  ret float %ldexp739}740 741define float @ldexp_neg1(float %x) {742; CHECK-LABEL: define float @ldexp_neg1743; CHECK-SAME: (float [[X:%.*]]) {744; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -1)745; CHECK-NEXT:    ret float [[LDEXP]]746;747  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -1)748  ret float %ldexp749}750 751define float @ldexp_0(float %x) {752; CHECK-LABEL: define float @ldexp_0753; CHECK-SAME: (float [[X:%.*]]) {754; CHECK-NEXT:    ret float [[X]]755;756  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 0)757  ret float %ldexp758}759 760define float @ldexp_1(float %x) {761; CHECK-LABEL: define float @ldexp_1762; CHECK-SAME: (float [[X:%.*]]) {763; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 1)764; CHECK-NEXT:    ret float [[LDEXP]]765;766  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 1)767  ret float %ldexp768}769 770define float @ldexp_2(float %x) {771; CHECK-LABEL: define float @ldexp_2772; CHECK-SAME: (float [[X:%.*]]) {773; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2)774; CHECK-NEXT:    ret float [[LDEXP]]775;776  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 2)777  ret float %ldexp778}779 780define float @ldexp_3(float %x) {781; CHECK-LABEL: define float @ldexp_3782; CHECK-SAME: (float [[X:%.*]]) {783; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 3)784; CHECK-NEXT:    ret float [[LDEXP]]785;786  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 3)787  ret float %ldexp788}789 790define float @ldexp_10(float %x) {791; CHECK-LABEL: define float @ldexp_10792; CHECK-SAME: (float [[X:%.*]]) {793; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 10)794; CHECK-NEXT:    ret float [[LDEXP]]795;796  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 10)797  ret float %ldexp798}799 800define float @ldexp_125(float %x) {801; CHECK-LABEL: define float @ldexp_125802; CHECK-SAME: (float [[X:%.*]]) {803; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 125)804; CHECK-NEXT:    ret float [[LDEXP]]805;806  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 125)807  ret float %ldexp808}809 810define float @ldexp_126(float %x) {811; CHECK-LABEL: define float @ldexp_126812; CHECK-SAME: (float [[X:%.*]]) {813; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 126)814; CHECK-NEXT:    ret float [[LDEXP]]815;816  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 126)817  ret float %ldexp818}819 820define float @ldexp_127(float %x) {821; CHECK-LABEL: define float @ldexp_127822; CHECK-SAME: (float [[X:%.*]]) {823; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 127)824; CHECK-NEXT:    ret float [[LDEXP]]825;826  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 127)827  ret float %ldexp828}829 830define <2 x float> @ldexp_3_vector(<2 x float> %x) {831; CHECK-LABEL: define <2 x float> @ldexp_3_vector832; CHECK-SAME: (<2 x float> [[X:%.*]]) {833; CHECK-NEXT:    [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> splat (i32 3))834; CHECK-NEXT:    ret <2 x float> [[LDEXP]]835;836  %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 3>)837  ret <2 x float> %ldexp838}839 840define <2 x float> @ldexp_3_undef_vector(<2 x float> %x) {841; CHECK-LABEL: define <2 x float> @ldexp_3_undef_vector842; CHECK-SAME: (<2 x float> [[X:%.*]]) {843; CHECK-NEXT:    [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> <i32 3, i32 poison>)844; CHECK-NEXT:    ret <2 x float> [[LDEXP]]845;846  %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 poison>)847  ret <2 x float> %ldexp848}849 850define <2 x float> @ldexp_3_4_vector(<2 x float> %x) {851; CHECK-LABEL: define <2 x float> @ldexp_3_4_vector852; CHECK-SAME: (<2 x float> [[X:%.*]]) {853; CHECK-NEXT:    [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> <i32 3, i32 4>)854; CHECK-NEXT:    ret <2 x float> [[LDEXP]]855;856  %ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 4>)857  ret <2 x float> %ldexp858}859 860define float @ldexp_2_flags(float %x) {861; CHECK-LABEL: define float @ldexp_2_flags862; CHECK-SAME: (float [[X:%.*]]) {863; CHECK-NEXT:    [[LDEXP:%.*]] = call nsz contract float @llvm.ldexp.f32.i32(float [[X]], i32 2)864; CHECK-NEXT:    ret float [[LDEXP]]865;866  %ldexp = call contract nsz float @llvm.ldexp.f32.i32(float %x, i32 2)867  ret float %ldexp868}869 870define float @ldexp_metadata(float %x) {871; CHECK-LABEL: define float @ldexp_metadata872; CHECK-SAME: (float [[X:%.*]]) {873; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2), !foo [[META2:![0-9]+]]874; CHECK-NEXT:    ret float [[LDEXP]]875;876  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 2), !foo !2877  ret float %ldexp878}879 880define float @ldexp_8_contractable(float %x, float %y) {881; CHECK-LABEL: define float @ldexp_8_contractable882; CHECK-SAME: (float [[X:%.*]], float [[Y:%.*]]) {883; CHECK-NEXT:    [[LDEXP:%.*]] = call contract float @llvm.ldexp.f32.i32(float [[X]], i32 2)884; CHECK-NEXT:    [[FADD:%.*]] = fadd contract float [[LDEXP]], [[Y]]885; CHECK-NEXT:    ret float [[FADD]]886;887  %ldexp = call contract float @llvm.ldexp.f32.i32(float %x, i32 2)888  %fadd = fadd contract float %ldexp, %y889  ret float %fadd890}891 892define float @ldexp_f32_mask_select_0(i1 %cond, float %x, i32 %y) {893; CHECK-LABEL: define float @ldexp_f32_mask_select_0894; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {895; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])896; CHECK-NEXT:    [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]897; CHECK-NEXT:    ret float [[LDEXP]]898;899  %select = select i1 %cond, i32 %y, i32 0900  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %select)901  ret float %ldexp902}903 904define float @ldexp_nnan_f32_mask_select_0(i1 %cond, float %x, i32 %y) {905; CHECK-LABEL: define float @ldexp_nnan_f32_mask_select_0906; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {907; CHECK-NEXT:    [[TMP1:%.*]] = call nnan float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])908; CHECK-NEXT:    [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]909; CHECK-NEXT:    ret float [[LDEXP]]910;911  %select = select i1 %cond, i32 %y, i32 0912  %ldexp = call nnan float @llvm.ldexp.f32.i32(float %x, i32 %select)913  ret float %ldexp914}915 916define float @ldexp_flags_f32_mask_select_0(i1 %cond, float %x, i32 %y) {917; CHECK-LABEL: define float @ldexp_flags_f32_mask_select_0918; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {919; CHECK-NEXT:    [[TMP1:%.*]] = call ninf nsz float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])920; CHECK-NEXT:    [[LDEXP:%.*]] = select i1 [[COND]], float [[TMP1]], float [[X]]921; CHECK-NEXT:    ret float [[LDEXP]]922;923  %select = select i1 %cond, i32 %y, i32 0924  %ldexp = call nsz ninf float @llvm.ldexp.f32.i32(float %x, i32 %select)925  ret float %ldexp926}927 928define float @ldexp_f32_mask_select_0_swap(i1 %cond, float %x, i32 %y) {929; CHECK-LABEL: define float @ldexp_f32_mask_select_0_swap930; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {931; CHECK-NEXT:    [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[Y]])932; CHECK-NEXT:    [[LDEXP:%.*]] = select i1 [[COND]], float [[X]], float [[TMP1]]933; CHECK-NEXT:    ret float [[LDEXP]]934;935  %select = select i1 %cond, i32 0, i32 %y936  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %select)937  ret float %ldexp938}939 940define float @ldexp_f32_mask_select_1(i1 %cond, float %x, i32 %y) {941; CHECK-LABEL: define float @ldexp_f32_mask_select_1942; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) {943; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 1944; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])945; CHECK-NEXT:    ret float [[LDEXP]]946;947  %select = select i1 %cond, i32 %y, i32 1948  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %select)949  ret float %ldexp950}951 952define float @ldexp_f32_mask_select_0_multi_use(i1 %cond, float %x, i32 %y, ptr %ptr) {953; CHECK-LABEL: define float @ldexp_f32_mask_select_0_multi_use954; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]], ptr [[PTR:%.*]]) {955; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 0956; CHECK-NEXT:    store i32 [[SELECT]], ptr [[PTR]], align 4957; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])958; CHECK-NEXT:    ret float [[LDEXP]]959;960  %select = select i1 %cond, i32 %y, i32 0961  store i32 %select, ptr %ptr962  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %select)963  ret float %ldexp964}965 966define float @ldexp_f32_mask_select_0_swap_multi_use(i1 %cond, float %x, i32 %y, ptr %ptr) {967; CHECK-LABEL: define float @ldexp_f32_mask_select_0_swap_multi_use968; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]], ptr [[PTR:%.*]]) {969; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], i32 0, i32 [[Y]]970; CHECK-NEXT:    store i32 [[SELECT]], ptr [[PTR]], align 4971; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 [[SELECT]])972; CHECK-NEXT:    ret float [[LDEXP]]973;974  %select = select i1 %cond, i32 0, i32 %y975  store i32 %select, ptr %ptr976  %ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 %select)977  ret float %ldexp978}979 980define float @ldexp_f32_mask_select_0_strictfp(i1 %cond, float %x, i32 %y) #0 {981; CHECK-LABEL: define float @ldexp_f32_mask_select_0_strictfp982; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR1:[0-9]+]] {983; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], i32 [[Y]], i32 0984; CHECK-NEXT:    [[LDEXP:%.*]] = call float @llvm.experimental.constrained.ldexp.f32.i32(float [[X]], i32 [[SELECT]], metadata !"round.dynamic", metadata !"fpexcept.strict")985; CHECK-NEXT:    ret float [[LDEXP]]986;987  %select = select i1 %cond, i32 %y, i32 0988  %ldexp = call float @llvm.experimental.constrained.ldexp.f32.i32(float %x, i32 %select, metadata !"round.dynamic", metadata !"fpexcept.strict")989  ret float %ldexp990}991 992define <2 x float> @ldexp_v2f32_mask_select_0(<2 x i1> %cond, <2 x float> %x, <2 x i32> %y) {993; CHECK-LABEL: define <2 x float> @ldexp_v2f32_mask_select_0994; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {995; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[Y]])996; CHECK-NEXT:    [[LDEXP:%.*]] = select <2 x i1> [[COND]], <2 x float> [[TMP1]], <2 x float> [[X]]997; CHECK-NEXT:    ret <2 x float> [[LDEXP]]998;999  %select = select <2 x i1> %cond, <2 x i32> %y, <2 x i32> zeroinitializer1000  %ldexp = call nsz nnan <2 x float> @llvm.ldexp.f32.v2i32(<2 x float> %x, <2 x i32> %select)1001  ret <2 x float> %ldexp1002}1003 1004define <2 x float> @ldexp_v2f32_mask_select_0_swap(<2 x i1> %cond, <2 x float> %x, <2 x i32> %y) {1005; CHECK-LABEL: define <2 x float> @ldexp_v2f32_mask_select_0_swap1006; CHECK-SAME: (<2 x i1> [[COND:%.*]], <2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) {1007; CHECK-NEXT:    [[TMP1:%.*]] = call nnan nsz <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> [[Y]])1008; CHECK-NEXT:    [[LDEXP:%.*]] = select <2 x i1> [[COND]], <2 x float> [[X]], <2 x float> [[TMP1]]1009; CHECK-NEXT:    ret <2 x float> [[LDEXP]]1010;1011  %select = select <2 x i1> %cond, <2 x i32> zeroinitializer, <2 x i32> %y1012  %ldexp = call nsz nnan <2 x float> @llvm.ldexp.f32.v2i32(<2 x float> %x, <2 x i32> %select)1013  ret <2 x float> %ldexp1014}1015 1016attributes #0 = { strictfp }1017 1018!0 = !{i32 -127, i32 0}1019!1 = !{i32 0, i32 127}1020!2 = !{}1021