Chris Lattner | 8d56cdd | 2005-08-10 02:06:35 +0000 | [diff] [blame^] | 1 | ; Loop Simplify should turn phi nodes like X = phi [X, Y] into just Y, eliminating them. |
| 2 | ; RUN: llvm-as < %s | opt -loopsimplify | llvm-dis | grep phi | wc -l | grep 6 |
| 3 | |
| 4 | %A = weak global [3000000 x int] zeroinitializer ; <[3000000 x int]*> [#uses=1] |
| 5 | %B = weak global [20000 x int] zeroinitializer ; <[20000 x int]*> [#uses=1] |
| 6 | %C = weak global [100 x int] zeroinitializer ; <[100 x int]*> [#uses=1] |
| 7 | %Z = weak global int 0 ; <int*> [#uses=2] |
| 8 | |
| 9 | implementation ; Functions: |
| 10 | |
| 11 | int %main() { |
| 12 | entry: |
| 13 | tail call void %__main( ) |
| 14 | br label %loopentry.1 |
| 15 | |
| 16 | loopentry.1: ; preds = %loopexit.1, %entry |
| 17 | %indvar20 = phi uint [ 0, %entry ], [ %indvar.next21, %loopexit.1 ] ; <uint> [#uses=1] |
| 18 | %a.1 = phi int* [ getelementptr ([3000000 x int]* %A, int 0, int 0), %entry ], [ %inc.0, %loopexit.1 ] ; <int*> [#uses=1] |
| 19 | br label %no_exit.2 |
| 20 | |
| 21 | no_exit.2: ; preds = %loopexit.2, %no_exit.2, %loopentry.1 |
| 22 | %a.0.4.ph = phi int* [ %a.1, %loopentry.1 ], [ %inc.0, %loopexit.2 ], [ %a.0.4.ph, %no_exit.2 ] ; <int*> [#uses=3] |
| 23 | %b.1.4.ph = phi int* [ getelementptr ([20000 x int]* %B, int 0, int 0), %loopentry.1 ], [ %inc.1, %loopexit.2 ], [ %b.1.4.ph, %no_exit.2 ] ; <int*> [#uses=3] |
| 24 | %indvar17 = phi uint [ 0, %loopentry.1 ], [ %indvar.next18, %loopexit.2 ], [ %indvar17, %no_exit.2 ] ; <uint> [#uses=2] |
| 25 | %indvar = phi uint [ %indvar.next, %no_exit.2 ], [ 0, %loopexit.2 ], [ 0, %loopentry.1 ] ; <uint> [#uses=5] |
| 26 | %b.1.4.rec = cast uint %indvar to int ; <int> [#uses=1] |
| 27 | %c.2.4 = getelementptr [100 x int]* %C, int 0, uint %indvar ; <int*> [#uses=1] |
| 28 | %a.0.4 = getelementptr int* %a.0.4.ph, uint %indvar ; <int*> [#uses=1] |
| 29 | %b.1.4 = getelementptr int* %b.1.4.ph, uint %indvar ; <int*> [#uses=1] |
| 30 | %inc.0.rec = add int %b.1.4.rec, 1 ; <int> [#uses=2] |
| 31 | %inc.0 = getelementptr int* %a.0.4.ph, int %inc.0.rec ; <int*> [#uses=2] |
| 32 | %tmp.13 = load int* %a.0.4 ; <int> [#uses=1] |
| 33 | %inc.1 = getelementptr int* %b.1.4.ph, int %inc.0.rec ; <int*> [#uses=1] |
| 34 | %tmp.15 = load int* %b.1.4 ; <int> [#uses=1] |
| 35 | %tmp.18 = load int* %c.2.4 ; <int> [#uses=1] |
| 36 | %tmp.16 = mul int %tmp.15, %tmp.13 ; <int> [#uses=1] |
| 37 | %tmp.19 = mul int %tmp.16, %tmp.18 ; <int> [#uses=1] |
| 38 | %tmp.20 = load int* %Z ; <int> [#uses=1] |
| 39 | %tmp.21 = add int %tmp.19, %tmp.20 ; <int> [#uses=1] |
| 40 | store int %tmp.21, int* %Z |
| 41 | %indvar.next = add uint %indvar, 1 ; <uint> [#uses=2] |
| 42 | %exitcond = seteq uint %indvar.next, 100 ; <bool> [#uses=1] |
| 43 | br bool %exitcond, label %loopexit.2, label %no_exit.2 |
| 44 | |
| 45 | loopexit.2: ; preds = %no_exit.2 |
| 46 | %indvar.next18 = add uint %indvar17, 1 ; <uint> [#uses=2] |
| 47 | %exitcond19 = seteq uint %indvar.next18, 200 ; <bool> [#uses=1] |
| 48 | br bool %exitcond19, label %loopexit.1, label %no_exit.2 |
| 49 | |
| 50 | loopexit.1: ; preds = %loopexit.2 |
| 51 | %indvar.next21 = add uint %indvar20, 1 ; <uint> [#uses=2] |
| 52 | %exitcond22 = seteq uint %indvar.next21, 300 ; <bool> [#uses=1] |
| 53 | br bool %exitcond22, label %return, label %loopentry.1 |
| 54 | |
| 55 | return: ; preds = %loopexit.1 |
| 56 | ret int undef |
| 57 | } |
| 58 | |
| 59 | declare void %__main() |