Chris Lattner | 35e0a2c | 2002-02-11 23:44:06 +0000 | [diff] [blame] | 1 | ; The "bug" is in the level raising code, not correctly |
| 2 | ; raising an array reference. As generated, the code will work, but does |
| 3 | ; not correctly match the array type. In short, the code generated |
| 4 | ; corresponds to this: |
| 5 | ; |
| 6 | ; int Array[100][200]; |
| 7 | ; ... |
| 8 | ; Sum += Array[0][i*200+j]; |
| 9 | ; |
| 10 | ; which is out of range, because, although it is correctly accessing the |
| 11 | ; array, it does not match types correctly. LLI would pass it through fine, |
| 12 | ; if only the code looked like this: |
| 13 | ; |
| 14 | ; Sum += Array[i][j]; |
| 15 | ; |
| 16 | ; which is functionally identical, but matches the array bound correctly. |
| 17 | ; The fix is to have the -raise pass correctly convert it to the second |
| 18 | ; equivelent form. |
| 19 | ; |
Misha Brukman | edf4bab | 2003-09-16 15:29:54 +0000 | [diff] [blame] | 20 | ; RUN: llvm-as < %s | opt -q -raise > Output/%s.raised.bc |
Chris Lattner | 60c4583 | 2003-09-16 15:34:36 +0000 | [diff] [blame^] | 21 | ; RUN: lli -force-interpreter -array-checks < Output/%s.raised.bc |
Chris Lattner | 35e0a2c | 2002-02-11 23:44:06 +0000 | [diff] [blame] | 22 | ; |
| 23 | |
| 24 | implementation |
| 25 | |
| 26 | int "main"() |
| 27 | begin |
| 28 | bb0: ;[#uses=0] |
| 29 | %Array = alloca [100 x [200 x int]] ; <[100 x [200 x int]] *> [#uses=1] |
| 30 | %cast1032 = cast [100 x [200 x int]] * %Array to [200 x int] * ; <[200 x int] *> [#uses=1] |
| 31 | br label %bb1 |
| 32 | |
| 33 | bb1: ;[#uses=4] |
| 34 | %cond1033 = setgt long 0, 99 ; <bool> [#uses=1] |
| 35 | br bool %cond1033, label %bb5, label %bb2 |
| 36 | |
| 37 | bb2: ;[#uses=5] |
| 38 | %reg124 = phi double [ %reg130, %bb4 ], [ 0.000000e+00, %bb1 ] ; <double> [#uses=2] |
| 39 | %reg125 = phi int [ %reg131, %bb4 ], [ 0, %bb1 ] ; <int> [#uses=2] |
| 40 | %cast1043 = cast int %reg125 to int ; <int> [#uses=1] |
| 41 | %cast1038 = cast int %reg125 to uint ; <uint> [#uses=1] |
| 42 | %cond1034 = setgt long 0, 199 ; <bool> [#uses=1] |
| 43 | br bool %cond1034, label %bb4, label %bb3 |
| 44 | |
| 45 | bb3: ;[#uses=5] |
| 46 | %reg126 = phi double [ %reg128, %bb3 ], [ %reg124, %bb2 ] ; <double> [#uses=1] |
| 47 | %reg127 = phi int [ %reg129, %bb3 ], [ 0, %bb2 ] ; <int> [#uses=2] |
| 48 | %cast1042 = cast int %reg127 to int ; <int> [#uses=1] |
| 49 | %cast1039 = cast int %reg127 to uint ; <uint> [#uses=1] |
| 50 | %reg110 = mul uint %cast1038, 200 ; <uint> [#uses=1] |
| 51 | %reg111 = add uint %reg110, %cast1039 ; <uint> [#uses=1] |
| 52 | %reg113 = shl uint %reg111, ubyte 2 ; <uint> [#uses=1] |
| 53 | %cast115 = cast uint %reg113 to ulong ; <ulong> [#uses=1] |
Chris Lattner | 36b8645 | 2003-05-14 18:37:03 +0000 | [diff] [blame] | 54 | %cast1040 = cast [200 x int] * %cast1032 to ulong ; <sbyte *> [#uses=1] |
| 55 | %reg118 = add ulong %cast1040, %cast115 ; <sbyte *> [#uses=1] |
| 56 | %cast1041 = cast ulong %reg118 to int * ; <int *> [#uses=1] |
Chris Lattner | 35e0a2c | 2002-02-11 23:44:06 +0000 | [diff] [blame] | 57 | %reg120 = load int * %cast1041 ; <int> [#uses=1] |
| 58 | %cast119 = cast int %reg120 to double ; <double> [#uses=1] |
| 59 | %reg128 = add double %reg126, %cast119 ; <double> [#uses=2] |
| 60 | %reg129 = add int %cast1042, 1 ; <int> [#uses=2] |
| 61 | %cond1035 = setle int %reg129, 199 ; <bool> [#uses=1] |
| 62 | br bool %cond1035, label %bb3, label %bb4 |
| 63 | |
| 64 | bb4: ;[#uses=5] |
| 65 | %reg130 = phi double [ %reg128, %bb3 ], [ %reg124, %bb2 ] ; <double> [#uses=2] |
| 66 | %reg131 = add int %cast1043, 1 ; <int> [#uses=2] |
| 67 | %cond1036 = setle int %reg131, 99 ; <bool> [#uses=1] |
| 68 | br bool %cond1036, label %bb2, label %bb5 |
| 69 | |
| 70 | bb5: ;[#uses=2] |
| 71 | %reg132 = phi double [ %reg130, %bb4 ], [ 0.000000e+00, %bb1 ] ; <double> [#uses=1] |
| 72 | %RET = cast double %reg132 to int |
| 73 | ret int %RET |
| 74 | end |
| 75 | |