llvm/llvm/test/Transforms/HardwareLoops/ARM/fp-emulation.ll

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+fp-armv8 -passes=hardware-loops %s -S -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP
; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+soft-float -passes=hardware-loops %s -S -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SOFT

define void @test_fptosi(i32 %n, ptr %g, ptr %d) {
; CHECK-FP-LABEL: define void @test_fptosi(
; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-FP-NEXT:  entry:
; CHECK-FP-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-FP-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-FP-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-FP:       while.body.lr.ph:
; CHECK-FP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-FP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-FP-NEXT:    [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
; CHECK-FP-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-FP:       while.body:
; CHECK-FP-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-FP-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]
; CHECK-FP-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-FP-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-FP-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-FP:       if.then2:
; CHECK-FP-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]
; CHECK-FP-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8
; CHECK-FP-NEXT:    [[CONV:%.*]] = fptosi double [[TMP5]] to i32
; CHECK-FP-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]
; CHECK-FP-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4
; CHECK-FP-NEXT:    br label [[IF_END4]]
; CHECK-FP:       if.end4:
; CHECK-FP-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-FP-NEXT:    [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)
; CHECK-FP-NEXT:    [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 0
; CHECK-FP-NEXT:    br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-FP:       cleanup.loopexit:
; CHECK-FP-NEXT:    br label [[CLEANUP]]
; CHECK-FP:       cleanup:
; CHECK-FP-NEXT:    ret void
;
; CHECK-SOFT-LABEL: define void @test_fptosi(
; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-SOFT-NEXT:  entry:
; CHECK-SOFT-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-SOFT-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-SOFT-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-SOFT:       while.body.lr.ph:
; CHECK-SOFT-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-SOFT-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-SOFT-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-SOFT:       while.body:
; CHECK-SOFT-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-SOFT-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-SOFT-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-SOFT-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-SOFT:       if.then2:
; CHECK-SOFT-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    [[TMP3:%.*]] = load double, ptr [[ARRAYIDX]], align 8
; CHECK-SOFT-NEXT:    [[CONV:%.*]] = fptosi double [[TMP3]] to i32
; CHECK-SOFT-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4
; CHECK-SOFT-NEXT:    br label [[IF_END4]]
; CHECK-SOFT:       if.end4:
; CHECK-SOFT-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-SOFT-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]
; CHECK-SOFT-NEXT:    br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-SOFT:       cleanup.loopexit:
; CHECK-SOFT-NEXT:    br label [[CLEANUP]]
; CHECK-SOFT:       cleanup:
; CHECK-SOFT-NEXT:    ret void
;
entry:
  %n.off = add i32 %n, -1
  %0 = icmp ult i32 %n.off, 500
  br i1 %0, label %while.body.lr.ph, label %cleanup

while.body.lr.ph:
  %1 = load ptr, ptr %d, align 4
  %2 = load ptr, ptr %g, align 4
  br label %while.body

while.body:
  %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]
  %rem = urem i32 %i.012, 10
  %tobool = icmp eq i32 %rem, 0
  br i1 %tobool, label %if.end4, label %if.then2

if.then2:
  %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.012
  %3 = load double, ptr %arrayidx, align 8
  %conv = fptosi double %3 to i32
  %arrayidx3 = getelementptr inbounds i32, ptr %2, i32 %i.012
  store i32 %conv, ptr %arrayidx3, align 4
  br label %if.end4

if.end4:
  %inc = add nuw i32 %i.012, 1
  %cmp1 = icmp ult i32 %inc, %n
  br i1 %cmp1, label %while.body, label %cleanup.loopexit

cleanup.loopexit:
  br label %cleanup

cleanup:
  ret void
}

define void @test_fptoui(i32 %n, ptr %g, ptr %d) {
; CHECK-FP-LABEL: define void @test_fptoui(
; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
; CHECK-FP-NEXT:  entry:
; CHECK-FP-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-FP-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-FP-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-FP:       while.body.lr.ph:
; CHECK-FP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-FP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-FP-NEXT:    [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
; CHECK-FP-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-FP:       while.body:
; CHECK-FP-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-FP-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]
; CHECK-FP-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-FP-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-FP-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-FP:       if.then2:
; CHECK-FP-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]
; CHECK-FP-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8
; CHECK-FP-NEXT:    [[CONV:%.*]] = fptoui double [[TMP5]] to i32
; CHECK-FP-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]
; CHECK-FP-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4
; CHECK-FP-NEXT:    br label [[IF_END4]]
; CHECK-FP:       if.end4:
; CHECK-FP-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-FP-NEXT:    [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)
; CHECK-FP-NEXT:    [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 0
; CHECK-FP-NEXT:    br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-FP:       cleanup.loopexit:
; CHECK-FP-NEXT:    br label [[CLEANUP]]
; CHECK-FP:       cleanup:
; CHECK-FP-NEXT:    ret void
;
; CHECK-SOFT-LABEL: define void @test_fptoui(
; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[G:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {
; CHECK-SOFT-NEXT:  entry:
; CHECK-SOFT-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-SOFT-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-SOFT-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-SOFT:       while.body.lr.ph:
; CHECK-SOFT-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-SOFT-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-SOFT-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-SOFT:       while.body:
; CHECK-SOFT-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-SOFT-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-SOFT-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-SOFT-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-SOFT:       if.then2:
; CHECK-SOFT-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    [[TMP3:%.*]] = load double, ptr [[ARRAYIDX]], align 8
; CHECK-SOFT-NEXT:    [[CONV:%.*]] = fptoui double [[TMP3]] to i32
; CHECK-SOFT-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX3]], align 4
; CHECK-SOFT-NEXT:    br label [[IF_END4]]
; CHECK-SOFT:       if.end4:
; CHECK-SOFT-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-SOFT-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]
; CHECK-SOFT-NEXT:    br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-SOFT:       cleanup.loopexit:
; CHECK-SOFT-NEXT:    br label [[CLEANUP]]
; CHECK-SOFT:       cleanup:
; CHECK-SOFT-NEXT:    ret void
;
entry:
  %n.off = add i32 %n, -1
  %0 = icmp ult i32 %n.off, 500
  br i1 %0, label %while.body.lr.ph, label %cleanup

while.body.lr.ph:
  %1 = load ptr, ptr %d, align 4
  %2 = load ptr, ptr %g, align 4
  br label %while.body

while.body:
  %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]
  %rem = urem i32 %i.012, 10
  %tobool = icmp eq i32 %rem, 0
  br i1 %tobool, label %if.end4, label %if.then2

if.then2:
  %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.012
  %3 = load double, ptr %arrayidx, align 8
  %conv = fptoui double %3 to i32
  %arrayidx3 = getelementptr inbounds i32, ptr %2, i32 %i.012
  store i32 %conv, ptr %arrayidx3, align 4
  br label %if.end4

if.end4:
  %inc = add nuw i32 %i.012, 1
  %cmp1 = icmp ult i32 %inc, %n
  br i1 %cmp1, label %while.body, label %cleanup.loopexit

cleanup.loopexit:
  br label %cleanup

cleanup:
  ret void
}

define void @load_store_float(i32 %n, ptr %d, ptr %g) {
; CHECK-LABEL: define void @load_store_float(
; CHECK-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT:  entry:
; CHECK-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK:       while.body.lr.ph:
; CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK:       while.body:
; CHECK-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP6:%.*]], [[IF_END4]] ]
; CHECK-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK:       if.then2:
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i32 [[I_012]]
; CHECK-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8
; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds double, ptr [[TMP2]], i32 [[I_012]]
; CHECK-NEXT:    store double [[TMP5]], ptr [[ARRAYIDX3]], align 8
; CHECK-NEXT:    br label [[IF_END4]]
; CHECK:       if.end4:
; CHECK-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-NEXT:    [[TMP6]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)
; CHECK-NEXT:    [[TMP7:%.*]] = icmp ne i32 [[TMP6]], 0
; CHECK-NEXT:    br i1 [[TMP7]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK:       cleanup.loopexit:
; CHECK-NEXT:    br label [[CLEANUP]]
; CHECK:       cleanup:
; CHECK-NEXT:    ret void
;
entry:
  %n.off = add i32 %n, -1
  %0 = icmp ult i32 %n.off, 500
  br i1 %0, label %while.body.lr.ph, label %cleanup

while.body.lr.ph:
  %1 = load ptr, ptr %d, align 4
  %2 = load ptr, ptr %g, align 4
  br label %while.body

while.body:
  %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]
  %rem = urem i32 %i.012, 10
  %tobool = icmp eq i32 %rem, 0
  br i1 %tobool, label %if.end4, label %if.then2

if.then2:
  %arrayidx = getelementptr inbounds double, ptr %1, i32 %i.012
  %3 = load double, ptr %arrayidx, align 8
  %arrayidx3 = getelementptr inbounds double, ptr %2, i32 %i.012
  store double %3, ptr %arrayidx3, align 8
  br label %if.end4

if.end4:
  %inc = add nuw i32 %i.012, 1
  %cmp1 = icmp ult i32 %inc, %n
  br i1 %cmp1, label %while.body, label %cleanup.loopexit

cleanup.loopexit:
  br label %cleanup

cleanup:
  ret void
}

define void @fp_add(i32 %n, ptr %d, ptr %g) {
; CHECK-FP-LABEL: define void @fp_add(
; CHECK-FP-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0]] {
; CHECK-FP-NEXT:  entry:
; CHECK-FP-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-FP-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-FP-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-FP:       while.body.lr.ph:
; CHECK-FP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-FP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-FP-NEXT:    [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
; CHECK-FP-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-FP:       while.body:
; CHECK-FP-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-FP-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP3]], [[WHILE_BODY_LR_PH]] ], [ [[TMP7:%.*]], [[IF_END4]] ]
; CHECK-FP-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-FP-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-FP-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-FP:       if.then2:
; CHECK-FP-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 [[I_012]]
; CHECK-FP-NEXT:    [[TMP5:%.*]] = load float, ptr [[ARRAYIDX]], align 4
; CHECK-FP-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 [[I_012]]
; CHECK-FP-NEXT:    [[TMP6:%.*]] = load float, ptr [[ARRAYIDX3]], align 4
; CHECK-FP-NEXT:    [[ADD:%.*]] = fadd float [[TMP5]], [[TMP6]]
; CHECK-FP-NEXT:    store float [[ADD]], ptr [[ARRAYIDX3]], align 4
; CHECK-FP-NEXT:    br label [[IF_END4]]
; CHECK-FP:       if.end4:
; CHECK-FP-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-FP-NEXT:    [[TMP7]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP4]], i32 1)
; CHECK-FP-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
; CHECK-FP-NEXT:    br i1 [[TMP8]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-FP:       cleanup.loopexit:
; CHECK-FP-NEXT:    br label [[CLEANUP]]
; CHECK-FP:       cleanup:
; CHECK-FP-NEXT:    ret void
;
; CHECK-SOFT-LABEL: define void @fp_add(
; CHECK-SOFT-SAME: i32 [[N:%.*]], ptr [[D:%.*]], ptr [[G:%.*]]) #[[ATTR0]] {
; CHECK-SOFT-NEXT:  entry:
; CHECK-SOFT-NEXT:    [[N_OFF:%.*]] = add i32 [[N]], -1
; CHECK-SOFT-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
; CHECK-SOFT-NEXT:    br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
; CHECK-SOFT:       while.body.lr.ph:
; CHECK-SOFT-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
; CHECK-SOFT-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
; CHECK-SOFT-NEXT:    br label [[WHILE_BODY:%.*]]
; CHECK-SOFT:       while.body:
; CHECK-SOFT-NEXT:    [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
; CHECK-SOFT-NEXT:    [[REM:%.*]] = urem i32 [[I_012]], 10
; CHECK-SOFT-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[REM]], 0
; CHECK-SOFT-NEXT:    br i1 [[TOBOOL]], label [[IF_END4]], label [[IF_THEN2:%.*]]
; CHECK-SOFT:       if.then2:
; CHECK-SOFT-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP1]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    [[TMP3:%.*]] = load float, ptr [[ARRAYIDX]], align 4
; CHECK-SOFT-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 [[I_012]]
; CHECK-SOFT-NEXT:    [[TMP4:%.*]] = load float, ptr [[ARRAYIDX3]], align 4
; CHECK-SOFT-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], [[TMP4]]
; CHECK-SOFT-NEXT:    store float [[ADD]], ptr [[ARRAYIDX3]], align 4
; CHECK-SOFT-NEXT:    br label [[IF_END4]]
; CHECK-SOFT:       if.end4:
; CHECK-SOFT-NEXT:    [[INC]] = add nuw i32 [[I_012]], 1
; CHECK-SOFT-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[INC]], [[N]]
; CHECK-SOFT-NEXT:    br i1 [[CMP1]], label [[WHILE_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
; CHECK-SOFT:       cleanup.loopexit:
; CHECK-SOFT-NEXT:    br label [[CLEANUP]]
; CHECK-SOFT:       cleanup:
; CHECK-SOFT-NEXT:    ret void
;
entry:
  %n.off = add i32 %n, -1
  %0 = icmp ult i32 %n.off, 500
  br i1 %0, label %while.body.lr.ph, label %cleanup

while.body.lr.ph:
  %1 = load ptr, ptr %d, align 4
  %2 = load ptr, ptr %g, align 4
  br label %while.body

while.body:
  %i.012 = phi i32 [ 0, %while.body.lr.ph ], [ %inc, %if.end4 ]
  %rem = urem i32 %i.012, 10
  %tobool = icmp eq i32 %rem, 0
  br i1 %tobool, label %if.end4, label %if.then2

if.then2:
  %arrayidx = getelementptr inbounds float, ptr %1, i32 %i.012
  %3 = load float, ptr %arrayidx, align 4
  %arrayidx3 = getelementptr inbounds float, ptr %2, i32 %i.012
  %4 = load float, ptr %arrayidx3, align 4
  %add = fadd float %3, %4
  store float %add, ptr %arrayidx3, align 4
  br label %if.end4

if.end4:
  %inc = add nuw i32 %i.012, 1
  %cmp1 = icmp ult i32 %inc, %n
  br i1 %cmp1, label %while.body, label %cleanup.loopexit

cleanup.loopexit:
  br label %cleanup

cleanup:
  ret void
}