brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.2 KiB · 01adc37 Raw
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