321 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=loop-idiom -mtriple=loongarch32 -S < %s | FileCheck %s --check-prefix=NOCPOP3; RUN: opt -passes=loop-idiom -mtriple=loongarch32 -mattr=+lsx -S < %s | FileCheck %s --check-prefix=CPOP4; RUN: opt -passes=loop-idiom -mtriple=loongarch64 -S < %s | FileCheck %s --check-prefix=CPOP5; RUN: opt -passes=loop-idiom -mtriple=loongarch64 -mattr=-lsx -S < %s | FileCheck %s --check-prefix=NOCPOP6 7; Mostly copied from RISCV version.8 9;To recognize this pattern:10;int popcount(unsigned long long a) {11; int c = 0;12; while (a) {13; c++;14; a &= a - 1;15; }16; return c;17;}18;19 20define i32 @popcount_i64(i64 %a) nounwind uwtable readnone ssp {21; CPOP-LABEL: @popcount_i64(22; CPOP-NEXT: entry:23; CPOP-NEXT: [[TMP0:%.*]] = call i64 @llvm.ctpop.i64(i64 [[A:%.*]])24; CPOP-NEXT: [[TMP1:%.*]] = trunc i64 [[TMP0]] to i3225; CPOP-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 026; CPOP-NEXT: br i1 [[TMP2]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]27; CPOP: while.body.preheader:28; CPOP-NEXT: br label [[WHILE_BODY:%.*]]29; CPOP: while.body:30; CPOP-NEXT: [[TCPHI:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TCDEC:%.*]], [[WHILE_BODY]] ]31; CPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]32; CPOP-NEXT: [[A_ADDR_04:%.*]] = phi i64 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]33; CPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 134; CPOP-NEXT: [[SUB:%.*]] = add i64 [[A_ADDR_04]], -135; CPOP-NEXT: [[AND]] = and i64 [[SUB]], [[A_ADDR_04]]36; CPOP-NEXT: [[TCDEC]] = sub nsw i32 [[TCPHI]], 137; CPOP-NEXT: [[TOBOOL:%.*]] = icmp sle i32 [[TCDEC]], 038; CPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]39; CPOP: while.end.loopexit:40; CPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY]] ]41; CPOP-NEXT: br label [[WHILE_END]]42; CPOP: while.end:43; CPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]44; CPOP-NEXT: ret i32 [[C_0_LCSSA]]45;46; NOCPOP-LABEL: @popcount_i64(47; NOCPOP-NEXT: entry:48; NOCPOP-NEXT: [[TOBOOL3:%.*]] = icmp eq i64 [[A:%.*]], 049; NOCPOP-NEXT: br i1 [[TOBOOL3]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]50; NOCPOP: while.body.preheader:51; NOCPOP-NEXT: br label [[WHILE_BODY:%.*]]52; NOCPOP: while.body:53; NOCPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]54; NOCPOP-NEXT: [[A_ADDR_04:%.*]] = phi i64 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]55; NOCPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 156; NOCPOP-NEXT: [[SUB:%.*]] = add i64 [[A_ADDR_04]], -157; NOCPOP-NEXT: [[AND]] = and i64 [[SUB]], [[A_ADDR_04]]58; NOCPOP-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 059; NOCPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]60; NOCPOP: while.end.loopexit:61; NOCPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]62; NOCPOP-NEXT: br label [[WHILE_END]]63; NOCPOP: while.end:64; NOCPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]65; NOCPOP-NEXT: ret i32 [[C_0_LCSSA]]66;67entry:68 %tobool3 = icmp eq i64 %a, 069 br i1 %tobool3, label %while.end, label %while.body70 71while.body: ; preds = %entry, %while.body72 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]73 %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ]74 %inc = add nsw i32 %c.05, 175 %sub = add i64 %a.addr.04, -176 %and = and i64 %sub, %a.addr.0477 %tobool = icmp eq i64 %and, 078 br i1 %tobool, label %while.end, label %while.body79 80while.end: ; preds = %while.body, %entry81 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]82 ret i32 %c.0.lcssa83}84 85define i32 @popcount_i32(i32 %a) nounwind uwtable readnone ssp {86; CPOP-LABEL: @popcount_i32(87; CPOP-NEXT: entry:88; CPOP-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[A:%.*]])89; CPOP-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 090; CPOP-NEXT: br i1 [[TMP1]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]91; CPOP: while.body.preheader:92; CPOP-NEXT: br label [[WHILE_BODY:%.*]]93; CPOP: while.body:94; CPOP-NEXT: [[TCPHI:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY_PREHEADER]] ], [ [[TCDEC:%.*]], [[WHILE_BODY]] ]95; CPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]96; CPOP-NEXT: [[A_ADDR_04:%.*]] = phi i32 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]97; CPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 198; CPOP-NEXT: [[SUB:%.*]] = add i32 [[A_ADDR_04]], -199; CPOP-NEXT: [[AND]] = and i32 [[SUB]], [[A_ADDR_04]]100; CPOP-NEXT: [[TCDEC]] = sub nsw i32 [[TCPHI]], 1101; CPOP-NEXT: [[TOBOOL:%.*]] = icmp sle i32 [[TCDEC]], 0102; CPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]103; CPOP: while.end.loopexit:104; CPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY]] ]105; CPOP-NEXT: br label [[WHILE_END]]106; CPOP: while.end:107; CPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]108; CPOP-NEXT: ret i32 [[C_0_LCSSA]]109;110; NOCPOP-LABEL: @popcount_i32(111; NOCPOP-NEXT: entry:112; NOCPOP-NEXT: [[TOBOOL3:%.*]] = icmp eq i32 [[A:%.*]], 0113; NOCPOP-NEXT: br i1 [[TOBOOL3]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]114; NOCPOP: while.body.preheader:115; NOCPOP-NEXT: br label [[WHILE_BODY:%.*]]116; NOCPOP: while.body:117; NOCPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]118; NOCPOP-NEXT: [[A_ADDR_04:%.*]] = phi i32 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]119; NOCPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 1120; NOCPOP-NEXT: [[SUB:%.*]] = add i32 [[A_ADDR_04]], -1121; NOCPOP-NEXT: [[AND]] = and i32 [[SUB]], [[A_ADDR_04]]122; NOCPOP-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[AND]], 0123; NOCPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]124; NOCPOP: while.end.loopexit:125; NOCPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]126; NOCPOP-NEXT: br label [[WHILE_END]]127; NOCPOP: while.end:128; NOCPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]129; NOCPOP-NEXT: ret i32 [[C_0_LCSSA]]130;131entry:132 %tobool3 = icmp eq i32 %a, 0133 br i1 %tobool3, label %while.end, label %while.body134 135while.body: ; preds = %entry, %while.body136 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]137 %a.addr.04 = phi i32 [ %and, %while.body ], [ %a, %entry ]138 %inc = add nsw i32 %c.05, 1139 %sub = add i32 %a.addr.04, -1140 %and = and i32 %sub, %a.addr.04141 %tobool = icmp eq i32 %and, 0142 br i1 %tobool, label %while.end, label %while.body143 144while.end: ; preds = %while.body, %entry145 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]146 ret i32 %c.0.lcssa147}148 149define i32 @popcount_i128(i128 %a) nounwind uwtable readnone ssp {150; CPOP-LABEL: @popcount_i128(151; CPOP-NEXT: entry:152; CPOP-NEXT: [[TMP0:%.*]] = call i128 @llvm.ctpop.i128(i128 [[A:%.*]])153; CPOP-NEXT: [[TMP1:%.*]] = trunc i128 [[TMP0]] to i32154; CPOP-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0155; CPOP-NEXT: br i1 [[TMP2]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]156; CPOP: while.body.preheader:157; CPOP-NEXT: br label [[WHILE_BODY:%.*]]158; CPOP: while.body:159; CPOP-NEXT: [[TCPHI:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TCDEC:%.*]], [[WHILE_BODY]] ]160; CPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]161; CPOP-NEXT: [[A_ADDR_04:%.*]] = phi i128 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]162; CPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 1163; CPOP-NEXT: [[SUB:%.*]] = add i128 [[A_ADDR_04]], -1164; CPOP-NEXT: [[AND]] = and i128 [[SUB]], [[A_ADDR_04]]165; CPOP-NEXT: [[TCDEC]] = sub nsw i32 [[TCPHI]], 1166; CPOP-NEXT: [[TOBOOL:%.*]] = icmp sle i32 [[TCDEC]], 0167; CPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]168; CPOP: while.end.loopexit:169; CPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY]] ]170; CPOP-NEXT: br label [[WHILE_END]]171; CPOP: while.end:172; CPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]173; CPOP-NEXT: ret i32 [[C_0_LCSSA]]174;175; NOCPOP-LABEL: @popcount_i128(176; NOCPOP-NEXT: entry:177; NOCPOP-NEXT: [[TOBOOL3:%.*]] = icmp eq i128 [[A:%.*]], 0178; NOCPOP-NEXT: br i1 [[TOBOOL3]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]179; NOCPOP: while.body.preheader:180; NOCPOP-NEXT: br label [[WHILE_BODY:%.*]]181; NOCPOP: while.body:182; NOCPOP-NEXT: [[C_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]183; NOCPOP-NEXT: [[A_ADDR_04:%.*]] = phi i128 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]184; NOCPOP-NEXT: [[INC]] = add nsw i32 [[C_05]], 1185; NOCPOP-NEXT: [[SUB:%.*]] = add i128 [[A_ADDR_04]], -1186; NOCPOP-NEXT: [[AND]] = and i128 [[SUB]], [[A_ADDR_04]]187; NOCPOP-NEXT: [[TOBOOL:%.*]] = icmp eq i128 [[AND]], 0188; NOCPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]189; NOCPOP: while.end.loopexit:190; NOCPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]191; NOCPOP-NEXT: br label [[WHILE_END]]192; NOCPOP: while.end:193; NOCPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]194; NOCPOP-NEXT: ret i32 [[C_0_LCSSA]]195;196entry:197 %tobool3 = icmp eq i128 %a, 0198 br i1 %tobool3, label %while.end, label %while.body199 200while.body: ; preds = %entry, %while.body201 %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]202 %a.addr.04 = phi i128 [ %and, %while.body ], [ %a, %entry ]203 %inc = add nsw i32 %c.05, 1204 %sub = add i128 %a.addr.04, -1205 %and = and i128 %sub, %a.addr.04206 %tobool = icmp eq i128 %and, 0207 br i1 %tobool, label %while.end, label %while.body208 209while.end: ; preds = %while.body, %entry210 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]211 ret i32 %c.0.lcssa212}213 214; To recognize this pattern:215;int popcount(unsigned long long a, int mydata1, int mydata2) {216; int c = 0;217; while (a) {218; c++;219; a &= a - 1;220; mydata1 *= c;221; mydata2 *= (int)a;222; }223; return c + mydata1 + mydata2;224;}225 226define i32 @popcount2(i64 %a, i32 %mydata1, i32 %mydata2) nounwind uwtable readnone ssp {227; CPOP-LABEL: @popcount2(228; CPOP-NEXT: entry:229; CPOP-NEXT: [[TMP0:%.*]] = call i64 @llvm.ctpop.i64(i64 [[A:%.*]])230; CPOP-NEXT: [[TMP1:%.*]] = trunc i64 [[TMP0]] to i32231; CPOP-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0232; CPOP-NEXT: br i1 [[TMP2]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]233; CPOP: while.body.preheader:234; CPOP-NEXT: br label [[WHILE_BODY:%.*]]235; CPOP: while.body:236; CPOP-NEXT: [[TCPHI:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TCDEC:%.*]], [[WHILE_BODY]] ]237; CPOP-NEXT: [[C_013:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]238; CPOP-NEXT: [[MYDATA2_ADDR_012:%.*]] = phi i32 [ [[MUL1:%.*]], [[WHILE_BODY]] ], [ [[MYDATA2:%.*]], [[WHILE_BODY_PREHEADER]] ]239; CPOP-NEXT: [[MYDATA1_ADDR_011:%.*]] = phi i32 [ [[MUL:%.*]], [[WHILE_BODY]] ], [ [[MYDATA1:%.*]], [[WHILE_BODY_PREHEADER]] ]240; CPOP-NEXT: [[A_ADDR_010:%.*]] = phi i64 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]241; CPOP-NEXT: [[INC]] = add nsw i32 [[C_013]], 1242; CPOP-NEXT: [[SUB:%.*]] = add i64 [[A_ADDR_010]], -1243; CPOP-NEXT: [[AND]] = and i64 [[SUB]], [[A_ADDR_010]]244; CPOP-NEXT: [[MUL]] = mul nsw i32 [[INC]], [[MYDATA1_ADDR_011]]245; CPOP-NEXT: [[CONV:%.*]] = trunc i64 [[AND]] to i32246; CPOP-NEXT: [[MUL1]] = mul nsw i32 [[CONV]], [[MYDATA2_ADDR_012]]247; CPOP-NEXT: [[TCDEC]] = sub nsw i32 [[TCPHI]], 1248; CPOP-NEXT: [[TOBOOL:%.*]] = icmp sle i32 [[TCDEC]], 0249; CPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]250; CPOP: while.end.loopexit:251; CPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY]] ]252; CPOP-NEXT: [[MUL_LCSSA:%.*]] = phi i32 [ [[MUL]], [[WHILE_BODY]] ]253; CPOP-NEXT: [[MUL1_LCSSA:%.*]] = phi i32 [ [[MUL1]], [[WHILE_BODY]] ]254; CPOP-NEXT: br label [[WHILE_END]]255; CPOP: while.end:256; CPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]257; CPOP-NEXT: [[MYDATA2_ADDR_0_LCSSA:%.*]] = phi i32 [ [[MYDATA2]], [[ENTRY]] ], [ [[MUL1_LCSSA]], [[WHILE_END_LOOPEXIT]] ]258; CPOP-NEXT: [[MYDATA1_ADDR_0_LCSSA:%.*]] = phi i32 [ [[MYDATA1]], [[ENTRY]] ], [ [[MUL_LCSSA]], [[WHILE_END_LOOPEXIT]] ]259; CPOP-NEXT: [[ADD:%.*]] = add i32 [[MYDATA2_ADDR_0_LCSSA]], [[MYDATA1_ADDR_0_LCSSA]]260; CPOP-NEXT: [[ADD2:%.*]] = add i32 [[ADD]], [[C_0_LCSSA]]261; CPOP-NEXT: ret i32 [[ADD2]]262;263; NOCPOP-LABEL: @popcount2(264; NOCPOP-NEXT: entry:265; NOCPOP-NEXT: [[TOBOOL9:%.*]] = icmp eq i64 [[A:%.*]], 0266; NOCPOP-NEXT: br i1 [[TOBOOL9]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]267; NOCPOP: while.body.preheader:268; NOCPOP-NEXT: br label [[WHILE_BODY:%.*]]269; NOCPOP: while.body:270; NOCPOP-NEXT: [[C_013:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ]271; NOCPOP-NEXT: [[MYDATA2_ADDR_012:%.*]] = phi i32 [ [[MUL1:%.*]], [[WHILE_BODY]] ], [ [[MYDATA2:%.*]], [[WHILE_BODY_PREHEADER]] ]272; NOCPOP-NEXT: [[MYDATA1_ADDR_011:%.*]] = phi i32 [ [[MUL:%.*]], [[WHILE_BODY]] ], [ [[MYDATA1:%.*]], [[WHILE_BODY_PREHEADER]] ]273; NOCPOP-NEXT: [[A_ADDR_010:%.*]] = phi i64 [ [[AND:%.*]], [[WHILE_BODY]] ], [ [[A]], [[WHILE_BODY_PREHEADER]] ]274; NOCPOP-NEXT: [[INC]] = add nsw i32 [[C_013]], 1275; NOCPOP-NEXT: [[SUB:%.*]] = add i64 [[A_ADDR_010]], -1276; NOCPOP-NEXT: [[AND]] = and i64 [[SUB]], [[A_ADDR_010]]277; NOCPOP-NEXT: [[MUL]] = mul nsw i32 [[INC]], [[MYDATA1_ADDR_011]]278; NOCPOP-NEXT: [[CONV:%.*]] = trunc i64 [[AND]] to i32279; NOCPOP-NEXT: [[MUL1]] = mul nsw i32 [[CONV]], [[MYDATA2_ADDR_012]]280; NOCPOP-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[AND]], 0281; NOCPOP-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]282; NOCPOP: while.end.loopexit:283; NOCPOP-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]284; NOCPOP-NEXT: [[MUL_LCSSA:%.*]] = phi i32 [ [[MUL]], [[WHILE_BODY]] ]285; NOCPOP-NEXT: [[MUL1_LCSSA:%.*]] = phi i32 [ [[MUL1]], [[WHILE_BODY]] ]286; NOCPOP-NEXT: br label [[WHILE_END]]287; NOCPOP: while.end:288; NOCPOP-NEXT: [[C_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]289; NOCPOP-NEXT: [[MYDATA2_ADDR_0_LCSSA:%.*]] = phi i32 [ [[MYDATA2]], [[ENTRY]] ], [ [[MUL1_LCSSA]], [[WHILE_END_LOOPEXIT]] ]290; NOCPOP-NEXT: [[MYDATA1_ADDR_0_LCSSA:%.*]] = phi i32 [ [[MYDATA1]], [[ENTRY]] ], [ [[MUL_LCSSA]], [[WHILE_END_LOOPEXIT]] ]291; NOCPOP-NEXT: [[ADD:%.*]] = add i32 [[MYDATA2_ADDR_0_LCSSA]], [[MYDATA1_ADDR_0_LCSSA]]292; NOCPOP-NEXT: [[ADD2:%.*]] = add i32 [[ADD]], [[C_0_LCSSA]]293; NOCPOP-NEXT: ret i32 [[ADD2]]294;295entry:296 %tobool9 = icmp eq i64 %a, 0297 br i1 %tobool9, label %while.end, label %while.body298 299while.body: ; preds = %entry, %while.body300 %c.013 = phi i32 [ %inc, %while.body ], [ 0, %entry ]301 %mydata2.addr.012 = phi i32 [ %mul1, %while.body ], [ %mydata2, %entry ]302 %mydata1.addr.011 = phi i32 [ %mul, %while.body ], [ %mydata1, %entry ]303 %a.addr.010 = phi i64 [ %and, %while.body ], [ %a, %entry ]304 %inc = add nsw i32 %c.013, 1305 %sub = add i64 %a.addr.010, -1306 %and = and i64 %sub, %a.addr.010307 %mul = mul nsw i32 %inc, %mydata1.addr.011308 %conv = trunc i64 %and to i32309 %mul1 = mul nsw i32 %conv, %mydata2.addr.012310 %tobool = icmp eq i64 %and, 0311 br i1 %tobool, label %while.end, label %while.body312 313while.end: ; preds = %while.body, %entry314 %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]315 %mydata2.addr.0.lcssa = phi i32 [ %mydata2, %entry ], [ %mul1, %while.body ]316 %mydata1.addr.0.lcssa = phi i32 [ %mydata1, %entry ], [ %mul, %while.body ]317 %add = add i32 %mydata2.addr.0.lcssa, %mydata1.addr.0.lcssa318 %add2 = add i32 %add, %c.0.lcssa319 ret i32 %add2320}321