412 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define float @select_maybe_nan_fadd(i1 %cond, float %A, float %B) {5; CHECK-LABEL: @select_maybe_nan_fadd(6; CHECK-NEXT: [[C:%.*]] = fadd float [[A:%.*]], [[B:%.*]]7; CHECK-NEXT: [[D:%.*]] = select i1 [[COND:%.*]], float [[C]], float [[A]]8; CHECK-NEXT: ret float [[D]]9;10 %C = fadd float %A, %B11 %D = select i1 %cond, float %C, float %A12 ret float %D13}14 15define float @select_fpclass_fadd(i1 %cond, float nofpclass(nan) %A, float %B) {16; CHECK-LABEL: @select_fpclass_fadd(17; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0018; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]19; CHECK-NEXT: ret float [[D]]20;21 %C = fadd float %A, %B22 %D = select i1 %cond, float %C, float %A23 ret float %D24}25 26define float @select_fpclass_fadd_ninf1(i1 %cond, float nofpclass(nan) %A, float %B) {27; CHECK-LABEL: @select_fpclass_fadd_ninf1(28; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0029; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]30; CHECK-NEXT: ret float [[D]]31;32 %C = fadd ninf float %A, %B33 %D = select i1 %cond, float %C, float %A34 ret float %D35}36 37define float @select_fpclass_fadd_ninf2(i1 %cond, float nofpclass(nan) %A, float %B) {38; CHECK-LABEL: @select_fpclass_fadd_ninf2(39; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0040; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]41; CHECK-NEXT: ret float [[D]]42;43 %C = fadd float %A, %B44 %D = select ninf i1 %cond, float %C, float %A45 ret float %D46}47 48define float @select_fpclass_fadd_ninf3(i1 %cond, float nofpclass(nan) %A, float %B) {49; CHECK-LABEL: @select_fpclass_fadd_ninf3(50; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0051; CHECK-NEXT: [[D:%.*]] = fadd ninf float [[A:%.*]], [[C]]52; CHECK-NEXT: ret float [[D]]53;54 %C = fadd ninf float %A, %B55 %D = select ninf i1 %cond, float %C, float %A56 ret float %D57}58 59define float @select_fpclass_fadd_nnan_ninf(i1 %cond, float nofpclass(nan) %A, float %B) {60; CHECK-LABEL: @select_fpclass_fadd_nnan_ninf(61; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0062; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]63; CHECK-NEXT: ret float [[D]]64;65 %C = fadd float %A, %B66 %D = select nnan ninf i1 %cond, float %C, float %A67 ret float %D68}69 70define float @select_nnan_fadd(i1 %cond, float %A, float %B) {71; CHECK-LABEL: @select_nnan_fadd(72; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0073; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]74; CHECK-NEXT: ret float [[D]]75;76 %C = fadd float %A, %B77 %D = select nnan i1 %cond, float %C, float %A78 ret float %D79}80 81define float @select_nnan_fadd_swapped(i1 %cond, float %A, float %B) {82; CHECK-LABEL: @select_nnan_fadd_swapped(83; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]84; CHECK-NEXT: [[D:%.*]] = fadd float [[A:%.*]], [[C]]85; CHECK-NEXT: ret float [[D]]86;87 %C = fadd float %A, %B88 %D = select nnan i1 %cond, float %A, float %C89 ret float %D90}91 92define float @select_nnan_fadd_fast_math(i1 %cond, float %A, float %B) {93; CHECK-LABEL: @select_nnan_fadd_fast_math(94; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float -0.000000e+0095; CHECK-NEXT: [[D:%.*]] = fadd reassoc nnan arcp contract afn float [[A:%.*]], [[C]]96; CHECK-NEXT: ret float [[D]]97;98 %C = fadd fast float %A, %B99 %D = select nnan i1 %cond, float %C, float %A100 ret float %D101}102 103define float @select_nnan_fadd_swapped_fast_math(i1 %cond, float %A, float %B) {104; CHECK-LABEL: @select_nnan_fadd_swapped_fast_math(105; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float -0.000000e+00, float [[B:%.*]]106; CHECK-NEXT: [[D:%.*]] = fadd reassoc nnan arcp contract afn float [[A:%.*]], [[C]]107; CHECK-NEXT: ret float [[D]]108;109 %C = fadd fast float %A, %B110 %D = select nnan i1 %cond, float %A, float %C111 ret float %D112}113 114define <4 x float> @select_nnan_nsz_fadd_v4f32(<4 x i1> %cond, <4 x float> %A, <4 x float> %B) {115; CHECK-LABEL: @select_nnan_nsz_fadd_v4f32(116; CHECK-NEXT: [[C:%.*]] = select nnan nsz <4 x i1> [[COND:%.*]], <4 x float> [[B:%.*]], <4 x float> zeroinitializer117; CHECK-NEXT: [[D:%.*]] = fadd nnan nsz <4 x float> [[A:%.*]], [[C]]118; CHECK-NEXT: ret <4 x float> [[D]]119;120 %C = fadd nsz nnan <4 x float> %A, %B121 %D = select nsz nnan <4 x i1> %cond, <4 x float> %C, <4 x float> %A122 ret <4 x float> %D123}124 125define <vscale x 4 x float> @select_nnan_nsz_fadd_nxv4f32(<vscale x 4 x i1> %cond, <vscale x 4 x float> %A, <vscale x 4 x float> %B) {126; CHECK-LABEL: @select_nnan_nsz_fadd_nxv4f32(127; CHECK-NEXT: [[C:%.*]] = select nnan nsz <vscale x 4 x i1> [[COND:%.*]], <vscale x 4 x float> [[B:%.*]], <vscale x 4 x float> zeroinitializer128; CHECK-NEXT: [[D:%.*]] = fadd nnan nsz <vscale x 4 x float> [[A:%.*]], [[C]]129; CHECK-NEXT: ret <vscale x 4 x float> [[D]]130;131 %C = fadd nnan nsz <vscale x 4 x float> %A, %B132 %D = select nnan nsz <vscale x 4 x i1> %cond, <vscale x 4 x float> %C, <vscale x 4 x float> %A133 ret <vscale x 4 x float> %D134}135 136define <vscale x 4 x float> @select_nnan_nsz_fadd_nxv4f32_swapops(<vscale x 4 x i1> %cond, <vscale x 4 x float> %A, <vscale x 4 x float> %B) {137; CHECK-LABEL: @select_nnan_nsz_fadd_nxv4f32_swapops(138; CHECK-NEXT: [[C:%.*]] = select fast <vscale x 4 x i1> [[COND:%.*]], <vscale x 4 x float> zeroinitializer, <vscale x 4 x float> [[B:%.*]]139; CHECK-NEXT: [[D:%.*]] = fadd fast <vscale x 4 x float> [[A:%.*]], [[C]]140; CHECK-NEXT: ret <vscale x 4 x float> [[D]]141;142 %C = fadd fast <vscale x 4 x float> %A, %B143 %D = select nnan fast <vscale x 4 x i1> %cond, <vscale x 4 x float> %A, <vscale x 4 x float> %C144 ret <vscale x 4 x float> %D145}146 147define float @select_nnan_fmul(i1 %cond, float %A, float %B) {148; CHECK-LABEL: @select_nnan_fmul(149; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00150; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]151; CHECK-NEXT: ret float [[D]]152;153 %C = fmul float %A, %B154 %D = select nnan i1 %cond, float %C, float %A155 ret float %D156}157 158define float @select_nnan_fmul_swapped(i1 %cond, float %A, float %B) {159; CHECK-LABEL: @select_nnan_fmul_swapped(160; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]161; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]162; CHECK-NEXT: ret float [[D]]163;164 %C = fmul float %A, %B165 %D = select nnan i1 %cond, float %A, float %C166 ret float %D167}168 169define float @select_nnan_fmul_fast_math(i1 %cond, float %A, float %B) {170; CHECK-LABEL: @select_nnan_fmul_fast_math(171; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00172; CHECK-NEXT: [[D:%.*]] = fmul reassoc nnan arcp contract afn float [[A:%.*]], [[C]]173; CHECK-NEXT: ret float [[D]]174;175 %C = fmul fast float %A, %B176 %D = select nnan i1 %cond, float %C, float %A177 ret float %D178}179 180define float @select_nnan_fmul_swapped_fast_math(i1 %cond, float %A, float %B) {181; CHECK-LABEL: @select_nnan_fmul_swapped_fast_math(182; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]183; CHECK-NEXT: [[D:%.*]] = fmul reassoc nnan arcp contract afn float [[A:%.*]], [[C]]184; CHECK-NEXT: ret float [[D]]185;186 %C = fmul fast float %A, %B187 %D = select nnan i1 %cond, float %A, float %C188 ret float %D189}190 191define float @select_fpclass_fmul_ninf1(i1 %cond, float nofpclass(nan) %A, float %B) {192; CHECK-LABEL: @select_fpclass_fmul_ninf1(193; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00194; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]195; CHECK-NEXT: ret float [[D]]196;197 %C = fmul ninf float %A, %B198 %D = select i1 %cond, float %C, float %A199 ret float %D200}201 202define float @select_fpclass_fmul_ninf2(i1 %cond, float nofpclass(nan) %A, float %B) {203; CHECK-LABEL: @select_fpclass_fmul_ninf2(204; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00205; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]206; CHECK-NEXT: ret float [[D]]207;208 %C = fmul float %A, %B209 %D = select ninf i1 %cond, float %C, float %A210 ret float %D211}212 213define float @select_fpclass_fmul_ninf3(i1 %cond, float nofpclass(nan) %A, float %B) {214; CHECK-LABEL: @select_fpclass_fmul_ninf3(215; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00216; CHECK-NEXT: [[D:%.*]] = fmul ninf float [[A:%.*]], [[C]]217; CHECK-NEXT: ret float [[D]]218;219 %C = fmul ninf float %A, %B220 %D = select ninf i1 %cond, float %C, float %A221 ret float %D222}223 224define float @select_fpclass_fmul_nnan_ninf(i1 %cond, float nofpclass(nan) %A, float %B) {225; CHECK-LABEL: @select_fpclass_fmul_nnan_ninf(226; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00227; CHECK-NEXT: [[D:%.*]] = fmul float [[A:%.*]], [[C]]228; CHECK-NEXT: ret float [[D]]229;230 %C = fmul float %A, %B231 %D = select nnan ninf i1 %cond, float %C, float %A232 ret float %D233}234 235define float @select_nnan_fsub(i1 %cond, float %A, float %B) {236; CHECK-LABEL: @select_nnan_fsub(237; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00238; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]239; CHECK-NEXT: ret float [[D]]240;241 %C = fsub float %A, %B242 %D = select nnan i1 %cond, float %C, float %A243 ret float %D244}245 246define float @select_nnan_fsub_swapped(i1 %cond, float %A, float %B) {247; CHECK-LABEL: @select_nnan_fsub_swapped(248; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]249; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]250; CHECK-NEXT: ret float [[D]]251;252 %C = fsub float %A, %B253 %D = select nnan i1 %cond, float %A, float %C254 ret float %D255}256 257define float @select_nnan_fsub_fast_math(i1 %cond, float %A, float %B) {258; CHECK-LABEL: @select_nnan_fsub_fast_math(259; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00260; CHECK-NEXT: [[D:%.*]] = fsub reassoc nnan arcp contract afn float [[A:%.*]], [[C]]261; CHECK-NEXT: ret float [[D]]262;263 %C = fsub fast float %A, %B264 %D = select nnan i1 %cond, float %C, float %A265 ret float %D266}267 268define float @select_nnan_fsub_swapped_fast_math(i1 %cond, float %A, float %B) {269; CHECK-LABEL: @select_nnan_fsub_swapped_fast_math(270; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 0.000000e+00, float [[B:%.*]]271; CHECK-NEXT: [[D:%.*]] = fsub reassoc nnan arcp contract afn float [[A:%.*]], [[C]]272; CHECK-NEXT: ret float [[D]]273;274 %C = fsub fast float %A, %B275 %D = select nnan i1 %cond, float %A, float %C276 ret float %D277}278 279define float @select_fpclass_fsub_ninf1(i1 %cond, float nofpclass(nan) %A, float %B) {280; CHECK-LABEL: @select_fpclass_fsub_ninf1(281; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00282; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]283; CHECK-NEXT: ret float [[D]]284;285 %C = fsub ninf float %A, %B286 %D = select i1 %cond, float %C, float %A287 ret float %D288}289 290define float @select_fpclass_fsub_ninf2(i1 %cond, float nofpclass(nan) %A, float %B) {291; CHECK-LABEL: @select_fpclass_fsub_ninf2(292; CHECK-NEXT: [[C:%.*]] = select i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00293; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]294; CHECK-NEXT: ret float [[D]]295;296 %C = fsub float %A, %B297 %D = select ninf i1 %cond, float %C, float %A298 ret float %D299}300 301define float @select_fpclass_fsub_ninf3(i1 %cond, float nofpclass(nan) %A, float %B) {302; CHECK-LABEL: @select_fpclass_fsub_ninf3(303; CHECK-NEXT: [[C:%.*]] = select ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00304; CHECK-NEXT: [[D:%.*]] = fsub ninf float [[A:%.*]], [[C]]305; CHECK-NEXT: ret float [[D]]306;307 %C = fsub ninf float %A, %B308 %D = select ninf i1 %cond, float %C, float %A309 ret float %D310}311 312define float @select_fpclass_fsub_nnan_ninf(i1 %cond, float nofpclass(nan) %A, float %B) {313; CHECK-LABEL: @select_fpclass_fsub_nnan_ninf(314; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 0.000000e+00315; CHECK-NEXT: [[D:%.*]] = fsub float [[A:%.*]], [[C]]316; CHECK-NEXT: ret float [[D]]317;318 %C = fsub float %A, %B319 %D = select nnan ninf i1 %cond, float %C, float %A320 ret float %D321}322 323define <4 x float> @select_nnan_nsz_fsub_v4f32(<4 x i1> %cond, <4 x float> %A, <4 x float> %B) {324; CHECK-LABEL: @select_nnan_nsz_fsub_v4f32(325; CHECK-NEXT: [[C:%.*]] = select nnan nsz <4 x i1> [[COND:%.*]], <4 x float> [[B:%.*]], <4 x float> zeroinitializer326; CHECK-NEXT: [[D:%.*]] = fsub <4 x float> [[A:%.*]], [[C]]327; CHECK-NEXT: ret <4 x float> [[D]]328;329 %C = fsub <4 x float> %A, %B330 %D = select nnan nsz <4 x i1> %cond, <4 x float> %C, <4 x float> %A331 ret <4 x float> %D332}333 334define <vscale x 4 x float> @select_nnan_nsz_fsub_nxv4f32(<vscale x 4 x i1> %cond, <vscale x 4 x float> %A, <vscale x 4 x float> %B) {335; CHECK-LABEL: @select_nnan_nsz_fsub_nxv4f32(336; CHECK-NEXT: [[C:%.*]] = select nnan nsz <vscale x 4 x i1> [[COND:%.*]], <vscale x 4 x float> [[B:%.*]], <vscale x 4 x float> zeroinitializer337; CHECK-NEXT: [[D:%.*]] = fsub <vscale x 4 x float> [[A:%.*]], [[C]]338; CHECK-NEXT: ret <vscale x 4 x float> [[D]]339;340 %C = fsub <vscale x 4 x float> %A, %B341 %D = select nnan nsz <vscale x 4 x i1> %cond, <vscale x 4 x float> %C, <vscale x 4 x float> %A342 ret <vscale x 4 x float> %D343}344 345; 'fsub' can only fold on the amount subtracted.346define float @select_nnan_fsub_invalid(i1 %cond, float %A, float %B) {347; CHECK-LABEL: @select_nnan_fsub_invalid(348; CHECK-NEXT: [[C:%.*]] = fsub float [[B:%.*]], [[A:%.*]]349; CHECK-NEXT: [[D:%.*]] = select nnan i1 [[COND:%.*]], float [[C]], float [[A]]350; CHECK-NEXT: ret float [[D]]351;352 %C = fsub float %B, %A353 %D = select nnan i1 %cond, float %C, float %A354 ret float %D355}356 357define float @select_nnan_fdiv(i1 %cond, float %A, float %B) {358; CHECK-LABEL: @select_nnan_fdiv(359; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00360; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]361; CHECK-NEXT: ret float [[D]]362;363 %C = fdiv float %A, %B364 %D = select nnan i1 %cond, float %C, float %A365 ret float %D366}367 368define float @select_nnan_fdiv_swapped(i1 %cond, float %A, float %B) {369; CHECK-LABEL: @select_nnan_fdiv_swapped(370; CHECK-NEXT: [[C:%.*]] = select nnan i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]371; CHECK-NEXT: [[D:%.*]] = fdiv float [[A:%.*]], [[C]]372; CHECK-NEXT: ret float [[D]]373;374 %C = fdiv float %A, %B375 %D = select nnan i1 %cond, float %A, float %C376 ret float %D377}378 379define float @select_nnan_fdiv_fast_math(i1 %cond, float %A, float %B) {380; CHECK-LABEL: @select_nnan_fdiv_fast_math(381; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float [[B:%.*]], float 1.000000e+00382; CHECK-NEXT: [[D:%.*]] = fdiv reassoc nnan arcp contract afn float [[A:%.*]], [[C]]383; CHECK-NEXT: ret float [[D]]384;385 %C = fdiv fast float %A, %B386 %D = select nnan i1 %cond, float %C, float %A387 ret float %D388}389 390define float @select_nnan_fdiv_swapped_fast_math(i1 %cond, float %A, float %B) {391; CHECK-LABEL: @select_nnan_fdiv_swapped_fast_math(392; CHECK-NEXT: [[C:%.*]] = select nnan ninf i1 [[COND:%.*]], float 1.000000e+00, float [[B:%.*]]393; CHECK-NEXT: [[D:%.*]] = fdiv reassoc nnan arcp contract afn float [[A:%.*]], [[C]]394; CHECK-NEXT: ret float [[D]]395;396 %C = fdiv fast float %A, %B397 %D = select nnan i1 %cond, float %A, float %C398 ret float %D399}400 401; 'fdiv' can only fold on the divisor amount.402define float @select_nnan_fdiv_invalid(i1 %cond, float %A, float %B) {403; CHECK-LABEL: @select_nnan_fdiv_invalid(404; CHECK-NEXT: [[C:%.*]] = fdiv float [[B:%.*]], [[A:%.*]]405; CHECK-NEXT: [[D:%.*]] = select nnan i1 [[COND:%.*]], float [[C]], float [[A]]406; CHECK-NEXT: ret float [[D]]407;408 %C = fdiv float %B, %A409 %D = select nnan i1 %cond, float %C, float %A410 ret float %D411}412