| ; PR28705 | |
| ; RUN: opt < %s -indvars -S | FileCheck %s | |
| ; Check IndVarSimplify replaces the exitval use of the induction var "%inc.i.i" | |
| ; with "%.sroa.speculated + 1". | |
| ; | |
| ; CHECK-LABEL: @foo( | |
| ; CHECK: %[[EXIT:.+]] = sub i32 %.sroa.speculated, -1 | |
| ; CHECK: %DB.sroa.9.0.lcssa = phi i32 [ 1, %entry ], [ %[[EXIT]], %loopexit ] | |
| ; | |
| define void @foo(i32 %sub.ptr.div.i, i8* %ref.i1174) local_unnamed_addr { | |
| entry: | |
| %cmp.i1137 = icmp ugt i32 %sub.ptr.div.i, 3 | |
| %.sroa.speculated = select i1 %cmp.i1137, i32 3, i32 %sub.ptr.div.i | |
| %cmp6483126 = icmp eq i32 %.sroa.speculated, 0 | |
| br i1 %cmp6483126, label %XZ.exit, label %for.body650.lr.ph | |
| for.body650.lr.ph: | |
| br label %for.body650 | |
| loopexit: | |
| %inc.i.i.lcssa = phi i32 [ %inc.i.i, %for.body650 ] | |
| br label %XZ.exit | |
| XZ.exit: | |
| %DB.sroa.9.0.lcssa = phi i32 [ 1, %entry ], [ %inc.i.i.lcssa, %loopexit ] | |
| br label %end | |
| for.body650: | |
| %iv = phi i32 [ 0, %for.body650.lr.ph ], [ %inc655, %for.body650 ] | |
| %iv2 = phi i32 [ 1, %for.body650.lr.ph ], [ %inc.i.i, %for.body650 ] | |
| %arrayidx.i.i1105 = getelementptr inbounds i8, i8* %ref.i1174, i32 %iv2 | |
| store i8 7, i8* %arrayidx.i.i1105, align 1 | |
| %inc.i.i = add i32 %iv2, 1 | |
| %inc655 = add i32 %iv, 1 | |
| %cmp648 = icmp eq i32 %inc655, %.sroa.speculated | |
| br i1 %cmp648, label %loopexit, label %for.body650 | |
| end: | |
| ret void | |
| } |