382 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+fp-armv8 -passes=hardware-loops %s -S -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP3; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+soft-float -passes=hardware-loops %s -S -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SOFT4 5define void @test_fptosi(i32 %n, ptr %g, ptr %d) {6; CHECK-FP-LABEL: define void @test_fptosi(7; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {8; CHECK-FP-NEXT: entry:9; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -110; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 50011; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]12; CHECK-FP: while.body.lr.ph:13; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 414; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 415; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])16; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]17; CHECK-FP: while.body:18; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]19; CHECK-FP-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]20; CHECK-FP-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 1021; CHECK-FP-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 022; CHECK-FP-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]23; CHECK-FP: if.then2:24; CHECK-FP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]25; CHECK-FP-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 826; CHECK-FP-NEXT: [[CONV:%.*]] = fptosi double [[TMP5]] to i3227; CHECK-FP-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]28; CHECK-FP-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX3]], align 429; CHECK-FP-NEXT: br label [[IF_END4]]30; CHECK-FP: if.end4:31; CHECK-FP-NEXT: [[INC]] = add nuw i32 [[I_012]], 132; CHECK-FP-NEXT: [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)33; CHECK-FP-NEXT: [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 034; CHECK-FP-NEXT: br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]35; CHECK-FP: cleanup.loopexit:36; CHECK-FP-NEXT: br label [[CLEANUP]]37; CHECK-FP: cleanup:38; CHECK-FP-NEXT: ret void39;40; CHECK-SOFT-LABEL: define void @test_fptosi(41; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {42; CHECK-SOFT-NEXT: entry:43; CHECK-SOFT-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -144; CHECK-SOFT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 50045; CHECK-SOFT-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]46; CHECK-SOFT: while.body.lr.ph:47; CHECK-SOFT-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 448; CHECK-SOFT-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 449; CHECK-SOFT-NEXT: br label [[WHILE_BODY:%.*]]50; CHECK-SOFT: while.body:51; CHECK-SOFT-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]52; CHECK-SOFT-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 1053; CHECK-SOFT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 054; CHECK-SOFT-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]55; CHECK-SOFT: if.then2:56; CHECK-SOFT-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]57; CHECK-SOFT-NEXT: [[TMP3:%.*]] = load double, ptr [[ARRAYIDX]], align 858; CHECK-SOFT-NEXT: [[CONV:%.*]] = fptosi double [[TMP3]] to i3259; CHECK-SOFT-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]60; CHECK-SOFT-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX3]], align 461; CHECK-SOFT-NEXT: br label [[IF_END4]]62; CHECK-SOFT: if.end4:63; CHECK-SOFT-NEXT: [[INC]] = add nuw i32 [[I_012]], 164; CHECK-SOFT-NEXT: [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]65; CHECK-SOFT-NEXT: br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]66; CHECK-SOFT: cleanup.loopexit:67; CHECK-SOFT-NEXT: br label [[CLEANUP]]68; CHECK-SOFT: cleanup:69; CHECK-SOFT-NEXT: ret void70;71entry:72 %n.off = add i32 %n, -173 %0 = icmp ult i32 %n.off, 50074 br i1 %0, label %while.body.lr.ph, label %cleanup75 76while.body.lr.ph:77 %1 = load ptr, ptr %d, align 478 %2 = load ptr, ptr %g, align 479 br label %while.body80 81while.body:82 %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]83 %rem = urem i32 %i.012, 1084 %tobool = icmp eq i32 %rem, 085 br i1 %tobool, label %if.end4, label %if.then286 87if.then2:88 %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.01289 %3 = load double, ptr %arrayidx, align 890 %conv = fptosi double %3 to i3291 %arrayidx3 = getelementptr inbounds i32, ptr %2, i32 %i.01292 store i32 %conv, ptr %arrayidx3, align 493 br label %if.end494 95if.end4:96 %inc = add nuw i32 %i.012, 197 %cmp1 = icmp ult i32 %inc, %n98 br i1 %cmp1, label %while.body, label %cleanup.loopexit99 100cleanup.loopexit:101 br label %cleanup102 103cleanup:104 ret void105}106 107define void @test_fptoui(i32 %n, ptr %g, ptr %d) {108; CHECK-FP-LABEL: define void @test_fptoui(109; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {110; CHECK-FP-NEXT: entry:111; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1112; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500113; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]114; CHECK-FP: while.body.lr.ph:115; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4116; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4117; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])118; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]119; CHECK-FP: while.body:120; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]121; CHECK-FP-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]122; CHECK-FP-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 10123; CHECK-FP-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0124; CHECK-FP-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]125; CHECK-FP: if.then2:126; CHECK-FP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]127; CHECK-FP-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8128; CHECK-FP-NEXT: [[CONV:%.*]] = fptoui double [[TMP5]] to i32129; CHECK-FP-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]130; CHECK-FP-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4131; CHECK-FP-NEXT: br label [[IF_END4]]132; CHECK-FP: if.end4:133; CHECK-FP-NEXT: [[INC]] = add nuw i32 [[I_012]], 1134; CHECK-FP-NEXT: [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)135; CHECK-FP-NEXT: [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 0136; CHECK-FP-NEXT: br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]137; CHECK-FP: cleanup.loopexit:138; CHECK-FP-NEXT: br label [[CLEANUP]]139; CHECK-FP: cleanup:140; CHECK-FP-NEXT: ret void141;142; CHECK-SOFT-LABEL: define void @test_fptoui(143; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {144; CHECK-SOFT-NEXT: entry:145; CHECK-SOFT-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1146; CHECK-SOFT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500147; CHECK-SOFT-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]148; CHECK-SOFT: while.body.lr.ph:149; CHECK-SOFT-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4150; CHECK-SOFT-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4151; CHECK-SOFT-NEXT: br label [[WHILE_BODY:%.*]]152; CHECK-SOFT: while.body:153; CHECK-SOFT-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]154; CHECK-SOFT-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 10155; CHECK-SOFT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0156; CHECK-SOFT-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]157; CHECK-SOFT: if.then2:158; CHECK-SOFT-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]159; CHECK-SOFT-NEXT: [[TMP3:%.*]] = load double, ptr [[ARRAYIDX]], align 8160; CHECK-SOFT-NEXT: [[CONV:%.*]] = fptoui double [[TMP3]] to i32161; CHECK-SOFT-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]162; CHECK-SOFT-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4163; CHECK-SOFT-NEXT: br label [[IF_END4]]164; CHECK-SOFT: if.end4:165; CHECK-SOFT-NEXT: [[INC]] = add nuw i32 [[I_012]], 1166; CHECK-SOFT-NEXT: [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]167; CHECK-SOFT-NEXT: br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]168; CHECK-SOFT: cleanup.loopexit:169; CHECK-SOFT-NEXT: br label [[CLEANUP]]170; CHECK-SOFT: cleanup:171; CHECK-SOFT-NEXT: ret void172;173entry:174 %n.off = add i32 %n, -1175 %0 = icmp ult i32 %n.off, 500176 br i1 %0, label %while.body.lr.ph, label %cleanup177 178while.body.lr.ph:179 %1 = load ptr, ptr %d, align 4180 %2 = load ptr, ptr %g, align 4181 br label %while.body182 183while.body:184 %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]185 %rem = urem i32 %i.012, 10186 %tobool = icmp eq i32 %rem, 0187 br i1 %tobool, label %if.end4, label %if.then2188 189if.then2:190 %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.012191 %3 = load double, ptr %arrayidx, align 8192 %conv = fptoui double %3 to i32193 %arrayidx3 = getelementptr inbounds i32, ptr %2, i32 %i.012194 store i32 %conv, ptr %arrayidx3, align 4195 br label %if.end4196 197if.end4:198 %inc = add nuw i32 %i.012, 1199 %cmp1 = icmp ult i32 %inc, %n200 br i1 %cmp1, label %while.body, label %cleanup.loopexit201 202cleanup.loopexit:203 br label %cleanup204 205cleanup:206 ret void207}208 209define void @load_store_float(i32 %n, ptr %d, ptr %g) {210; CHECK-LABEL: define void @load_store_float(211; CHECK-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0:[0-9]+]] {212; CHECK-NEXT: entry:213; CHECK-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1214; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500215; CHECK-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]216; CHECK: while.body.lr.ph:217; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4218; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4219; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])220; CHECK-NEXT: br label [[WHILE_BODY:%.*]]221; CHECK: while.body:222; CHECK-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]223; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]224; CHECK-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 10225; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0226; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]227; CHECK: if.then2:228; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]229; CHECK-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8230; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds double, ptr [[TMP2]], i32 [[I_012]]231; CHECK-NEXT: store double [[TMP5]], ptr [[ARRAYIDX3]], align 8232; CHECK-NEXT: br label [[IF_END4]]233; CHECK: if.end4:234; CHECK-NEXT: [[INC]] = add nuw i32 [[I_012]], 1235; CHECK-NEXT: [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)236; CHECK-NEXT: [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 0237; CHECK-NEXT: br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]238; CHECK: cleanup.loopexit:239; CHECK-NEXT: br label [[CLEANUP]]240; CHECK: cleanup:241; CHECK-NEXT: ret void242;243entry:244 %n.off = add i32 %n, -1245 %0 = icmp ult i32 %n.off, 500246 br i1 %0, label %while.body.lr.ph, label %cleanup247 248while.body.lr.ph:249 %1 = load ptr, ptr %d, align 4250 %2 = load ptr, ptr %g, align 4251 br label %while.body252 253while.body:254 %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]255 %rem = urem i32 %i.012, 10256 %tobool = icmp eq i32 %rem, 0257 br i1 %tobool, label %if.end4, label %if.then2258 259if.then2:260 %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.012261 %3 = load double, ptr %arrayidx, align 8262 %arrayidx3 = getelementptr inbounds double, ptr %2, i32 %i.012263 store double %3, ptr %arrayidx3, align 8264 br label %if.end4265 266if.end4:267 %inc = add nuw i32 %i.012, 1268 %cmp1 = icmp ult i32 %inc, %n269 br i1 %cmp1, label %while.body, label %cleanup.loopexit270 271cleanup.loopexit:272 br label %cleanup273 274cleanup:275 ret void276}277 278define void @fp_add(i32 %n, ptr %d, ptr %g) {279; CHECK-FP-LABEL: define void @fp_add(280; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0]] {281; CHECK-FP-NEXT: entry:282; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1283; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500284; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]285; CHECK-FP: while.body.lr.ph:286; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4287; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4288; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])289; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]290; CHECK-FP: while.body:291; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]292; CHECK-FP-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP7:%.*]], [[IF_END4]] ]293; CHECK-FP-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 10294; CHECK-FP-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0295; CHECK-FP-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]296; CHECK-FP: if.then2:297; CHECK-FP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 [[I_012]]298; CHECK-FP-NEXT: [[TMP5:%.*]] = load float, ptr [[ARRAYIDX]], align 4299; CHECK-FP-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 [[I_012]]300; CHECK-FP-NEXT: [[TMP6:%.*]] = load float, ptr [[ARRAYIDX3]], align 4301; CHECK-FP-NEXT: [[ADD:%.*]] = fadd float [[TMP5]], [[TMP6]]302; CHECK-FP-NEXT: store float [[ADD]], ptr [[ARRAYIDX3]], align 4303; CHECK-FP-NEXT: br label [[IF_END4]]304; CHECK-FP: if.end4:305; CHECK-FP-NEXT: [[INC]] = add nuw i32 [[I_012]], 1306; CHECK-FP-NEXT: [[TMP7]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)307; CHECK-FP-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0308; CHECK-FP-NEXT: br i1 [[TMP8]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]309; CHECK-FP: cleanup.loopexit:310; CHECK-FP-NEXT: br label [[CLEANUP]]311; CHECK-FP: cleanup:312; CHECK-FP-NEXT: ret void313;314; CHECK-SOFT-LABEL: define void @fp_add(315; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0]] {316; CHECK-SOFT-NEXT: entry:317; CHECK-SOFT-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1318; CHECK-SOFT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500319; CHECK-SOFT-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]320; CHECK-SOFT: while.body.lr.ph:321; CHECK-SOFT-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4322; CHECK-SOFT-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4323; CHECK-SOFT-NEXT: br label [[WHILE_BODY:%.*]]324; CHECK-SOFT: while.body:325; CHECK-SOFT-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]326; CHECK-SOFT-NEXT: [[REM:%.*]] = urem i32 [[I_012]], 10327; CHECK-SOFT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0328; CHECK-SOFT-NEXT: br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]329; CHECK-SOFT: if.then2:330; CHECK-SOFT-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 [[I_012]]331; CHECK-SOFT-NEXT: [[TMP3:%.*]] = load float, ptr [[ARRAYIDX]], align 4332; CHECK-SOFT-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 [[I_012]]333; CHECK-SOFT-NEXT: [[TMP4:%.*]] = load float, ptr [[ARRAYIDX3]], align 4334; CHECK-SOFT-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP4]]335; CHECK-SOFT-NEXT: store float [[ADD]], ptr [[ARRAYIDX3]], align 4336; CHECK-SOFT-NEXT: br label [[IF_END4]]337; CHECK-SOFT: if.end4:338; CHECK-SOFT-NEXT: [[INC]] = add nuw i32 [[I_012]], 1339; CHECK-SOFT-NEXT: [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]340; CHECK-SOFT-NEXT: br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]341; CHECK-SOFT: cleanup.loopexit:342; CHECK-SOFT-NEXT: br label [[CLEANUP]]343; CHECK-SOFT: cleanup:344; CHECK-SOFT-NEXT: ret void345;346entry:347 %n.off = add i32 %n, -1348 %0 = icmp ult i32 %n.off, 500349 br i1 %0, label %while.body.lr.ph, label %cleanup350 351while.body.lr.ph:352 %1 = load ptr, ptr %d, align 4353 %2 = load ptr, ptr %g, align 4354 br label %while.body355 356while.body:357 %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]358 %rem = urem i32 %i.012, 10359 %tobool = icmp eq i32 %rem, 0360 br i1 %tobool, label %if.end4, label %if.then2361 362if.then2:363 %arrayidx = getelementptr inbounds float, ptr %1, i32 %i.012364 %3 = load float, ptr %arrayidx, align 4365 %arrayidx3 = getelementptr inbounds float, ptr %2, i32 %i.012366 %4 = load float, ptr %arrayidx3, align 4367 %add = fadd float %3, %4368 store float %add, ptr %arrayidx3, align 4369 br label %if.end4370 371if.end4:372 %inc = add nuw i32 %i.012, 1373 %cmp1 = icmp ult i32 %inc, %n374 br i1 %cmp1, label %while.body, label %cleanup.loopexit375 376cleanup.loopexit:377 br label %cleanup378 379cleanup:380 ret void381}382