1 ; RUN: opt -S -licm -loop-unroll < %s 2 ; 3 ; This test contains a carefully rotated set of three nested loops. The middle 4 ; loop can be unrolled leaving one copy of the inner loop inside the outer 5 ; loop. Because of how LICM works, when this middle loop is unrolled and 6 ; removed, its alias set tracker is destroyed and no longer available when LICM 7 ; runs on the outer loop. 8 9 define void @f() { 10 entry: 11 br label %l1 12 13 l2.l1.loopexit_crit_edge: 14 br label %l1.loopexit 15 16 l1.loopexit: 17 br label %l1.backedge 18 19 l1: 20 br i1 undef, label %l1.backedge, label %l2.preheader 21 22 l1.backedge: 23 br label %l1 24 25 l2.preheader: 26 br i1 true, label %l1.loopexit, label %l3.preheader.lr.ph 27 28 l3.preheader.lr.ph: 29 br label %l3.preheader 30 31 l2.loopexit: 32 br i1 true, label %l2.l1.loopexit_crit_edge, label %l3.preheader 33 34 l3.preheader: 35 br label %l3 36 37 l3: 38 br i1 true, label %l3, label %l2.loopexit 39 } 40