275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4define i32 @phi_freeze_same_consts(i1 %c0, i1 %c1) {5; CHECK-LABEL: define i32 @phi_freeze_same_consts(6; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {7; CHECK-NEXT: [[ENTRY:.*:]]8; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]9; CHECK: [[BB_FREEZE]]:10; CHECK-NEXT: br label %[[FINAL:.*]]11; CHECK: [[BB_OTHER]]:12; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]13; CHECK: [[CA]]:14; CHECK-NEXT: br label %[[FINAL]]15; CHECK: [[CB]]:16; CHECK-NEXT: br label %[[FINAL]]17; CHECK: [[FINAL]]:18; CHECK-NEXT: ret i32 4219;20entry:21 br i1 %c0, label %bb_freeze, label %bb_other22 23bb_freeze:24 %f = freeze i32 undef25 br label %final26 27bb_other:28 br i1 %c1, label %cA, label %cB29cA:30 br label %final31cB:32 br label %final33 34final:35 %phi = phi i32 [ %f, %bb_freeze ], [ 42, %cA ], [ 42, %cB ]36 ret i32 %phi37}38 39define i32 @phi_freeze_mixed_consts(i1 %c0, i1 %c1) {40; CHECK-LABEL: define i32 @phi_freeze_mixed_consts(41; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {42; CHECK-NEXT: [[ENTRY:.*:]]43; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]44; CHECK: [[BB_FREEZE]]:45; CHECK-NEXT: br label %[[FINAL:.*]]46; CHECK: [[BB_OTHER]]:47; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]48; CHECK: [[CA]]:49; CHECK-NEXT: br label %[[FINAL]]50; CHECK: [[CB]]:51; CHECK-NEXT: br label %[[FINAL]]52; CHECK: [[FINAL]]:53; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[BB_FREEZE]] ], [ 42, %[[CA]] ], [ 7, %[[CB]] ]54; CHECK-NEXT: ret i32 [[PHI]]55;56entry:57 br i1 %c0, label %bb_freeze, label %bb_other58 59bb_freeze:60 %f = freeze i32 undef61 br label %final62 63bb_other:64 br i1 %c1, label %cA, label %cB65cA:66 br label %final67cB:68 br label %final69 70final:71 %phi = phi i32 [ %f, %bb_freeze ], [ 42, %cA ], [ 7, %cB ]72 ret i32 %phi73}74 75define i32 @phi_freeze_with_nonconst_incoming(i32 %x, i1 %c0, i1 %c1) {76; CHECK-LABEL: define i32 @phi_freeze_with_nonconst_incoming(77; CHECK-SAME: i32 [[X:%.*]], i1 [[C0:%.*]], i1 [[C1:%.*]]) {78; CHECK-NEXT: [[ENTRY:.*:]]79; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]80; CHECK: [[BB_FREEZE]]:81; CHECK-NEXT: br label %[[FINAL:.*]]82; CHECK: [[BB_OTHER]]:83; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]84; CHECK: [[CA]]:85; CHECK-NEXT: br label %[[FINAL]]86; CHECK: [[CB]]:87; CHECK-NEXT: br label %[[FINAL]]88; CHECK: [[FINAL]]:89; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[BB_FREEZE]] ], [ [[X]], %[[CA]] ], [ 13, %[[CB]] ]90; CHECK-NEXT: ret i32 [[PHI]]91;92entry:93 br i1 %c0, label %bb_freeze, label %bb_other94 95bb_freeze:96 %f = freeze i32 undef97 br label %final98 99bb_other:100 br i1 %c1, label %cA, label %cB101cA:102 br label %final103cB:104 br label %final105 106final:107 %phi = phi i32 [ %f, %bb_freeze ], [ %x, %cA ], [ 13, %cB ]108 ret i32 %phi109}110 111define <4 x i8> @phi_freeze_vector(i1 %c0, i1 %c1) {112; CHECK-LABEL: define <4 x i8> @phi_freeze_vector(113; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {114; CHECK-NEXT: [[ENTRY:.*:]]115; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]116; CHECK: [[BB_FREEZE]]:117; CHECK-NEXT: br label %[[FINAL:.*]]118; CHECK: [[BB_OTHER]]:119; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]120; CHECK: [[CA]]:121; CHECK-NEXT: br label %[[FINAL]]122; CHECK: [[CB]]:123; CHECK-NEXT: br label %[[FINAL]]124; CHECK: [[FINAL]]:125; CHECK-NEXT: ret <4 x i8> splat (i8 9)126;127entry:128 br i1 %c0, label %bb_freeze, label %bb_other129 130bb_freeze:131 %f = freeze <4 x i8> undef132 br label %final133 134bb_other:135 br i1 %c1, label %cA, label %cB136 137cA:138 br label %final139 140cB:141 br label %final142 143final:144 %phi = phi <4 x i8> [ %f, %bb_freeze ],145 [<i8 9, i8 9, i8 9, i8 9>, %cA ],146 [<i8 9, i8 9, i8 9, i8 9>, %cB ]147 ret <4 x i8> %phi148}149 150define i32 @multi_use_one_folds_one_not_zero(i1 %c0, i1 %c1, i1 %c2) {151; CHECK-LABEL: define i32 @multi_use_one_folds_one_not_zero(152; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) {153; CHECK-NEXT: [[ENTRY:.*:]]154; CHECK-NEXT: br i1 [[C0]], label %[[BB_OTHER3:.*]], label %[[CC1:.*]]155; CHECK: [[BB_OTHER3]]:156; CHECK-NEXT: br label %[[MID:.*]]157; CHECK: [[CC1]]:158; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]159; CHECK: [[CA]]:160; CHECK-NEXT: br label %[[MID]]161; CHECK: [[CB]]:162; CHECK-NEXT: br label %[[MID]]163; CHECK: [[MID]]:164; CHECK-NEXT: [[PHI_FOLD:%.*]] = phi i32 [ 0, %[[BB_OTHER3]] ], [ 1, %[[CA]] ], [ 1, %[[CB]] ]165; CHECK-NEXT: br i1 [[C2]], label %[[BB_FREEZE2:.*]], label %[[CD:.*]]166; CHECK: [[BB_FREEZE2]]:167; CHECK-NEXT: br label %[[FINAL:.*]]168; CHECK: [[BB_OTHER2:.*:]]169; CHECK-NEXT: br i1 true, label %[[CA]], label %[[CB]]170; CHECK: [[CC:.*:]]171; CHECK-NEXT: br label %[[FINAL]]172; CHECK: [[CD]]:173; CHECK-NEXT: br label %[[FINAL]]174; CHECK: [[FINAL]]:175; CHECK-NEXT: ret i32 [[PHI_FOLD]]176;177entry:178 %f = freeze i32 undef179 br i1 %c0, label %bb_freeze, label %bb_other180bb_freeze:181 br label %mid182bb_other:183 br i1 %c1, label %cA, label %cB184cA:185 br label %mid186cB:187 br label %mid188mid:189 %phi_no_fold = phi i32 [ %f, %bb_freeze ], [ 1, %cA ], [ 1, %cB ]190 br i1 %c2, label %bb_freeze2, label %cD191bb_freeze2:192 br label %final193bb_other2:194 br i1 %c1, label %cA, label %cB195cC:196 br label %final197cD:198 br label %final199final:200 %phi_fold = phi i32 [ %f, %bb_freeze2 ], [ 0, %cC ], [ 0, %cD ]201 %a = add i32 %phi_fold, %phi_no_fold202 ret i32 %a203}204 205define i32 @phi_freeze_poison(i1 %c0, i1 %c1) {206; CHECK-LABEL: define i32 @phi_freeze_poison(207; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {208; CHECK-NEXT: [[ENTRY:.*:]]209; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]210; CHECK: [[BB_FREEZE]]:211; CHECK-NEXT: br label %[[FINAL:.*]]212; CHECK: [[BB_OTHER]]:213; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]214; CHECK: [[CA]]:215; CHECK-NEXT: br label %[[FINAL]]216; CHECK: [[CB]]:217; CHECK-NEXT: br label %[[FINAL]]218; CHECK: [[FINAL]]:219; CHECK-NEXT: ret i32 0220;221entry:222 br i1 %c0, label %bb_freeze, label %bb_other223 224bb_freeze:225 %f = freeze i32 undef226 br label %final227 228bb_other:229 br i1 %c1, label %cA, label %cB230cA:231 br label %final232cB:233 br label %final234 235final:236 %phi = phi i32 [ %f, %bb_freeze ], [ poison, %cA ], [ poison, %cB ]237 ret i32 %phi238}239 240define <2 x i32> @phi_freeze_poison_vec(i1 %c0, i1 %c1) {241; CHECK-LABEL: define <2 x i32> @phi_freeze_poison_vec(242; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {243; CHECK-NEXT: [[ENTRY:.*:]]244; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]245; CHECK: [[BB_FREEZE]]:246; CHECK-NEXT: br label %[[FINAL:.*]]247; CHECK: [[BB_OTHER]]:248; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]249; CHECK: [[CA]]:250; CHECK-NEXT: br label %[[FINAL]]251; CHECK: [[CB]]:252; CHECK-NEXT: br label %[[FINAL]]253; CHECK: [[FINAL]]:254; CHECK-NEXT: [[PHI:%.*]] = phi <2 x i32> [ zeroinitializer, %[[BB_FREEZE]] ], [ <i32 poison, i32 1>, %[[CA]] ], [ <i32 poison, i32 1>, %[[CB]] ]255; CHECK-NEXT: ret <2 x i32> [[PHI]]256;257entry:258 br i1 %c0, label %bb_freeze, label %bb_other259 260bb_freeze:261 %f = freeze <2 x i32> undef262 br label %final263 264bb_other:265 br i1 %c1, label %cA, label %cB266cA:267 br label %final268cB:269 br label %final270 271final:272 %phi = phi <2 x i32> [ %f, %bb_freeze ], [ <i32 poison, i32 1>, %cA ], [ <i32 poison, i32 1>, %cB ]273 ret <2 x i32> %phi274}275