172482c51SRoman Lebedev; RUN: opt < %s -S -passes=loop-flatten -debug-only=loop-flatten 2>&1 | FileCheck %s 2d53b4beeSSjoerd Meijer; REQUIRES: asserts 3d53b4beeSSjoerd Meijer 49aa77338SSjoerd Meijertarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 59aa77338SSjoerd Meijer 6d53b4beeSSjoerd Meijer; Every function in this file has a reason that it can't be transformed. 7d53b4beeSSjoerd Meijer 8d53b4beeSSjoerd Meijer; CHECK-NOT: Checks all passed, doing the transformation 9d53b4beeSSjoerd Meijer 10d53b4beeSSjoerd Meijer; Outer loop does not start at zero 11055fb779SNikita Popovdefine void @test_1(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 12d53b4beeSSjoerd Meijerentry: 13d53b4beeSSjoerd Meijer %cmp25 = icmp sgt i32 %N, 0 14d53b4beeSSjoerd Meijer br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup 15d53b4beeSSjoerd Meijer 16d53b4beeSSjoerd Meijerfor.body4.lr.ph: 17d53b4beeSSjoerd Meijer %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 1, %entry ] 18d53b4beeSSjoerd Meijer %mul = mul nsw i32 %i.026, %N 19d53b4beeSSjoerd Meijer br label %for.body4 20d53b4beeSSjoerd Meijer 21d53b4beeSSjoerd Meijerfor.body4: 22d53b4beeSSjoerd Meijer %j.024 = phi i32 [ 0, %for.body4.lr.ph ], [ %inc, %for.body4 ] 23d53b4beeSSjoerd Meijer %add = add nsw i32 %j.024, %mul 24055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 25055fb779SNikita Popov %0 = load i32, ptr %arrayidx, align 4 26d53b4beeSSjoerd Meijer %mul5 = mul nsw i32 %0, %scale 27055fb779SNikita Popov %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add 28055fb779SNikita Popov store i32 %mul5, ptr %arrayidx8, align 4 29d53b4beeSSjoerd Meijer %inc = add nuw nsw i32 %j.024, 1 30d53b4beeSSjoerd Meijer %exitcond = icmp eq i32 %inc, %N 31d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.cond.cleanup3, label %for.body4 32d53b4beeSSjoerd Meijer 33d53b4beeSSjoerd Meijerfor.cond.cleanup3: 34d53b4beeSSjoerd Meijer %inc10 = add nuw nsw i32 %i.026, 1 35d53b4beeSSjoerd Meijer %exitcond27 = icmp eq i32 %inc10, %N 36d53b4beeSSjoerd Meijer br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph 37d53b4beeSSjoerd Meijer 38d53b4beeSSjoerd Meijerfor.cond.cleanup: 39d53b4beeSSjoerd Meijer ret void 40d53b4beeSSjoerd Meijer} 41d53b4beeSSjoerd Meijer 42d53b4beeSSjoerd Meijer; Inner loop does not start at zero 43055fb779SNikita Popovdefine void @test_2(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 44d53b4beeSSjoerd Meijerentry: 45d53b4beeSSjoerd Meijer %cmp25 = icmp sgt i32 %N, 0 46d53b4beeSSjoerd Meijer br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup 47d53b4beeSSjoerd Meijer 48d53b4beeSSjoerd Meijerfor.body4.lr.ph: 49d53b4beeSSjoerd Meijer %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 0, %entry ] 50d53b4beeSSjoerd Meijer %mul = mul nsw i32 %i.026, %N 51d53b4beeSSjoerd Meijer br label %for.body4 52d53b4beeSSjoerd Meijer 53d53b4beeSSjoerd Meijerfor.body4: 54d53b4beeSSjoerd Meijer %j.024 = phi i32 [ 1, %for.body4.lr.ph ], [ %inc, %for.body4 ] 55d53b4beeSSjoerd Meijer %add = add nsw i32 %j.024, %mul 56055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 57055fb779SNikita Popov %0 = load i32, ptr %arrayidx, align 4 58d53b4beeSSjoerd Meijer %mul5 = mul nsw i32 %0, %scale 59055fb779SNikita Popov %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add 60055fb779SNikita Popov store i32 %mul5, ptr %arrayidx8, align 4 61d53b4beeSSjoerd Meijer %inc = add nuw nsw i32 %j.024, 1 62d53b4beeSSjoerd Meijer %exitcond = icmp eq i32 %inc, %N 63d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.cond.cleanup3, label %for.body4 64d53b4beeSSjoerd Meijer 65d53b4beeSSjoerd Meijerfor.cond.cleanup3: 66d53b4beeSSjoerd Meijer %inc10 = add nuw nsw i32 %i.026, 1 67d53b4beeSSjoerd Meijer %exitcond27 = icmp eq i32 %inc10, %N 68d53b4beeSSjoerd Meijer br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph 69d53b4beeSSjoerd Meijer 70d53b4beeSSjoerd Meijerfor.cond.cleanup: 71d53b4beeSSjoerd Meijer ret void 72d53b4beeSSjoerd Meijer} 73d53b4beeSSjoerd Meijer 74d53b4beeSSjoerd Meijer; Outer IV used directly 75055fb779SNikita Popovdefine hidden void @test_3(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 76d53b4beeSSjoerd Meijerentry: 77d53b4beeSSjoerd Meijer %conv = zext i16 %N to i32 78d53b4beeSSjoerd Meijer %cmp25 = icmp eq i16 %N, 0 79d53b4beeSSjoerd Meijer br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us 80d53b4beeSSjoerd Meijer 81d53b4beeSSjoerd Meijerfor.body.lr.ph.split.us: ; preds = %entry 82d53b4beeSSjoerd Meijer br label %for.body.us 83d53b4beeSSjoerd Meijer 84d53b4beeSSjoerd Meijerfor.body.us: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us 85d53b4beeSSjoerd Meijer %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ] 86055fb779SNikita Popov %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %i.026.us 87d53b4beeSSjoerd Meijer %mul9.us = mul nuw nsw i32 %i.026.us, %conv 88d53b4beeSSjoerd Meijer br label %for.body7.us 89d53b4beeSSjoerd Meijer 90d53b4beeSSjoerd Meijerfor.body7.us: ; preds = %for.body.us, %for.body7.us 91d53b4beeSSjoerd Meijer %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ] 92055fb779SNikita Popov %0 = load i32, ptr %arrayidx.us, align 4 93d53b4beeSSjoerd Meijer %mul.us = mul nsw i32 %0, %scale 94d53b4beeSSjoerd Meijer %add.us = add nuw nsw i32 %j.024.us, %mul9.us 95055fb779SNikita Popov %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us 96055fb779SNikita Popov store i32 %mul.us, ptr %arrayidx10.us, align 4 97d53b4beeSSjoerd Meijer %inc.us = add nuw nsw i32 %j.024.us, 1 98d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc.us, %conv 99d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us 100d53b4beeSSjoerd Meijer 101d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us 102d53b4beeSSjoerd Meijer %inc12.us = add nuw nsw i32 %i.026.us, 1 103d53b4beeSSjoerd Meijer %exitcond27 = icmp ne i32 %inc12.us, %conv 104d53b4beeSSjoerd Meijer br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit 105d53b4beeSSjoerd Meijer 106d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us 107d53b4beeSSjoerd Meijer br label %for.cond.cleanup 108d53b4beeSSjoerd Meijer 109d53b4beeSSjoerd Meijerfor.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 110d53b4beeSSjoerd Meijer ret void 111d53b4beeSSjoerd Meijer} 112d53b4beeSSjoerd Meijer 113d53b4beeSSjoerd Meijer; Inner IV used directly 114055fb779SNikita Popovdefine hidden void @test_4(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 115d53b4beeSSjoerd Meijerentry: 116d53b4beeSSjoerd Meijer %conv = zext i16 %N to i32 117d53b4beeSSjoerd Meijer %cmp25 = icmp eq i16 %N, 0 118d53b4beeSSjoerd Meijer br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us 119d53b4beeSSjoerd Meijer 120d53b4beeSSjoerd Meijerfor.body.lr.ph.split.us: ; preds = %entry 121d53b4beeSSjoerd Meijer br label %for.body.us 122d53b4beeSSjoerd Meijer 123d53b4beeSSjoerd Meijerfor.body.us: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us 124d53b4beeSSjoerd Meijer %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ] 125d53b4beeSSjoerd Meijer %mul9.us = mul nuw nsw i32 %i.026.us, %conv 126d53b4beeSSjoerd Meijer br label %for.body7.us 127d53b4beeSSjoerd Meijer 128d53b4beeSSjoerd Meijerfor.body7.us: ; preds = %for.body.us, %for.body7.us 129d53b4beeSSjoerd Meijer %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ] 130055fb779SNikita Popov %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %j.024.us 131055fb779SNikita Popov %0 = load i32, ptr %arrayidx.us, align 4 132d53b4beeSSjoerd Meijer %mul.us = mul nsw i32 %0, %scale 133d53b4beeSSjoerd Meijer %add.us = add nuw nsw i32 %j.024.us, %mul9.us 134055fb779SNikita Popov %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us 135055fb779SNikita Popov store i32 %mul.us, ptr %arrayidx10.us, align 4 136d53b4beeSSjoerd Meijer %inc.us = add nuw nsw i32 %j.024.us, 1 137d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc.us, %conv 138d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us 139d53b4beeSSjoerd Meijer 140d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us 141d53b4beeSSjoerd Meijer %inc12.us = add nuw nsw i32 %i.026.us, 1 142d53b4beeSSjoerd Meijer %exitcond27 = icmp ne i32 %inc12.us, %conv 143d53b4beeSSjoerd Meijer br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit 144d53b4beeSSjoerd Meijer 145d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us 146d53b4beeSSjoerd Meijer br label %for.cond.cleanup 147d53b4beeSSjoerd Meijer 148d53b4beeSSjoerd Meijerfor.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 149d53b4beeSSjoerd Meijer ret void 150d53b4beeSSjoerd Meijer} 151d53b4beeSSjoerd Meijer 152d53b4beeSSjoerd Meijer; Inner iteration count not invariant in outer loop 153d53b4beeSSjoerd Meijerdeclare i32 @get_int() readonly 154055fb779SNikita Popovdefine void @test_5(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 155d53b4beeSSjoerd Meijerentry: 156d53b4beeSSjoerd Meijer %conv = zext i16 %N to i32 157d53b4beeSSjoerd Meijer %cmp27 = icmp eq i16 %N, 0 158d53b4beeSSjoerd Meijer br i1 %cmp27, label %for.cond.cleanup, label %for.body.lr.ph 159d53b4beeSSjoerd Meijer 160d53b4beeSSjoerd Meijerfor.body.lr.ph: ; preds = %entry 161d53b4beeSSjoerd Meijer br label %for.body 162d53b4beeSSjoerd Meijer 163d53b4beeSSjoerd Meijerfor.cond.cleanup.loopexit: ; preds = %for.cond.cleanup5 164d53b4beeSSjoerd Meijer br label %for.cond.cleanup 165d53b4beeSSjoerd Meijer 166d53b4beeSSjoerd Meijerfor.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 167d53b4beeSSjoerd Meijer ret void 168d53b4beeSSjoerd Meijer 169d53b4beeSSjoerd Meijerfor.body: ; preds = %for.body.lr.ph, %for.cond.cleanup5 170d53b4beeSSjoerd Meijer %i.028 = phi i32 [ 0, %for.body.lr.ph ], [ %inc12, %for.cond.cleanup5 ] 171d53b4beeSSjoerd Meijer %call = tail call i32 @get_int() 172d53b4beeSSjoerd Meijer %cmp325 = icmp sgt i32 %call, 0 173d53b4beeSSjoerd Meijer br i1 %cmp325, label %for.body6.lr.ph, label %for.cond.cleanup5 174d53b4beeSSjoerd Meijer 175d53b4beeSSjoerd Meijerfor.body6.lr.ph: ; preds = %for.body 176d53b4beeSSjoerd Meijer %mul = mul nsw i32 %call, %i.028 177d53b4beeSSjoerd Meijer br label %for.body6 178d53b4beeSSjoerd Meijer 179d53b4beeSSjoerd Meijerfor.cond.cleanup5.loopexit: ; preds = %for.body6 180d53b4beeSSjoerd Meijer br label %for.cond.cleanup5 181d53b4beeSSjoerd Meijer 182d53b4beeSSjoerd Meijerfor.cond.cleanup5: ; preds = %for.cond.cleanup5.loopexit, %for.body 183d53b4beeSSjoerd Meijer %inc12 = add nuw nsw i32 %i.028, 1 184d53b4beeSSjoerd Meijer %exitcond29 = icmp ne i32 %inc12, %conv 185d53b4beeSSjoerd Meijer br i1 %exitcond29, label %for.body, label %for.cond.cleanup.loopexit 186d53b4beeSSjoerd Meijer 187d53b4beeSSjoerd Meijerfor.body6: ; preds = %for.body6.lr.ph, %for.body6 188d53b4beeSSjoerd Meijer %j.026 = phi i32 [ 0, %for.body6.lr.ph ], [ %inc, %for.body6 ] 189d53b4beeSSjoerd Meijer %add = add nsw i32 %j.026, %mul 190055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 191055fb779SNikita Popov %0 = load i32, ptr %arrayidx, align 4 192d53b4beeSSjoerd Meijer %mul7 = mul nsw i32 %0, %scale 193055fb779SNikita Popov %arrayidx10 = getelementptr inbounds i32, ptr %C, i32 %add 194055fb779SNikita Popov store i32 %mul7, ptr %arrayidx10, align 4 195d53b4beeSSjoerd Meijer %inc = add nuw nsw i32 %j.026, 1 196d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc, %call 197d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body6, label %for.cond.cleanup5.loopexit 198d53b4beeSSjoerd Meijer} 199d53b4beeSSjoerd Meijer 200d53b4beeSSjoerd Meijer; Inner loop has an early exit 201055fb779SNikita Popovdefine hidden void @test_6(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 202d53b4beeSSjoerd Meijerentry: 203d53b4beeSSjoerd Meijer %conv = zext i16 %N to i32 204d53b4beeSSjoerd Meijer %cmp39 = icmp eq i16 %N, 0 205d53b4beeSSjoerd Meijer br i1 %cmp39, label %for.cond.cleanup, label %for.body.us.preheader 206d53b4beeSSjoerd Meijer 207d53b4beeSSjoerd Meijerfor.body.us.preheader: ; preds = %entry 208d53b4beeSSjoerd Meijer br label %for.body.us 209d53b4beeSSjoerd Meijer 210d53b4beeSSjoerd Meijerfor.body.us: ; preds = %for.body.us.preheader, %cleanup.us 211d53b4beeSSjoerd Meijer %i.040.us = phi i32 [ %inc19.us, %cleanup.us ], [ 0, %for.body.us.preheader ] 212d53b4beeSSjoerd Meijer %mul.us = mul nuw nsw i32 %i.040.us, %conv 213d53b4beeSSjoerd Meijer br label %for.body7.us 214d53b4beeSSjoerd Meijer 215d53b4beeSSjoerd Meijerfor.body7.us: ; preds = %for.body.us, %if.end.us 216d53b4beeSSjoerd Meijer %j.038.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %if.end.us ] 217d53b4beeSSjoerd Meijer %add.us = add nuw nsw i32 %j.038.us, %mul.us 218055fb779SNikita Popov %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us 219055fb779SNikita Popov %0 = load i32, ptr %arrayidx.us, align 4 220d53b4beeSSjoerd Meijer %tobool.us = icmp eq i32 %0, 0 221d53b4beeSSjoerd Meijer br i1 %tobool.us, label %if.end.us, label %cleanup.us 222d53b4beeSSjoerd Meijer 223d53b4beeSSjoerd Meijercleanup.us: ; preds = %if.end.us, %for.body7.us 224d53b4beeSSjoerd Meijer %inc19.us = add nuw nsw i32 %i.040.us, 1 225d53b4beeSSjoerd Meijer %exitcond = icmp eq i32 %inc19.us, %conv 226d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.cond.cleanup, label %for.body.us 227d53b4beeSSjoerd Meijer 228d53b4beeSSjoerd Meijerif.end.us: ; preds = %for.body7.us 229055fb779SNikita Popov %arrayidx17.us = getelementptr inbounds i32, ptr %C, i32 %add.us 230055fb779SNikita Popov store i32 0, ptr %arrayidx17.us, align 4 231d53b4beeSSjoerd Meijer %inc.us = add nuw nsw i32 %j.038.us, 1 232d53b4beeSSjoerd Meijer %cmp4.us = icmp ult i32 %inc.us, %conv 233d53b4beeSSjoerd Meijer br i1 %cmp4.us, label %for.body7.us, label %cleanup.us 234d53b4beeSSjoerd Meijer 235d53b4beeSSjoerd Meijerfor.cond.cleanup: ; preds = %cleanup.us, %entry 236d53b4beeSSjoerd Meijer ret void 237d53b4beeSSjoerd Meijer} 238d53b4beeSSjoerd Meijer 239055fb779SNikita Popovdefine hidden void @test_7(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) { 240d53b4beeSSjoerd Meijerentry: 241d53b4beeSSjoerd Meijer %conv = zext i16 %N to i32 242d53b4beeSSjoerd Meijer %cmp30 = icmp eq i16 %N, 0 243d53b4beeSSjoerd Meijer br i1 %cmp30, label %cleanup, label %for.body.us.preheader 244d53b4beeSSjoerd Meijer 245d53b4beeSSjoerd Meijerfor.body.us.preheader: ; preds = %entry 246d53b4beeSSjoerd Meijer br label %for.body.us 247d53b4beeSSjoerd Meijer 248d53b4beeSSjoerd Meijerfor.body.us: ; preds = %for.body.us.preheader, %for.cond2.for.cond.cleanup6_crit_edge.us 249d53b4beeSSjoerd Meijer %i.031.us = phi i32 [ %inc15.us, %for.cond2.for.cond.cleanup6_crit_edge.us ], [ 0, %for.body.us.preheader ] 250d53b4beeSSjoerd Meijer %call.us = tail call i32 @get_int() #2 251d53b4beeSSjoerd Meijer %tobool.us = icmp eq i32 %call.us, 0 252d53b4beeSSjoerd Meijer br i1 %tobool.us, label %for.body7.lr.ph.us, label %cleanup 253d53b4beeSSjoerd Meijer 254d53b4beeSSjoerd Meijerfor.body7.us: ; preds = %for.body7.us, %for.body7.lr.ph.us 255d53b4beeSSjoerd Meijer %j.029.us = phi i32 [ 0, %for.body7.lr.ph.us ], [ %inc.us, %for.body7.us ] 256d53b4beeSSjoerd Meijer %add.us = add nuw nsw i32 %j.029.us, %mul.us 257055fb779SNikita Popov %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us 258055fb779SNikita Popov %0 = load i32, ptr %arrayidx.us, align 4 259d53b4beeSSjoerd Meijer %mul9.us = mul nsw i32 %0, %scale 260055fb779SNikita Popov %arrayidx13.us = getelementptr inbounds i32, ptr %C, i32 %add.us 261055fb779SNikita Popov store i32 %mul9.us, ptr %arrayidx13.us, align 4 262d53b4beeSSjoerd Meijer %inc.us = add nuw nsw i32 %j.029.us, 1 263d53b4beeSSjoerd Meijer %exitcond = icmp eq i32 %inc.us, %conv 264d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.cond2.for.cond.cleanup6_crit_edge.us, label %for.body7.us 265d53b4beeSSjoerd Meijer 266d53b4beeSSjoerd Meijerfor.body7.lr.ph.us: ; preds = %for.body.us 267d53b4beeSSjoerd Meijer %mul.us = mul nuw nsw i32 %i.031.us, %conv 268d53b4beeSSjoerd Meijer br label %for.body7.us 269d53b4beeSSjoerd Meijer 270d53b4beeSSjoerd Meijerfor.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us 271d53b4beeSSjoerd Meijer %inc15.us = add nuw nsw i32 %i.031.us, 1 272d53b4beeSSjoerd Meijer %cmp.us = icmp ult i32 %inc15.us, %conv 273d53b4beeSSjoerd Meijer br i1 %cmp.us, label %for.body.us, label %cleanup 274d53b4beeSSjoerd Meijer 275d53b4beeSSjoerd Meijercleanup: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.us, %entry 276d53b4beeSSjoerd Meijer ret void 277d53b4beeSSjoerd Meijer} 278d53b4beeSSjoerd Meijer 279d53b4beeSSjoerd Meijer; Step is not 1 280055fb779SNikita Popovdefine i32 @test_8(i32 %val, ptr nocapture %A) { 281d53b4beeSSjoerd Meijerentry: 282d53b4beeSSjoerd Meijer br label %for.body 283d53b4beeSSjoerd Meijer 284d53b4beeSSjoerd Meijerfor.body: ; preds = %entry, %for.inc6 285d53b4beeSSjoerd Meijer %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ] 286d53b4beeSSjoerd Meijer %mul = mul nuw nsw i32 %i.018, 20 287d53b4beeSSjoerd Meijer br label %for.body3 288d53b4beeSSjoerd Meijer 289d53b4beeSSjoerd Meijerfor.body3: ; preds = %for.body, %for.body3 290d53b4beeSSjoerd Meijer %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ] 291d53b4beeSSjoerd Meijer %add = add nuw nsw i32 %j.017, %mul 292055fb779SNikita Popov %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add 293055fb779SNikita Popov %0 = load i16, ptr %arrayidx, align 2 294d53b4beeSSjoerd Meijer %conv16 = zext i16 %0 to i32 295d53b4beeSSjoerd Meijer %add4 = add i32 %conv16, %val 296d53b4beeSSjoerd Meijer %conv5 = trunc i32 %add4 to i16 297055fb779SNikita Popov store i16 %conv5, ptr %arrayidx, align 2 298d53b4beeSSjoerd Meijer %inc = add nuw nsw i32 %j.017, 1 299d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc, 20 300d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body3, label %for.inc6 301d53b4beeSSjoerd Meijer 302d53b4beeSSjoerd Meijerfor.inc6: ; preds = %for.body3 303d53b4beeSSjoerd Meijer %inc7 = add nuw nsw i32 %i.018, 2 304d53b4beeSSjoerd Meijer %exitcond19 = icmp ne i32 %inc7, 10 305d53b4beeSSjoerd Meijer br i1 %exitcond19, label %for.body, label %for.end8 306d53b4beeSSjoerd Meijer 307d53b4beeSSjoerd Meijerfor.end8: ; preds = %for.inc6 308d53b4beeSSjoerd Meijer ret i32 10 309d53b4beeSSjoerd Meijer} 310d53b4beeSSjoerd Meijer 311d53b4beeSSjoerd Meijer 312d53b4beeSSjoerd Meijer; Step is not 1 313055fb779SNikita Popovdefine i32 @test_9(i32 %val, ptr nocapture %A) { 314d53b4beeSSjoerd Meijerentry: 315d53b4beeSSjoerd Meijer br label %for.body 316d53b4beeSSjoerd Meijer 317d53b4beeSSjoerd Meijerfor.body: ; preds = %entry, %for.inc6 318d53b4beeSSjoerd Meijer %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ] 319d53b4beeSSjoerd Meijer %mul = mul nuw nsw i32 %i.018, 20 320d53b4beeSSjoerd Meijer br label %for.body3 321d53b4beeSSjoerd Meijer 322d53b4beeSSjoerd Meijerfor.body3: ; preds = %for.body, %for.body3 323d53b4beeSSjoerd Meijer %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ] 324d53b4beeSSjoerd Meijer %add = add nuw nsw i32 %j.017, %mul 325055fb779SNikita Popov %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add 326055fb779SNikita Popov %0 = load i16, ptr %arrayidx, align 2 327d53b4beeSSjoerd Meijer %conv16 = zext i16 %0 to i32 328d53b4beeSSjoerd Meijer %add4 = add i32 %conv16, %val 329d53b4beeSSjoerd Meijer %conv5 = trunc i32 %add4 to i16 330055fb779SNikita Popov store i16 %conv5, ptr %arrayidx, align 2 331d53b4beeSSjoerd Meijer %inc = add nuw nsw i32 %j.017, 2 332d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc, 20 333d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body3, label %for.inc6 334d53b4beeSSjoerd Meijer 335d53b4beeSSjoerd Meijerfor.inc6: ; preds = %for.body3 336d53b4beeSSjoerd Meijer %inc7 = add nuw nsw i32 %i.018, 1 337d53b4beeSSjoerd Meijer %exitcond19 = icmp ne i32 %inc7, 10 338d53b4beeSSjoerd Meijer br i1 %exitcond19, label %for.body, label %for.end8 339d53b4beeSSjoerd Meijer 340d53b4beeSSjoerd Meijerfor.end8: ; preds = %for.inc6 341d53b4beeSSjoerd Meijer ret i32 10 342d53b4beeSSjoerd Meijer} 343d53b4beeSSjoerd Meijer 344f117ed54SRosie Sumpter; test_10, test_11 and test_12 are for the case when the 345f117ed54SRosie Sumpter; inner trip count is a constant, then the InstCombine pass 346f117ed54SRosie Sumpter; makes the transformation icmp ult i32 %inc, tripcount -> 347f117ed54SRosie Sumpter; icmp ult i32 %j, tripcount-step. 348f117ed54SRosie Sumpter 349f117ed54SRosie Sumpter; test_10: The step is not 1. 350055fb779SNikita Popovdefine i32 @test_10(ptr nocapture %A) { 351491ac280SRosie Sumpterentry: 352491ac280SRosie Sumpter br label %for.cond1.preheader 353491ac280SRosie Sumpter 354491ac280SRosie Sumpterfor.cond1.preheader: 355f117ed54SRosie Sumpter %i.017 = phi i32 [ 0, %entry ], [ %inc, %for.cond.cleanup3 ] 356491ac280SRosie Sumpter %mul = mul i32 %i.017, 20 357491ac280SRosie Sumpter br label %for.body4 358491ac280SRosie Sumpter 359491ac280SRosie Sumpterfor.body4: 360f117ed54SRosie Sumpter %j.016 = phi i32 [ 0, %for.cond1.preheader ], [ %add5, %for.body4 ] 361491ac280SRosie Sumpter %add = add i32 %j.016, %mul 362055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 363055fb779SNikita Popov store i32 30, ptr %arrayidx, align 4 364f117ed54SRosie Sumpter %add5 = add nuw nsw i32 %j.016, 2 365f117ed54SRosie Sumpter %cmp2 = icmp ult i32 %j.016, 18 366491ac280SRosie Sumpter br i1 %cmp2, label %for.body4, label %for.cond.cleanup3 367491ac280SRosie Sumpter 368f117ed54SRosie Sumpterfor.cond.cleanup3: 369f117ed54SRosie Sumpter %inc = add i32 %i.017, 1 370f117ed54SRosie Sumpter %cmp = icmp ult i32 %inc, 11 371f117ed54SRosie Sumpter br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup 372f117ed54SRosie Sumpter 373491ac280SRosie Sumpterfor.cond.cleanup: 374055fb779SNikita Popov %0 = load i32, ptr %A, align 4 375491ac280SRosie Sumpter ret i32 %0 376491ac280SRosie Sumpter} 377d53b4beeSSjoerd Meijer 378f117ed54SRosie Sumpter; test_11: The inner inducation variable is used in a compare which 379f117ed54SRosie Sumpter; isn't the condition of the inner branch. 380055fb779SNikita Popovdefine i32 @test_11(ptr nocapture %A) { 381f117ed54SRosie Sumpterentry: 382f117ed54SRosie Sumpter br label %for.cond1.preheader 383f117ed54SRosie Sumpter 384f117ed54SRosie Sumpterfor.cond1.preheader: 385f117ed54SRosie Sumpter %i.020 = phi i32 [ 0, %entry ], [ %inc7, %for.cond.cleanup3 ] 386f117ed54SRosie Sumpter %mul = mul i32 %i.020, 20 387f117ed54SRosie Sumpter br label %for.body4 388f117ed54SRosie Sumpter 389f117ed54SRosie Sumpterfor.body4: 390f117ed54SRosie Sumpter %j.019 = phi i32 [ 0, %for.cond1.preheader ], [ %inc, %for.body4 ] 391f117ed54SRosie Sumpter %cmp5 = icmp ult i32 %j.019, 5 392f117ed54SRosie Sumpter %cond = select i1 %cmp5, i32 30, i32 15 393f117ed54SRosie Sumpter %add = add i32 %j.019, %mul 394055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 395055fb779SNikita Popov store i32 %cond, ptr %arrayidx, align 4 396f117ed54SRosie Sumpter %inc = add nuw nsw i32 %j.019, 1 397f117ed54SRosie Sumpter %cmp2 = icmp ult i32 %j.019, 19 398f117ed54SRosie Sumpter br i1 %cmp2, label %for.body4, label %for.cond.cleanup3 399f117ed54SRosie Sumpter 400f117ed54SRosie Sumpterfor.cond.cleanup3: 401f117ed54SRosie Sumpter %inc7 = add i32 %i.020, 1 402f117ed54SRosie Sumpter %cmp = icmp ult i32 %inc7, 11 403f117ed54SRosie Sumpter br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup 404f117ed54SRosie Sumpter 405f117ed54SRosie Sumpterfor.cond.cleanup: 406055fb779SNikita Popov %0 = load i32, ptr %A, align 4 407f117ed54SRosie Sumpter ret i32 %0 408f117ed54SRosie Sumpter} 409f117ed54SRosie Sumpter 410f117ed54SRosie Sumpter; test_12: Incoming phi node value for preheader is a variable 411055fb779SNikita Popovdefine i32 @test_12(ptr %A) { 412f117ed54SRosie Sumpterentry: 413f117ed54SRosie Sumpter br label %while.cond1.preheader 414f117ed54SRosie Sumpter 415f117ed54SRosie Sumpterwhile.cond1.preheader: 416f117ed54SRosie Sumpter %j.017 = phi i32 [ 0, %entry ], [ %j.1, %while.end ] 417f117ed54SRosie Sumpter %i.016 = phi i32 [ 0, %entry ], [ %inc4, %while.end ] 418f117ed54SRosie Sumpter %mul = mul i32 %i.016, 20 419f117ed54SRosie Sumpter %cmp214 = icmp ult i32 %j.017, 20 420f117ed54SRosie Sumpter br i1 %cmp214, label %while.body3.preheader, label %while.end 421f117ed54SRosie Sumpter 422f117ed54SRosie Sumpterwhile.body3.preheader: 423f117ed54SRosie Sumpter br label %while.body3 424f117ed54SRosie Sumpter 425f117ed54SRosie Sumpterwhile.body3: 426f117ed54SRosie Sumpter %j.115 = phi i32 [ %inc, %while.body3 ], [ %j.017, %while.body3.preheader ] 427f117ed54SRosie Sumpter %add = add i32 %j.115, %mul 428055fb779SNikita Popov %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 429055fb779SNikita Popov store i32 30, ptr %arrayidx, align 4 430f117ed54SRosie Sumpter %inc = add nuw nsw i32 %j.115, 1 431f117ed54SRosie Sumpter %cmp2 = icmp ult i32 %j.115, 19 432f117ed54SRosie Sumpter br i1 %cmp2, label %while.body3, label %while.end.loopexit 433f117ed54SRosie Sumpter 434f117ed54SRosie Sumpterwhile.end.loopexit: 435f117ed54SRosie Sumpter %inc.lcssa = phi i32 [ %inc, %while.body3 ] 436f117ed54SRosie Sumpter br label %while.end 437f117ed54SRosie Sumpter 438f117ed54SRosie Sumpterwhile.end: 439f117ed54SRosie Sumpter %j.1 = phi i32 [ %j.017, %while.cond1.preheader], [ %inc.lcssa, %while.end.loopexit ] 440f117ed54SRosie Sumpter %inc4 = add i32 %i.016, 1 441f117ed54SRosie Sumpter %cmp = icmp ult i32 %inc4, 11 442f117ed54SRosie Sumpter br i1 %cmp, label %while.cond1.preheader, label %while.end5 443f117ed54SRosie Sumpter 444f117ed54SRosie Sumpterwhile.end5: 445055fb779SNikita Popov %0 = load i32, ptr %A, align 4 446f117ed54SRosie Sumpter ret i32 %0 447f117ed54SRosie Sumpter} 448f117ed54SRosie Sumpter 449d53b4beeSSjoerd Meijer; Outer loop conditional phi 450d53b4beeSSjoerd Meijerdefine i32 @e() { 451d53b4beeSSjoerd Meijerentry: 452d53b4beeSSjoerd Meijer br label %for.body 453d53b4beeSSjoerd Meijer 454d53b4beeSSjoerd Meijerfor.body: ; preds = %entry, %for.end16 455d53b4beeSSjoerd Meijer %f.033 = phi i32 [ 0, %entry ], [ %inc18, %for.end16 ] 456d53b4beeSSjoerd Meijer %g.032 = phi i32 [ undef, %entry ], [ %g.3.lcssa, %for.end16 ] 457d53b4beeSSjoerd Meijer %.pr = add i32 10, 10 458d53b4beeSSjoerd Meijer %tobool29 = icmp eq i32 %.pr, 0 459d53b4beeSSjoerd Meijer br i1 %tobool29, label %for.end, label %for.body2.lr.ph 460d53b4beeSSjoerd Meijer 461d53b4beeSSjoerd Meijerfor.body2.lr.ph: ; preds = %for.body 462d53b4beeSSjoerd Meijer br label %for.cond1.for.end_crit_edge 463d53b4beeSSjoerd Meijer 464d53b4beeSSjoerd Meijerfor.cond1.for.end_crit_edge: ; preds = %for.body2.lr.ph 465d53b4beeSSjoerd Meijer br label %for.end 466d53b4beeSSjoerd Meijer 467d53b4beeSSjoerd Meijerfor.end: ; preds = %for.cond1.for.end_crit_edge, %for.body 468d53b4beeSSjoerd Meijer %g.1.lcssa = phi i32 [ 0, %for.cond1.for.end_crit_edge ], [ %g.032, %for.body ] 469d53b4beeSSjoerd Meijer br label %for.body5 470d53b4beeSSjoerd Meijer 471d53b4beeSSjoerd Meijerfor.body5: ; preds = %for.end, %lor.end 472d53b4beeSSjoerd Meijer %i.031 = phi i32 [ 0, %for.end ], [ %inc15, %lor.end ] 473d53b4beeSSjoerd Meijer %g.230 = phi i32 [ %g.1.lcssa, %for.end ], [ %g.3, %lor.end ] 474d53b4beeSSjoerd Meijer %0 = add i32 10, 10 475d53b4beeSSjoerd Meijer %1 = add i32 10, 10 476d53b4beeSSjoerd Meijer %tobool9 = icmp eq i32 %1, 0 477d53b4beeSSjoerd Meijer br i1 %tobool9, label %lor.rhs, label %lor.end 478d53b4beeSSjoerd Meijer 479d53b4beeSSjoerd Meijerlor.rhs: ; preds = %for.body5 480d53b4beeSSjoerd Meijer %2 = add i32 10, 10 481d53b4beeSSjoerd Meijer %call11 = add i32 10, 10 482d53b4beeSSjoerd Meijer %tobool12 = icmp ne i32 %call11, 0 483d53b4beeSSjoerd Meijer br label %lor.end 484d53b4beeSSjoerd Meijer 485d53b4beeSSjoerd Meijerlor.end: ; preds = %for.body5, %lor.rhs 486d53b4beeSSjoerd Meijer %g.3 = phi i32 [ %g.230, %for.body5 ], [ %call11, %lor.rhs ] 487d53b4beeSSjoerd Meijer %3 = phi i1 [ true, %for.body5 ], [ %tobool12, %lor.rhs ] 488d53b4beeSSjoerd Meijer %lor.ext = zext i1 %3 to i32 489d53b4beeSSjoerd Meijer %inc15 = add nuw nsw i32 %i.031, 1 490d53b4beeSSjoerd Meijer %exitcond = icmp ne i32 %inc15, 9 491d53b4beeSSjoerd Meijer br i1 %exitcond, label %for.body5, label %for.end16 492d53b4beeSSjoerd Meijer 493d53b4beeSSjoerd Meijerfor.end16: ; preds = %lor.end 494d53b4beeSSjoerd Meijer %g.3.lcssa = phi i32 [ %g.3, %lor.end ] 495d53b4beeSSjoerd Meijer %inc18 = add nuw nsw i32 %f.033, 1 496d53b4beeSSjoerd Meijer %exitcond34 = icmp ne i32 %inc18, 7 497d53b4beeSSjoerd Meijer br i1 %exitcond34, label %for.body, label %for.end19 498d53b4beeSSjoerd Meijer 499d53b4beeSSjoerd Meijerfor.end19: ; preds = %for.end16 500d53b4beeSSjoerd Meijer ret i32 undef 501d53b4beeSSjoerd Meijer} 502706ead0eSSjoerd Meijer 503706ead0eSSjoerd Meijer; A 3d loop corresponding to: 504706ead0eSSjoerd Meijer; 505706ead0eSSjoerd Meijer; for (int i = 0; i < N; ++i) 506706ead0eSSjoerd Meijer; for (int j = 0; j < N; ++j) 507706ead0eSSjoerd Meijer; for (int k = 0; k < N; ++k) 508706ead0eSSjoerd Meijer; f(&A[i + N * (j + N * k)]); 509706ead0eSSjoerd Meijer; 510*2d69827cSNikita Popovdefine void @d3_1(ptr %A, i32 %N) { 511706ead0eSSjoerd Meijerentry: 512706ead0eSSjoerd Meijer %cmp35 = icmp sgt i32 %N, 0 513706ead0eSSjoerd Meijer br i1 %cmp35, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 514706ead0eSSjoerd Meijer 515706ead0eSSjoerd Meijerfor.cond1.preheader.lr.ph: 516706ead0eSSjoerd Meijer br label %for.cond1.preheader.us 517706ead0eSSjoerd Meijer 518706ead0eSSjoerd Meijerfor.cond1.preheader.us: 519706ead0eSSjoerd Meijer %i.036.us = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc15.us, %for.cond1.for.cond.cleanup3_crit_edge.us ] 520706ead0eSSjoerd Meijer br i1 true, label %for.cond5.preheader.us.us.preheader, label %for.cond5.preheader.us52.preheader 521706ead0eSSjoerd Meijer 522706ead0eSSjoerd Meijerfor.cond5.preheader.us52.preheader: 523706ead0eSSjoerd Meijer br label %for.cond5.preheader.us52 524706ead0eSSjoerd Meijer 525706ead0eSSjoerd Meijerfor.cond5.preheader.us.us.preheader: 526706ead0eSSjoerd Meijer br label %for.cond5.preheader.us.us 527706ead0eSSjoerd Meijer 528706ead0eSSjoerd Meijerfor.cond5.preheader.us52: 529706ead0eSSjoerd Meijer br i1 false, label %for.cond5.preheader.us52, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit58 530706ead0eSSjoerd Meijer 531706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit: 532706ead0eSSjoerd Meijer br label %for.cond1.for.cond.cleanup3_crit_edge.us 533706ead0eSSjoerd Meijer 534706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit58: 535706ead0eSSjoerd Meijer br label %for.cond1.for.cond.cleanup3_crit_edge.us 536706ead0eSSjoerd Meijer 537706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us: 538706ead0eSSjoerd Meijer %inc15.us = add nuw nsw i32 %i.036.us, 1 539706ead0eSSjoerd Meijer %cmp.us = icmp slt i32 %inc15.us, %N 540706ead0eSSjoerd Meijer br i1 %cmp.us, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit 541706ead0eSSjoerd Meijer 542706ead0eSSjoerd Meijerfor.cond5.preheader.us.us: 543706ead0eSSjoerd Meijer %j.033.us.us = phi i32 [ %inc12.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.cond5.preheader.us.us.preheader ] 544706ead0eSSjoerd Meijer br label %for.body8.us.us 545706ead0eSSjoerd Meijer 546706ead0eSSjoerd Meijerfor.cond5.for.cond.cleanup7_crit_edge.us.us: 547706ead0eSSjoerd Meijer %inc12.us.us = add nuw nsw i32 %j.033.us.us, 1 548706ead0eSSjoerd Meijer %cmp2.us.us = icmp slt i32 %inc12.us.us, %N 549706ead0eSSjoerd Meijer br i1 %cmp2.us.us, label %for.cond5.preheader.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit 550706ead0eSSjoerd Meijer 551706ead0eSSjoerd Meijerfor.body8.us.us: 552706ead0eSSjoerd Meijer %k.031.us.us = phi i32 [ 0, %for.cond5.preheader.us.us ], [ %inc.us.us, %for.body8.us.us ] 553706ead0eSSjoerd Meijer %mul.us.us = mul nsw i32 %k.031.us.us, %N 554706ead0eSSjoerd Meijer %add.us.us = add nsw i32 %mul.us.us, %j.033.us.us 555706ead0eSSjoerd Meijer %mul9.us.us = mul nsw i32 %add.us.us, %N 556706ead0eSSjoerd Meijer %add10.us.us = add nsw i32 %mul9.us.us, %i.036.us 557706ead0eSSjoerd Meijer %idxprom.us.us = sext i32 %add10.us.us to i64 558055fb779SNikita Popov %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us 559055fb779SNikita Popov tail call void @f(ptr %arrayidx.us.us) #2 560706ead0eSSjoerd Meijer %inc.us.us = add nuw nsw i32 %k.031.us.us, 1 561706ead0eSSjoerd Meijer %cmp6.us.us = icmp slt i32 %inc.us.us, %N 562706ead0eSSjoerd Meijer br i1 %cmp6.us.us, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us 563706ead0eSSjoerd Meijer 564706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit: 565706ead0eSSjoerd Meijer br label %for.cond.cleanup 566706ead0eSSjoerd Meijer 567706ead0eSSjoerd Meijerfor.cond.cleanup: 568706ead0eSSjoerd Meijer ret void 569706ead0eSSjoerd Meijer} 570706ead0eSSjoerd Meijer 571706ead0eSSjoerd Meijer; A 3d loop corresponding to: 572706ead0eSSjoerd Meijer; 573706ead0eSSjoerd Meijer; for (int i = 0; i < N; ++i) 574706ead0eSSjoerd Meijer; for (int j = 0; j < M; ++j) { 575706ead0eSSjoerd Meijer; A[i*M+j] = 0; 576706ead0eSSjoerd Meijer; for (int k = 0; k < N; ++k) 577706ead0eSSjoerd Meijer; g(); 578706ead0eSSjoerd Meijer; } 579706ead0eSSjoerd Meijer; 580*2d69827cSNikita Popovdefine void @d3_3(ptr nocapture %A, i32 %N, i32 %M) { 581706ead0eSSjoerd Meijerentry: 582706ead0eSSjoerd Meijer %cmp29 = icmp sgt i32 %N, 0 583706ead0eSSjoerd Meijer br i1 %cmp29, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 584706ead0eSSjoerd Meijer 585706ead0eSSjoerd Meijerfor.cond1.preheader.lr.ph: 586706ead0eSSjoerd Meijer %cmp227 = icmp sgt i32 %M, 0 587706ead0eSSjoerd Meijer br i1 %cmp227, label %for.cond1.preheader.us.preheader, label %for.cond1.preheader.preheader 588706ead0eSSjoerd Meijer 589706ead0eSSjoerd Meijerfor.cond1.preheader.preheader: 590706ead0eSSjoerd Meijer br label %for.cond.cleanup.loopexit49 591706ead0eSSjoerd Meijer 592706ead0eSSjoerd Meijerfor.cond1.preheader.us.preheader: 593706ead0eSSjoerd Meijer br label %for.cond1.preheader.us 594706ead0eSSjoerd Meijer 595706ead0eSSjoerd Meijerfor.cond1.preheader.us: 596706ead0eSSjoerd Meijer %i.030.us = phi i32 [ %inc13.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %for.cond1.preheader.us.preheader ] 597706ead0eSSjoerd Meijer %mul.us = mul nsw i32 %i.030.us, %M 598706ead0eSSjoerd Meijer br i1 true, label %for.body4.us.us.preheader, label %for.body4.us32.preheader 599706ead0eSSjoerd Meijer 600706ead0eSSjoerd Meijerfor.body4.us32.preheader: 601706ead0eSSjoerd Meijer br label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit48 602706ead0eSSjoerd Meijer 603706ead0eSSjoerd Meijerfor.body4.us.us.preheader: 604706ead0eSSjoerd Meijer br label %for.body4.us.us 605706ead0eSSjoerd Meijer 606706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit: 607706ead0eSSjoerd Meijer br label %for.cond1.for.cond.cleanup3_crit_edge.us 608706ead0eSSjoerd Meijer 609706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us.loopexit48: 610706ead0eSSjoerd Meijer br label %for.cond1.for.cond.cleanup3_crit_edge.us 611706ead0eSSjoerd Meijer 612706ead0eSSjoerd Meijerfor.cond1.for.cond.cleanup3_crit_edge.us: 613706ead0eSSjoerd Meijer %inc13.us = add nuw nsw i32 %i.030.us, 1 614706ead0eSSjoerd Meijer %exitcond51 = icmp ne i32 %inc13.us, %N 615706ead0eSSjoerd Meijer br i1 %exitcond51, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit 616706ead0eSSjoerd Meijer 617706ead0eSSjoerd Meijerfor.body4.us.us: 618706ead0eSSjoerd Meijer %j.028.us.us = phi i32 [ %inc10.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.body4.us.us.preheader ] 619706ead0eSSjoerd Meijer %add.us.us = add nsw i32 %j.028.us.us, %mul.us 620706ead0eSSjoerd Meijer %idxprom.us.us = sext i32 %add.us.us to i64 621055fb779SNikita Popov %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us 622055fb779SNikita Popov store i32 0, ptr %arrayidx.us.us, align 4 623706ead0eSSjoerd Meijer br label %for.body8.us.us 624706ead0eSSjoerd Meijer 625706ead0eSSjoerd Meijerfor.cond5.for.cond.cleanup7_crit_edge.us.us: 626706ead0eSSjoerd Meijer %inc10.us.us = add nuw nsw i32 %j.028.us.us, 1 627706ead0eSSjoerd Meijer %exitcond50 = icmp ne i32 %inc10.us.us, %M 628706ead0eSSjoerd Meijer br i1 %exitcond50, label %for.body4.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit 629706ead0eSSjoerd Meijer 630706ead0eSSjoerd Meijerfor.body8.us.us: 631706ead0eSSjoerd Meijer %k.026.us.us = phi i32 [ 0, %for.body4.us.us ], [ %inc.us.us, %for.body8.us.us ] 632055fb779SNikita Popov tail call void @g() #2 633706ead0eSSjoerd Meijer %inc.us.us = add nuw nsw i32 %k.026.us.us, 1 634706ead0eSSjoerd Meijer %exitcond = icmp ne i32 %inc.us.us, %N 635706ead0eSSjoerd Meijer br i1 %exitcond, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us 636706ead0eSSjoerd Meijer 637706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit: 638706ead0eSSjoerd Meijer br label %for.cond.cleanup 639706ead0eSSjoerd Meijer 640706ead0eSSjoerd Meijerfor.cond.cleanup.loopexit49: 641706ead0eSSjoerd Meijer br label %for.cond.cleanup 642706ead0eSSjoerd Meijer 643706ead0eSSjoerd Meijerfor.cond.cleanup: 644706ead0eSSjoerd Meijer ret void 645706ead0eSSjoerd Meijer} 646706ead0eSSjoerd Meijer 647bc43078fSSjoerd Meijer; Backedge-taken count is not predictable. 648bc43078fSSjoerd Meijer%struct.Limits = type { i16, i16 } 649055fb779SNikita Popovdefine void @backedge_count(ptr %lim) { 650bc43078fSSjoerd Meijerentry: 651055fb779SNikita Popov %M = getelementptr inbounds %struct.Limits, ptr %lim, i32 0, i32 1 652055fb779SNikita Popov %0 = load i16, ptr %lim, align 2 653bc43078fSSjoerd Meijer %cmp20 = icmp sgt i16 %0, 0 654bc43078fSSjoerd Meijer br i1 %cmp20, label %for.cond2.preheader.preheader, label %for.cond.cleanup 655bc43078fSSjoerd Meijer 656bc43078fSSjoerd Meijerfor.cond2.preheader.preheader: 657055fb779SNikita Popov %.pre = load i16, ptr %M, align 2 658bc43078fSSjoerd Meijer br label %for.cond2.preheader 659bc43078fSSjoerd Meijer 660bc43078fSSjoerd Meijerfor.cond2.preheader: 661bc43078fSSjoerd Meijer %1 = phi i16 [ %3, %for.cond.cleanup6 ], [ %0, %for.cond2.preheader.preheader ] 662bc43078fSSjoerd Meijer %2 = phi i16 [ %4, %for.cond.cleanup6 ], [ %.pre, %for.cond2.preheader.preheader ] 663bc43078fSSjoerd Meijer %i.021 = phi i32 [ %inc9, %for.cond.cleanup6 ], [ 0, %for.cond2.preheader.preheader ] 664bc43078fSSjoerd Meijer %cmp417 = icmp sgt i16 %2, 0 665bc43078fSSjoerd Meijer br i1 %cmp417, label %for.body7, label %for.cond.cleanup6 666bc43078fSSjoerd Meijer 667bc43078fSSjoerd Meijerfor.cond.cleanup: 668bc43078fSSjoerd Meijer ret void 669bc43078fSSjoerd Meijer 670bc43078fSSjoerd Meijerfor.cond.cleanup6.loopexit: 671055fb779SNikita Popov %.pre22 = load i16, ptr %lim, align 2 672bc43078fSSjoerd Meijer br label %for.cond.cleanup6 673bc43078fSSjoerd Meijer 674bc43078fSSjoerd Meijerfor.cond.cleanup6: 675bc43078fSSjoerd Meijer %3 = phi i16 [ %.pre22, %for.cond.cleanup6.loopexit ], [ %1, %for.cond2.preheader ] 676bc43078fSSjoerd Meijer %4 = phi i16 [ %5, %for.cond.cleanup6.loopexit ], [ %2, %for.cond2.preheader ] 677bc43078fSSjoerd Meijer %inc9 = add nuw nsw i32 %i.021, 1 678bc43078fSSjoerd Meijer %conv = sext i16 %3 to i32 679bc43078fSSjoerd Meijer %cmp = icmp slt i32 %inc9, %conv 680bc43078fSSjoerd Meijer br i1 %cmp, label %for.cond2.preheader, label %for.cond.cleanup 681bc43078fSSjoerd Meijer 682bc43078fSSjoerd Meijerfor.body7: 683bc43078fSSjoerd Meijer %j.018 = phi i32 [ %inc, %for.body7 ], [ 0, %for.cond2.preheader ] 684055fb779SNikita Popov tail call void @g() 685bc43078fSSjoerd Meijer %inc = add nuw nsw i32 %j.018, 1 686055fb779SNikita Popov %5 = load i16, ptr %M, align 2 687bc43078fSSjoerd Meijer %conv3 = sext i16 %5 to i32 688bc43078fSSjoerd Meijer %cmp4 = icmp slt i32 %inc, %conv3 689bc43078fSSjoerd Meijer br i1 %cmp4, label %for.body7, label %for.cond.cleanup6.loopexit 690bc43078fSSjoerd Meijer} 691bc43078fSSjoerd Meijer 692f117ed54SRosie Sumpter; Invalid trip count 693055fb779SNikita Popovdefine void @invalid_tripCount(ptr %a, i32 %b, i32 %c, i32 %initial-mutations, i32 %statemutations) { 694f117ed54SRosie Sumpterentry: 695f117ed54SRosie Sumpter %iszero = icmp eq i32 %b, 0 696f117ed54SRosie Sumpter br i1 %iszero, label %for.empty, label %for.loopinit 697f117ed54SRosie Sumpterfor.loopinit: 698f117ed54SRosie Sumpter br label %for.loopbody.outer 699f117ed54SRosie Sumpterfor.loopbody.outer: 700f117ed54SRosie Sumpter %for.count.ph = phi i32 [ %c, %for.refetch ], [ %b, %for.loopinit ] 701f117ed54SRosie Sumpter br label %for.loopbody 702f117ed54SRosie Sumpterfor.loopbody: 703f117ed54SRosie Sumpter %for.index = phi i32 [ %1, %for.notmutated ], [ 0, %for.loopbody.outer ] 704f117ed54SRosie Sumpter %0 = icmp eq i32 %statemutations, %initial-mutations 705f117ed54SRosie Sumpter br i1 %0, label %for.notmutated, label %for.mutated 706f117ed54SRosie Sumpterfor.mutated: 707055fb779SNikita Popov call void @objc_enumerationMutation(ptr %a) 708f117ed54SRosie Sumpter br label %for.notmutated 709f117ed54SRosie Sumpterfor.notmutated: 710f117ed54SRosie Sumpter %1 = add nuw i32 %for.index, 1 711f117ed54SRosie Sumpter %2 = icmp ult i32 %1, %for.count.ph 712f117ed54SRosie Sumpter br i1 %2, label %for.loopbody, label %for.refetch 713f117ed54SRosie Sumpterfor.refetch: 714f117ed54SRosie Sumpter %3 = icmp eq i32 %c, 0 715f117ed54SRosie Sumpter br i1 %3, label %for.empty.loopexit, label %for.loopbody.outer 716f117ed54SRosie Sumpterfor.empty.loopexit: 717f117ed54SRosie Sumpter br label %for.empty 718f117ed54SRosie Sumpterfor.empty: 719f117ed54SRosie Sumpter ret void 720f117ed54SRosie Sumpter} 721f117ed54SRosie Sumpter 722055fb779SNikita Popovdeclare void @objc_enumerationMutation(ptr) 723055fb779SNikita Popovdeclare dso_local void @f(ptr) 724706ead0eSSjoerd Meijerdeclare dso_local void @g(...) 725