361 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define half @copysign_fneg_x(half %x, half %y) {5; CHECK-LABEL: @copysign_fneg_x(6; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])7; CHECK-NEXT: ret half [[COPYSIGN]]8;9 %fneg.x = fneg half %x10 %copysign = call half @llvm.copysign.f16(half %fneg.x, half %y)11 ret half %copysign12}13 14define half @copysign_fabs_x(half %x, half %y) {15; CHECK-LABEL: @copysign_fabs_x(16; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])17; CHECK-NEXT: ret half [[COPYSIGN]]18;19 %fabs.x = call half @llvm.fabs.f16(half %x)20 %copysign = call half @llvm.copysign.f16(half %fabs.x, half %y)21 ret half %copysign22}23 24define half @copysign_fneg_fabs_x(half %x, half %y) {25; CHECK-LABEL: @copysign_fneg_fabs_x(26; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])27; CHECK-NEXT: ret half [[COPYSIGN]]28;29 %fabs.x = call half @llvm.fabs.f16(half %x)30 %fneg.fabs.x = fneg half %fabs.x31 %copysign = call half @llvm.copysign.f16(half %fneg.fabs.x, half %y)32 ret half %copysign33}34 35define half @copysign_fneg_y(half %x, half %y) {36; CHECK-LABEL: @copysign_fneg_y(37; CHECK-NEXT: [[FNEG_Y:%.*]] = fneg half [[Y:%.*]]38; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[FNEG_Y]])39; CHECK-NEXT: ret half [[COPYSIGN]]40;41 %fneg.y = fneg half %y42 %copysign = call half @llvm.copysign.f16(half %x, half %fneg.y)43 ret half %copysign44}45 46define half @copysign_fabs_y(half %x, half %y) {47; CHECK-LABEL: @copysign_fabs_y(48; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])49; CHECK-NEXT: ret half [[COPYSIGN]]50;51 %fabs.y = call half @llvm.fabs.f16(half %y)52 %copysign = call half @llvm.copysign.f16(half %x, half %fabs.y)53 ret half %copysign54}55 56define half @copysign_fneg_fabs_y(half %x, half %y) {57; CHECK-LABEL: @copysign_fneg_fabs_y(58; CHECK-NEXT: [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])59; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg half [[TMP1]]60; CHECK-NEXT: ret half [[COPYSIGN]]61;62 %fabs.y = call half @llvm.fabs.f16(half %y)63 %fneg.fabs.y = fneg half %fabs.y64 %copysign = call half @llvm.copysign.f16(half %x, half %fneg.fabs.y)65 ret half %copysign66}67 68define half @fneg_copysign(half %x, half %y) {69; CHECK-LABEL: @fneg_copysign(70; CHECK-NEXT: [[TMP1:%.*]] = fneg half [[Y:%.*]]71; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[TMP1]])72; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]73;74 %copysign = call half @llvm.copysign.f16(half %x, half %y)75 %fneg.copysign = fneg half %copysign76 ret half %fneg.copysign77}78 79define half @fneg_fabs_copysign(half %x, half %y) {80; CHECK-LABEL: @fneg_fabs_copysign(81; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])82; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg half [[FABS_COPYSIGN]]83; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]84;85 %copysign = call half @llvm.copysign.f16(half %x, half %y)86 %fabs.copysign = call half @llvm.fabs.f16(half %copysign)87 %fneg.fabs.copysign = fneg half %fabs.copysign88 ret half %fneg.fabs.copysign89}90 91; https://alive2.llvm.org/ce/z/Ft-7ea92define half @fabs_copysign(half %x, half %y) {93; CHECK-LABEL: @fabs_copysign(94; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])95; CHECK-NEXT: ret half [[FABS_COPYSIGN]]96;97 %copysign = call half @llvm.copysign.f16(half %x, half %y)98 %fabs.copysign = call half @llvm.fabs.f16(half %copysign)99 ret half %fabs.copysign100}101 102define <2 x half> @fneg_copysign_vector(<2 x half> %x, <2 x half> %y) {103; CHECK-LABEL: @fneg_copysign_vector(104; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x half> [[Y:%.*]]105; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = call <2 x half> @llvm.copysign.v2f16(<2 x half> [[X:%.*]], <2 x half> [[TMP1]])106; CHECK-NEXT: ret <2 x half> [[FNEG_COPYSIGN]]107;108 %copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)109 %fneg.copysign = fneg <2 x half> %copysign110 ret <2 x half> %fneg.copysign111}112 113define <2 x half> @fneg_fabs_copysign_vector(<2 x half> %x, <2 x half> %y) {114; CHECK-LABEL: @fneg_fabs_copysign_vector(115; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X:%.*]])116; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg <2 x half> [[FABS_COPYSIGN]]117; CHECK-NEXT: ret <2 x half> [[FNEG_FABS_COPYSIGN]]118;119 %copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)120 %fabs.copysign = call <2 x half> @llvm.fabs.v2f16(<2 x half> %copysign)121 %fneg.fabs.copysign = fneg <2 x half> %fabs.copysign122 ret <2 x half> %fneg.fabs.copysign123}124 125define <2 x half> @fabs_copysign_vector(<2 x half> %x, <2 x half> %y) {126; CHECK-LABEL: @fabs_copysign_vector(127; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X:%.*]])128; CHECK-NEXT: ret <2 x half> [[FABS_COPYSIGN]]129;130 %copysign = call <2 x half> @llvm.copysign.v2f16(<2 x half> %x, <2 x half> %y)131 %fabs.copysign = call <2 x half> @llvm.fabs.v2f16(<2 x half> %copysign)132 ret <2 x half> %fabs.copysign133}134 135define half @fneg_copysign_flags(half %x, half %y) {136; CHECK-LABEL: @fneg_copysign_flags(137; CHECK-NEXT: [[TMP1:%.*]] = fneg nsz half [[Y:%.*]]138; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = call nsz half @llvm.copysign.f16(half [[X:%.*]], half [[TMP1]])139; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]140;141 %copysign = call nnan nsz half @llvm.copysign.f16(half %x, half %y)142 %fneg.copysign = fneg ninf nsz half %copysign143 ret half %fneg.copysign144}145 146define half @fneg_fabs_copysign_flags(half %x, half %y) {147; CHECK-LABEL: @fneg_fabs_copysign_flags(148; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan ninf afn half @llvm.fabs.f16(half [[X:%.*]])149; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg reassoc ninf half [[FABS_COPYSIGN]]150; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]151;152 %copysign = call nnan nsz ninf half @llvm.copysign.f16(half %x, half %y)153 %fabs.copysign = call nnan afn ninf half @llvm.fabs.f16(half %copysign)154 %fneg.fabs.copysign = fneg reassoc ninf half %fabs.copysign155 ret half %fneg.fabs.copysign156}157 158; Make sure we don't break things by polluting copysign with nsz159define half @fneg_nsz_copysign(half %x, half %y) {160; CHECK-LABEL: @fneg_nsz_copysign(161; CHECK-NEXT: [[TMP1:%.*]] = fneg half [[Y:%.*]]162; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[TMP1]])163; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]164;165 %copysign = call half @llvm.copysign.f16(half %x, half %y)166 %fneg.copysign = fneg nsz half %copysign167 ret half %fneg.copysign168}169 170define half @fneg_fabs_copysign_flags_none_fabs(half %x, half %y) {171; CHECK-LABEL: @fneg_fabs_copysign_flags_none_fabs(172; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])173; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg fast half [[FABS_COPYSIGN]]174; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]175;176 %copysign = call nnan nsz ninf half @llvm.copysign.f16(half %x, half %y)177 %fabs.copysign = call half @llvm.fabs.f16(half %copysign)178 %fneg.fabs.copysign = fneg fast half %fabs.copysign179 ret half %fneg.fabs.copysign180}181 182define half @fabs_copysign_flags(half %x, half %y) {183; CHECK-LABEL: @fabs_copysign_flags(184; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan nsz half @llvm.fabs.f16(half [[X:%.*]])185; CHECK-NEXT: ret half [[FABS_COPYSIGN]]186;187 %copysign = call nnan half @llvm.copysign.f16(half %x, half %y)188 %fabs.copysign = call nsz nnan half @llvm.fabs.f16(half %copysign)189 ret half %fabs.copysign190}191 192define half @fabs_copysign_all_flags(half %x, half %y) {193; CHECK-LABEL: @fabs_copysign_all_flags(194; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call fast half @llvm.fabs.f16(half [[X:%.*]])195; CHECK-NEXT: ret half [[FABS_COPYSIGN]]196;197 %copysign = call fast half @llvm.copysign.f16(half %x, half %y)198 %fabs.copysign = call fast half @llvm.fabs.f16(half %copysign)199 ret half %fabs.copysign200}201 202define half @fabs_copysign_no_flags_copysign_user(half %x, half %y, ptr %ptr) {203; CHECK-LABEL: @fabs_copysign_no_flags_copysign_user(204; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])205; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2206; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call fast half @llvm.fabs.f16(half [[X]])207; CHECK-NEXT: ret half [[FABS_COPYSIGN]]208;209 %copysign = call half @llvm.copysign.f16(half %x, half %y)210 store half %copysign, ptr %ptr211 %fabs.copysign = call fast half @llvm.fabs.f16(half %copysign)212 ret half %fabs.copysign213}214 215define half @fneg_fabs_copysign_drop_flags(half %x, half %y) {216; CHECK-LABEL: @fneg_fabs_copysign_drop_flags(217; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call ninf half @llvm.fabs.f16(half [[X:%.*]])218; CHECK-NEXT: [[FNEG_FABS_COPYSIGN:%.*]] = fneg nsz half [[FABS_COPYSIGN]]219; CHECK-NEXT: ret half [[FNEG_FABS_COPYSIGN]]220;221 %copysign = call nnan half @llvm.copysign.f16(half %x, half %y)222 %fabs.copysign = call ninf half @llvm.fabs.f16(half %copysign)223 %fneg.fabs.copysign = fneg nsz half %fabs.copysign224 ret half %fneg.fabs.copysign225}226 227define half @fneg_copysign_multi_use(half %x, half %y, ptr %ptr) {228; CHECK-LABEL: @fneg_copysign_multi_use(229; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])230; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2231; CHECK-NEXT: [[FNEG_COPYSIGN:%.*]] = fneg half [[COPYSIGN]]232; CHECK-NEXT: ret half [[FNEG_COPYSIGN]]233;234 %copysign = call half @llvm.copysign.f16(half %x, half %y)235 store half %copysign, ptr %ptr236 %fneg.copysign = fneg half %copysign237 ret half %fneg.copysign238}239 240define half @fabs_copysign_multi_use(half %x, half %y, ptr %ptr) {241; CHECK-LABEL: @fabs_copysign_multi_use(242; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])243; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2244; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X]])245; CHECK-NEXT: ret half [[FABS_COPYSIGN]]246;247 %copysign = call half @llvm.copysign.f16(half %x, half %y)248 store half %copysign, ptr %ptr249 %fabs.copysign = call half @llvm.fabs.f16(half %copysign)250 ret half %fabs.copysign251}252 253define half @fabs_flags_copysign_multi_use(half %x, half %y, ptr %ptr) {254; CHECK-LABEL: @fabs_flags_copysign_multi_use(255; CHECK-NEXT: [[COPYSIGN:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])256; CHECK-NEXT: store half [[COPYSIGN]], ptr [[PTR:%.*]], align 2257; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call nnan ninf half @llvm.fabs.f16(half [[X]])258; CHECK-NEXT: ret half [[FABS_COPYSIGN]]259;260 %copysign = call half @llvm.copysign.f16(half %x, half %y)261 store half %copysign, ptr %ptr262 %fabs.copysign = call ninf nnan half @llvm.fabs.f16(half %copysign)263 ret half %fabs.copysign264}265 266define half @fneg_fabs_copysign_multi_use_fabs(half %x, half %y, ptr %ptr) {267; CHECK-LABEL: @fneg_fabs_copysign_multi_use_fabs(268; CHECK-NEXT: [[FABS_COPYSIGN:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])269; CHECK-NEXT: store half [[FABS_COPYSIGN]], ptr [[PTR:%.*]], align 2270; CHECK-NEXT: ret half [[FABS_COPYSIGN]]271;272 %copysign = call half @llvm.copysign.f16(half %x, half %y)273 %fabs.copysign = call half @llvm.fabs.f16(half %copysign)274 store half %fabs.copysign, ptr %ptr275 ret half %fabs.copysign276}277 278define half @copysign_pos(half %a) {279; CHECK-LABEL: @copysign_pos(280; CHECK-NEXT: entry:281; CHECK-NEXT: [[RET:%.*]] = call half @llvm.copysign.f16(half 0xH3C00, half [[A:%.*]])282; CHECK-NEXT: ret half [[RET]]283;284entry:285 %ret = call half @llvm.copysign.f16(half 0xH3C00, half %a)286 ret half %ret287}288 289define half @copysign_neg(half %a) {290; CHECK-LABEL: @copysign_neg(291; CHECK-NEXT: entry:292; CHECK-NEXT: [[RET:%.*]] = call half @llvm.copysign.f16(half 0xH3C00, half [[A:%.*]])293; CHECK-NEXT: ret half [[RET]]294;295entry:296 %ret = call half @llvm.copysign.f16(half 0xHBC00, half %a)297 ret half %ret298}299 300define half @copysign_negzero(half %a) {301; CHECK-LABEL: @copysign_negzero(302; CHECK-NEXT: entry:303; CHECK-NEXT: [[RET:%.*]] = call half @llvm.copysign.f16(half 0xH0000, half [[A:%.*]])304; CHECK-NEXT: ret half [[RET]]305;306entry:307 %ret = call half @llvm.copysign.f16(half 0xH8000, half %a)308 ret half %ret309}310 311define half @copysign_negnan(half %a) {312; CHECK-LABEL: @copysign_negnan(313; CHECK-NEXT: entry:314; CHECK-NEXT: [[RET:%.*]] = call half @llvm.copysign.f16(half 0xH7E00, half [[A:%.*]])315; CHECK-NEXT: ret half [[RET]]316;317entry:318 %ret = call half @llvm.copysign.f16(half 0xHFE00, half %a)319 ret half %ret320}321 322define half @copysign_neginf(half %a) {323; CHECK-LABEL: @copysign_neginf(324; CHECK-NEXT: entry:325; CHECK-NEXT: [[RET:%.*]] = call half @llvm.copysign.f16(half 0xH7C00, half [[A:%.*]])326; CHECK-NEXT: ret half [[RET]]327;328entry:329 %ret = call half @llvm.copysign.f16(half 0xHFC00, half %a)330 ret half %ret331}332 333define <4 x half> @copysign_splat(<4 x half> %a) {334; CHECK-LABEL: @copysign_splat(335; CHECK-NEXT: entry:336; CHECK-NEXT: [[RET:%.*]] = call <4 x half> @llvm.copysign.v4f16(<4 x half> splat (half 0xH3C00), <4 x half> [[A:%.*]])337; CHECK-NEXT: ret <4 x half> [[RET]]338;339entry:340 %ret = call <4 x half> @llvm.copysign.v4f16(<4 x half> splat(half 0xHBC00), <4 x half> %a)341 ret <4 x half> %ret342}343 344; TODO: Support constant folding of fabs345 346define <4 x half> @copysign_vec4(<4 x half> %a) {347; CHECK-LABEL: @copysign_vec4(348; CHECK-NEXT: entry:349; CHECK-NEXT: [[RET:%.*]] = call <4 x half> @llvm.copysign.v4f16(<4 x half> <half 0xH3C00, half 0xHBC00, half undef, half poison>, <4 x half> [[A:%.*]])350; CHECK-NEXT: ret <4 x half> [[RET]]351;352entry:353 %ret = call <4 x half> @llvm.copysign.v4f16(<4 x half> <half 0xH3C00, half 0xHBC00, half undef, half poison>, <4 x half> %a)354 ret <4 x half> %ret355}356 357declare half @llvm.fabs.f16(half)358declare <2 x half> @llvm.fabs.v2f16(<2 x half>)359declare half @llvm.copysign.f16(half, half)360declare <2 x half> @llvm.copysign.v2f16(<2 x half>, <2 x half>)361