brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.1 KiB · e8b0fb1 Raw
646 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare void @dummy()5 6declare i32 @llvm.smax.i32(i32 %a, i32 %b)7declare i32 @llvm.smin.i32(i32 %a, i32 %b)8declare i32 @llvm.umax.i32(i32 %a, i32 %b)9declare i32 @llvm.umin.i32(i32 %a, i32 %b)10declare float @llvm.maxnum.f32(float %a, float %b)11declare float @llvm.minnum.f32(float %a, float %b)12declare float @llvm.maximum.f32(float %a, float %b)13declare float @llvm.minimum.f32(float %a, float %b)14declare float @llvm.pow.f32(float %a, float %b)15 16define i8 @fold_phi_mul(i1 %c, i8 %a, i8 %b)  {17; CHECK-LABEL: define i8 @fold_phi_mul(18; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {19; CHECK-NEXT:  entry:20; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]21; CHECK:       then:22; CHECK-NEXT:    call void @dummy()23; CHECK-NEXT:    br label [[END]]24; CHECK:       end:25; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]26; CHECK-NEXT:    ret i8 [[RET]]27;28entry:29  br i1 %c, label %then, label %end30then:31  call void @dummy()32  br label %end33end:34  %phi1 = phi i8 [%a, %entry], [%b, %then]35  %phi2 = phi i8 [%b, %entry], [%a, %then]36  %ret = mul i8 %phi1, %phi237  ret i8 %ret38}39 40define i8 @fold_phi_mul_three(i1 %c, i1 %d, i8 %a, i8 %b)  {41; CHECK-LABEL: define i8 @fold_phi_mul_three(42; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {43; CHECK-NEXT:  entry:44; CHECK-NEXT:    br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]]45; CHECK:       then1:46; CHECK-NEXT:    call void @dummy()47; CHECK-NEXT:    br i1 [[D]], label [[THEN2:%.*]], label [[END]]48; CHECK:       then2:49; CHECK-NEXT:    call void @dummy()50; CHECK-NEXT:    br label [[END]]51; CHECK:       end:52; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]53; CHECK-NEXT:    ret i8 [[RET]]54;55entry:56  br i1 %c, label %then1, label %end57then1:58  call void @dummy()59  br i1 %d, label %then2, label %end60then2:61  call void @dummy()62  br label %end63end:64  %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2]65  %phi2 = phi i8 [%b, %entry], [%a, %then1], [%b, %then2]66  %ret = mul i8 %phi1, %phi267  ret i8 %ret68}69 70define i8 @fold_phi_mul_three_notopt(i1 %c, i1 %d, i8 %a, i8 %b)  {71; CHECK-LABEL: define i8 @fold_phi_mul_three_notopt(72; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {73; CHECK-NEXT:  entry:74; CHECK-NEXT:    br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]]75; CHECK:       then1:76; CHECK-NEXT:    call void @dummy()77; CHECK-NEXT:    br i1 [[D]], label [[THEN2:%.*]], label [[END]]78; CHECK:       then2:79; CHECK-NEXT:    call void @dummy()80; CHECK-NEXT:    br label [[END]]81; CHECK:       end:82; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN1]] ], [ [[A]], [[THEN2]] ]83; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN1]] ], [ [[A]], [[THEN2]] ]84; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]]85; CHECK-NEXT:    ret i8 [[RET]]86;87entry:88  br i1 %c, label %then1, label %end89then1:90  call void @dummy()91  br i1 %d, label %then2, label %end92then2:93  call void @dummy()94  br label %end95end:96  %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2]97  %phi2 = phi i8 [%b, %entry], [%a, %then1], [%a, %then2]98  %ret = mul i8 %phi1, %phi299  ret i8 %ret100}101 102define i8 @fold_phi_mul_nsw_nuw(i1 %c, i8 %a, i8 %b)  {103; CHECK-LABEL: define i8 @fold_phi_mul_nsw_nuw(104; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {105; CHECK-NEXT:  entry:106; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]107; CHECK:       then:108; CHECK-NEXT:    call void @dummy()109; CHECK-NEXT:    br label [[END]]110; CHECK:       end:111; CHECK-NEXT:    [[RET:%.*]] = mul nuw nsw i8 [[A]], [[B]]112; CHECK-NEXT:    ret i8 [[RET]]113;114entry:115  br i1 %c, label %then, label %end116then:117  call void @dummy()118  br label %end119end:120  %phi1 = phi i8 [%a, %entry], [%b, %then]121  %phi2 = phi i8 [%b, %entry], [%a, %then]122  %ret = mul nsw nuw i8 %phi1, %phi2123  ret i8 %ret124}125 126define <2 x i8> @fold_phi_mul_fix_vec(i1 %c, <2 x i8> %a, <2 x i8> %b)  {127; CHECK-LABEL: define <2 x i8> @fold_phi_mul_fix_vec(128; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) {129; CHECK-NEXT:  entry:130; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]131; CHECK:       then:132; CHECK-NEXT:    call void @dummy()133; CHECK-NEXT:    br label [[END]]134; CHECK:       end:135; CHECK-NEXT:    [[RET:%.*]] = mul <2 x i8> [[A]], [[B]]136; CHECK-NEXT:    ret <2 x i8> [[RET]]137;138entry:139  br i1 %c, label %then, label %end140then:141  call void @dummy()142  br label %end143end:144  %phi1 = phi <2 x i8> [%a, %entry], [%b, %then]145  %phi2 = phi <2 x i8> [%b, %entry], [%a, %then]146  %ret = mul <2 x i8> %phi1, %phi2147  ret <2 x i8> %ret148}149 150define <vscale x 2 x i8> @fold_phi_mul_scale_vec(i1 %c, <vscale x 2 x i8> %a, <vscale x 2 x i8> %b)  {151; CHECK-LABEL: define <vscale x 2 x i8> @fold_phi_mul_scale_vec(152; CHECK-SAME: i1 [[C:%.*]], <vscale x 2 x i8> [[A:%.*]], <vscale x 2 x i8> [[B:%.*]]) {153; CHECK-NEXT:  entry:154; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]155; CHECK:       then:156; CHECK-NEXT:    call void @dummy()157; CHECK-NEXT:    br label [[END]]158; CHECK:       end:159; CHECK-NEXT:    [[RET:%.*]] = mul <vscale x 2 x i8> [[A]], [[B]]160; CHECK-NEXT:    ret <vscale x 2 x i8> [[RET]]161;162entry:163  br i1 %c, label %then, label %end164then:165  call void @dummy()166  br label %end167end:168  %phi1 = phi <vscale x 2 x i8> [%a, %entry], [%b, %then]169  %phi2 = phi <vscale x 2 x i8> [%b, %entry], [%a, %then]170  %ret = mul <vscale x 2 x i8> %phi1, %phi2171  ret <vscale x 2 x i8> %ret172}173 174define i8 @fold_phi_mul_commute(i1 %c, i8 %a, i8 %b)  {175; CHECK-LABEL: define i8 @fold_phi_mul_commute(176; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {177; CHECK-NEXT:  entry:178; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]179; CHECK:       then:180; CHECK-NEXT:    call void @dummy()181; CHECK-NEXT:    br label [[END]]182; CHECK:       end:183; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[A]], [[B]]184; CHECK-NEXT:    ret i8 [[RET]]185;186entry:187  br i1 %c, label %then, label %end188then:189  call void @dummy()190  br label %end191end:192  %phi1 = phi i8 [%a, %entry], [%b, %then]193  %phi2 = phi i8 [%a, %then], [%b, %entry]194  %ret = mul i8 %phi1, %phi2195  ret i8 %ret196}197 198 199define i8 @fold_phi_mul_notopt(i1 %c, i8 %a, i8 %b, i8 %d)  {200; CHECK-LABEL: define i8 @fold_phi_mul_notopt(201; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]], i8 [[D:%.*]]) {202; CHECK-NEXT:  entry:203; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]204; CHECK:       then:205; CHECK-NEXT:    call void @dummy()206; CHECK-NEXT:    br label [[END]]207; CHECK:       end:208; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]209; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[D]], [[THEN]] ]210; CHECK-NEXT:    [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]]211; CHECK-NEXT:    ret i8 [[RET]]212;213entry:214  br i1 %c, label %then, label %end215then:216  call void @dummy()217  br label %end218end:219  %phi1 = phi i8 [%a, %entry], [%b, %then]220  %phi2 = phi i8 [%b, %entry], [%d, %then]221  %ret = mul i8 %phi1, %phi2222  ret i8 %ret223}224 225 226define i8 @fold_phi_sub(i1 %c, i8 %a, i8 %b)  {227; CHECK-LABEL: define i8 @fold_phi_sub(228; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {229; CHECK-NEXT:  entry:230; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]231; CHECK:       then:232; CHECK-NEXT:    call void @dummy()233; CHECK-NEXT:    br label [[END]]234; CHECK:       end:235; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]236; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ]237; CHECK-NEXT:    [[RET:%.*]] = sub i8 [[PHI1]], [[PHI2]]238; CHECK-NEXT:    ret i8 [[RET]]239;240entry:241  br i1 %c, label %then, label %end242then:243  call void @dummy()244  br label %end245end:246  %phi1 = phi i8 [%a, %entry], [%b, %then]247  %phi2 = phi i8 [%b, %entry], [%a, %then]248  %ret = sub i8 %phi1, %phi2249  ret i8 %ret250}251 252 253define i8 @fold_phi_add(i1 %c, i8 %a, i8 %b)  {254; CHECK-LABEL: define i8 @fold_phi_add(255; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {256; CHECK-NEXT:  entry:257; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]258; CHECK:       then:259; CHECK-NEXT:    call void @dummy()260; CHECK-NEXT:    br label [[END]]261; CHECK:       end:262; CHECK-NEXT:    [[RET:%.*]] = add i8 [[A]], [[B]]263; CHECK-NEXT:    ret i8 [[RET]]264;265entry:266  br i1 %c, label %then, label %end267then:268  call void @dummy()269  br label %end270end:271  %phi1 = phi i8 [%a, %entry], [%b, %then]272  %phi2 = phi i8 [%b, %entry], [%a, %then]273  %ret = add i8 %phi1, %phi2274  ret i8 %ret275}276 277define i8 @fold_phi_and(i1 %c, i8 %a, i8 %b)  {278; CHECK-LABEL: define i8 @fold_phi_and(279; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {280; CHECK-NEXT:  entry:281; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]282; CHECK:       then:283; CHECK-NEXT:    call void @dummy()284; CHECK-NEXT:    br label [[END]]285; CHECK:       end:286; CHECK-NEXT:    [[RET:%.*]] = and i8 [[A]], [[B]]287; CHECK-NEXT:    ret i8 [[RET]]288;289entry:290  br i1 %c, label %then, label %end291then:292  call void @dummy()293  br label %end294end:295  %phi1 = phi i8 [%a, %entry], [%b, %then]296  %phi2 = phi i8 [%b, %entry], [%a, %then]297  %ret = and i8 %phi1, %phi2298  ret i8 %ret299}300 301define i8 @fold_phi_or(i1 %c, i8 %a, i8 %b)  {302; CHECK-LABEL: define i8 @fold_phi_or(303; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {304; CHECK-NEXT:  entry:305; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]306; CHECK:       then:307; CHECK-NEXT:    call void @dummy()308; CHECK-NEXT:    br label [[END]]309; CHECK:       end:310; CHECK-NEXT:    [[RET:%.*]] = or i8 [[A]], [[B]]311; CHECK-NEXT:    ret i8 [[RET]]312;313entry:314  br i1 %c, label %then, label %end315then:316  call void @dummy()317  br label %end318end:319  %phi1 = phi i8 [%a, %entry], [%b, %then]320  %phi2 = phi i8 [%b, %entry], [%a, %then]321  %ret = or i8 %phi1, %phi2322  ret i8 %ret323}324 325 326define i8 @fold_phi_xor(i1 %c, i8 %a, i8 %b)  {327; CHECK-LABEL: define i8 @fold_phi_xor(328; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) {329; CHECK-NEXT:  entry:330; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]331; CHECK:       then:332; CHECK-NEXT:    call void @dummy()333; CHECK-NEXT:    br label [[END]]334; CHECK:       end:335; CHECK-NEXT:    [[RET:%.*]] = xor i8 [[A]], [[B]]336; CHECK-NEXT:    ret i8 [[RET]]337;338entry:339  br i1 %c, label %then, label %end340then:341  call void @dummy()342  br label %end343end:344  %phi1 = phi i8 [%a, %entry], [%b, %then]345  %phi2 = phi i8 [%b, %entry], [%a, %then]346  %ret = xor i8 %phi1, %phi2347  ret i8 %ret348}349 350 351define float @fold_phi_fadd(i1 %c, float %a, float %b)  {352; CHECK-LABEL: define float @fold_phi_fadd(353; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {354; CHECK-NEXT:  entry:355; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]356; CHECK:       then:357; CHECK-NEXT:    call void @dummy()358; CHECK-NEXT:    br label [[END]]359; CHECK:       end:360; CHECK-NEXT:    [[RET:%.*]] = fadd float [[A]], [[B]]361; CHECK-NEXT:    ret float [[RET]]362;363entry:364  br i1 %c, label %then, label %end365then:366  call void @dummy()367  br label %end368end:369  %phi1 = phi float [%a, %entry], [%b, %then]370  %phi2 = phi float [%b, %entry], [%a, %then]371  %ret = fadd float %phi1, %phi2372  ret float %ret373}374 375define float @fold_phi_fadd_nnan(i1 %c, float %a, float %b)  {376; CHECK-LABEL: define float @fold_phi_fadd_nnan(377; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {378; CHECK-NEXT:  entry:379; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]380; CHECK:       then:381; CHECK-NEXT:    call void @dummy()382; CHECK-NEXT:    br label [[END]]383; CHECK:       end:384; CHECK-NEXT:    [[RET:%.*]] = fadd nnan float [[A]], [[B]]385; CHECK-NEXT:    ret float [[RET]]386;387entry:388  br i1 %c, label %then, label %end389then:390  call void @dummy()391  br label %end392end:393  %phi1 = phi float [%a, %entry], [%b, %then]394  %phi2 = phi float [%b, %entry], [%a, %then]395  %ret = fadd nnan float %phi1, %phi2396  ret float %ret397}398 399 400define float @fold_phi_fmul(i1 %c, float %a, float %b)  {401; CHECK-LABEL: define float @fold_phi_fmul(402; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {403; CHECK-NEXT:  entry:404; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]405; CHECK:       then:406; CHECK-NEXT:    call void @dummy()407; CHECK-NEXT:    br label [[END]]408; CHECK:       end:409; CHECK-NEXT:    [[RET:%.*]] = fmul float [[A]], [[B]]410; CHECK-NEXT:    ret float [[RET]]411;412entry:413  br i1 %c, label %then, label %end414then:415  call void @dummy()416  br label %end417end:418  %phi1 = phi float [%a, %entry], [%b, %then]419  %phi2 = phi float [%b, %entry], [%a, %then]420  %ret = fmul float %phi1, %phi2421  ret float %ret422}423 424 425define i32 @fold_phi_smax(i1 %c, i32 %a, i32 %b)  {426; CHECK-LABEL: define i32 @fold_phi_smax(427; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {428; CHECK-NEXT:  entry:429; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]430; CHECK:       then:431; CHECK-NEXT:    call void @dummy()432; CHECK-NEXT:    br label [[END]]433; CHECK:       end:434; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smax.i32(i32 [[A]], i32 [[B]])435; CHECK-NEXT:    ret i32 [[RET]]436;437entry:438  br i1 %c, label %then, label %end439then:440  call void @dummy()441  br label %end442end:443  %phi1 = phi i32 [%a, %entry], [%b, %then]444  %phi2 = phi i32 [%b, %entry], [%a, %then]445  %ret = call i32 @llvm.smax.i32(i32  %phi1, i32 %phi2)446  ret i32 %ret447}448 449 450define i32 @fold_phi_smin(i1 %c, i32 %a, i32 %b)  {451; CHECK-LABEL: define i32 @fold_phi_smin(452; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {453; CHECK-NEXT:  entry:454; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]455; CHECK:       then:456; CHECK-NEXT:    call void @dummy()457; CHECK-NEXT:    br label [[END]]458; CHECK:       end:459; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]])460; CHECK-NEXT:    ret i32 [[RET]]461;462entry:463  br i1 %c, label %then, label %end464then:465  call void @dummy()466  br label %end467end:468  %phi1 = phi i32 [%a, %entry], [%b, %then]469  %phi2 = phi i32 [%b, %entry], [%a, %then]470  %ret = call i32 @llvm.smin.i32(i32  %phi1, i32 %phi2)471  ret i32 %ret472}473 474 475define i32 @fold_phi_umax(i1 %c, i32 %a, i32 %b)  {476; CHECK-LABEL: define i32 @fold_phi_umax(477; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {478; CHECK-NEXT:  entry:479; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]480; CHECK:       then:481; CHECK-NEXT:    call void @dummy()482; CHECK-NEXT:    br label [[END]]483; CHECK:       end:484; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 [[B]])485; CHECK-NEXT:    ret i32 [[RET]]486;487entry:488  br i1 %c, label %then, label %end489then:490  call void @dummy()491  br label %end492end:493  %phi1 = phi i32 [%a, %entry], [%b, %then]494  %phi2 = phi i32 [%b, %entry], [%a, %then]495  %ret = call i32 @llvm.umax.i32(i32  %phi1, i32 %phi2)496  ret i32 %ret497}498 499define i32 @fold_phi_umin(i1 %c, i32 %a, i32 %b)  {500; CHECK-LABEL: define i32 @fold_phi_umin(501; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {502; CHECK-NEXT:  entry:503; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]504; CHECK:       then:505; CHECK-NEXT:    call void @dummy()506; CHECK-NEXT:    br label [[END]]507; CHECK:       end:508; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]])509; CHECK-NEXT:    ret i32 [[RET]]510;511entry:512  br i1 %c, label %then, label %end513then:514  call void @dummy()515  br label %end516end:517  %phi1 = phi i32 [%a, %entry], [%b, %then]518  %phi2 = phi i32 [%b, %entry], [%a, %then]519  %ret = call i32 @llvm.umin.i32(i32  %phi1, i32 %phi2)520  ret i32 %ret521}522 523 524define float @fold_phi_maxnum(i1 %c, float %a, float %b)  {525; CHECK-LABEL: define float @fold_phi_maxnum(526; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {527; CHECK-NEXT:  entry:528; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]529; CHECK:       then:530; CHECK-NEXT:    call void @dummy()531; CHECK-NEXT:    br label [[END]]532; CHECK:       end:533; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maxnum.f32(float [[A]], float [[B]])534; CHECK-NEXT:    ret float [[RET]]535;536entry:537  br i1 %c, label %then, label %end538then:539  call void @dummy()540  br label %end541end:542  %phi1 = phi float [%a, %entry], [%b, %then]543  %phi2 = phi float [%b, %entry], [%a, %then]544  %ret = call float @llvm.maxnum.f32(float  %phi1, float %phi2)545  ret float %ret546}547 548define float @fold_phi_pow(i1 %c, float %a, float %b)  {549; CHECK-LABEL: define float @fold_phi_pow(550; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {551; CHECK-NEXT:  entry:552; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]553; CHECK:       then:554; CHECK-NEXT:    call void @dummy()555; CHECK-NEXT:    br label [[END]]556; CHECK:       end:557; CHECK-NEXT:    [[PHI1:%.*]] = phi float [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ]558; CHECK-NEXT:    [[PHI2:%.*]] = phi float [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ]559; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.pow.f32(float [[PHI1]], float [[PHI2]])560; CHECK-NEXT:    ret float [[RET]]561;562entry:563  br i1 %c, label %then, label %end564then:565  call void @dummy()566  br label %end567end:568  %phi1 = phi float [%a, %entry], [%b, %then]569  %phi2 = phi float [%b, %entry], [%a, %then]570  %ret = call float @llvm.pow.f32(float  %phi1, float %phi2)571  ret float %ret572}573 574define float @fold_phi_minnum(i1 %c, float %a, float %b)  {575; CHECK-LABEL: define float @fold_phi_minnum(576; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {577; CHECK-NEXT:  entry:578; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]579; CHECK:       then:580; CHECK-NEXT:    call void @dummy()581; CHECK-NEXT:    br label [[END]]582; CHECK:       end:583; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minnum.f32(float [[A]], float [[B]])584; CHECK-NEXT:    ret float [[RET]]585;586entry:587  br i1 %c, label %then, label %end588then:589  call void @dummy()590  br label %end591end:592  %phi1 = phi float [%a, %entry], [%b, %then]593  %phi2 = phi float [%b, %entry], [%a, %then]594  %ret = call float @llvm.minnum.f32(float  %phi1, float %phi2)595  ret float %ret596}597 598define float @fold_phi_maximum(i1 %c, float %a, float %b)  {599; CHECK-LABEL: define float @fold_phi_maximum(600; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {601; CHECK-NEXT:  entry:602; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]603; CHECK:       then:604; CHECK-NEXT:    call void @dummy()605; CHECK-NEXT:    br label [[END]]606; CHECK:       end:607; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.maximum.f32(float [[A]], float [[B]])608; CHECK-NEXT:    ret float [[RET]]609;610entry:611  br i1 %c, label %then, label %end612then:613  call void @dummy()614  br label %end615end:616  %phi1 = phi float [%a, %entry], [%b, %then]617  %phi2 = phi float [%b, %entry], [%a, %then]618  %ret = call float @llvm.maximum.f32(float  %phi1, float %phi2)619  ret float %ret620}621 622define float @fold_phi_minimum(i1 %c, float %a, float %b)  {623; CHECK-LABEL: define float @fold_phi_minimum(624; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) {625; CHECK-NEXT:  entry:626; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]]627; CHECK:       then:628; CHECK-NEXT:    call void @dummy()629; CHECK-NEXT:    br label [[END]]630; CHECK:       end:631; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.minimum.f32(float [[A]], float [[B]])632; CHECK-NEXT:    ret float [[RET]]633;634entry:635  br i1 %c, label %then, label %end636then:637  call void @dummy()638  br label %end639end:640  %phi1 = phi float [%a, %entry], [%b, %then]641  %phi2 = phi float [%b, %entry], [%a, %then]642  %ret = call float @llvm.minimum.f32(float  %phi1, float %phi2)643  ret float %ret644}645 646