| Jingyue Wu | 177a815 | 2015-03-26 16:49:24 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -slsr -gvn -dce -S | FileCheck %s | 
|  | 2 |  | 
|  | 3 | target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" | 
|  | 4 |  | 
|  | 5 | define i32 @slsr_gep(i32* %input, i64 %s) { | 
|  | 6 | ; CHECK-LABEL: @slsr_gep( | 
|  | 7 | ; v0 = input[0]; | 
|  | 8 | %p0 = getelementptr inbounds i32, i32* %input, i64 0 | 
|  | 9 | %v0 = load i32, i32* %p0 | 
|  | 10 |  | 
|  | 11 | ; v1 = input[s]; | 
|  | 12 | %p1 = getelementptr inbounds i32, i32* %input, i64 %s | 
|  | 13 | ; CHECK: %p1 = getelementptr inbounds i32, i32* %input, i64 %s | 
|  | 14 | %v1 = load i32, i32* %p1 | 
|  | 15 |  | 
|  | 16 | ; v2 = input[s * 2]; | 
| Jingyue Wu | 96d7400 | 2015-04-06 17:15:48 +0000 | [diff] [blame^] | 17 | %s2 = shl nsw i64 %s, 1 | 
| Jingyue Wu | 177a815 | 2015-03-26 16:49:24 +0000 | [diff] [blame] | 18 | %p2 = getelementptr inbounds i32, i32* %input, i64 %s2 | 
|  | 19 | ; CHECK: %p2 = getelementptr inbounds i32, i32* %p1, i64 %s | 
|  | 20 | %v2 = load i32, i32* %p2 | 
|  | 21 |  | 
|  | 22 | ; return v0 + v1 + v2; | 
|  | 23 | %1 = add i32 %v0, %v1 | 
|  | 24 | %2 = add i32 %1, %v2 | 
|  | 25 | ret i32 %2 | 
|  | 26 | } | 
|  | 27 |  | 
|  | 28 | define i32 @slsr_gep_sext(i32* %input, i32 %s) { | 
|  | 29 | ; CHECK-LABEL: @slsr_gep_sext( | 
|  | 30 | ; v0 = input[0]; | 
|  | 31 | %p0 = getelementptr inbounds i32, i32* %input, i64 0 | 
|  | 32 | %v0 = load i32, i32* %p0 | 
|  | 33 |  | 
|  | 34 | ; v1 = input[(long)s]; | 
|  | 35 | %t = sext i32 %s to i64 | 
|  | 36 | %p1 = getelementptr inbounds i32, i32* %input, i64 %t | 
|  | 37 | ; CHECK: %p1 = getelementptr inbounds i32, i32* %input, i64 %t | 
|  | 38 | %v1 = load i32, i32* %p1 | 
|  | 39 |  | 
|  | 40 | ; v2 = input[(long)(s * 2)]; | 
| Jingyue Wu | 96d7400 | 2015-04-06 17:15:48 +0000 | [diff] [blame^] | 41 | %s2 = shl nsw i32 %s, 1 | 
| Jingyue Wu | 177a815 | 2015-03-26 16:49:24 +0000 | [diff] [blame] | 42 | %t2 = sext i32 %s2 to i64 | 
|  | 43 | %p2 = getelementptr inbounds i32, i32* %input, i64 %t2 | 
|  | 44 | ; CHECK: %p2 = getelementptr inbounds i32, i32* %p1, i64 %t | 
|  | 45 | %v2 = load i32, i32* %p2 | 
|  | 46 |  | 
|  | 47 | ; return v0 + v1 + v2; | 
|  | 48 | %1 = add i32 %v0, %v1 | 
|  | 49 | %2 = add i32 %1, %v2 | 
|  | 50 | ret i32 %2 | 
|  | 51 | } | 
|  | 52 |  | 
|  | 53 | define i32 @slsr_gep_2d([10 x [5 x i32]]* %input, i64 %s, i64 %t) { | 
|  | 54 | ; CHECK-LABEL: @slsr_gep_2d( | 
|  | 55 | ; v0 = input[s][t]; | 
|  | 56 | %p0 = getelementptr inbounds [10 x [5 x i32]], [10 x [5 x i32]]* %input, i64 0, i64 %s, i64 %t | 
|  | 57 | %v0 = load i32, i32* %p0 | 
|  | 58 |  | 
|  | 59 | ; v1 = input[s * 2][t]; | 
| Jingyue Wu | 96d7400 | 2015-04-06 17:15:48 +0000 | [diff] [blame^] | 60 | %s2 = shl nsw i64 %s, 1 | 
| Jingyue Wu | 177a815 | 2015-03-26 16:49:24 +0000 | [diff] [blame] | 61 | ; CHECK: [[BUMP:%[a-zA-Z0-9]+]] = mul i64 %s, 5 | 
|  | 62 | %p1 = getelementptr inbounds [10 x [5 x i32]], [10 x [5 x i32]]* %input, i64 0, i64 %s2, i64 %t | 
|  | 63 | ; CHECK: %p1 = getelementptr inbounds i32, i32* %p0, i64 [[BUMP]] | 
|  | 64 | %v1 = load i32, i32* %p1 | 
|  | 65 |  | 
|  | 66 | ; v2 = input[s * 3][t]; | 
|  | 67 | %s3 = mul nsw i64 %s, 3 | 
|  | 68 | %p2 = getelementptr inbounds [10 x [5 x i32]], [10 x [5 x i32]]* %input, i64 0, i64 %s3, i64 %t | 
|  | 69 | ; CHECK: %p2 = getelementptr inbounds i32, i32* %p1, i64 [[BUMP]] | 
|  | 70 | %v2 = load i32, i32* %p2 | 
|  | 71 |  | 
|  | 72 | ; return v0 + v1 + v2; | 
|  | 73 | %1 = add i32 %v0, %v1 | 
|  | 74 | %2 = add i32 %1, %v2 | 
|  | 75 | ret i32 %2 | 
|  | 76 | } | 
|  | 77 |  | 
|  | 78 | %struct.S = type <{ i64, i32 }> | 
|  | 79 |  | 
|  | 80 | ; In this case, the bump | 
|  | 81 | ;     = (char *)&input[s * 2][t].f1 - (char *)&input[s][t].f1 | 
|  | 82 | ;     = 60 * s | 
|  | 83 | ; which may not be divisible by typeof(input[s][t].f1) = 8. Therefore, we | 
|  | 84 | ; rewrite the candidates using byte offset instead of index offset as in | 
|  | 85 | ; @slsr_gep_2d. | 
|  | 86 | define i64 @slsr_gep_uglygep([10 x [5 x %struct.S]]* %input, i64 %s, i64 %t) { | 
|  | 87 | ; CHECK-LABEL: @slsr_gep_uglygep( | 
|  | 88 | ; v0 = input[s][t].f1; | 
|  | 89 | %p0 = getelementptr inbounds [10 x [5 x %struct.S]], [10 x [5 x %struct.S]]* %input, i64 0, i64 %s, i64 %t, i32 0 | 
|  | 90 | %v0 = load i64, i64* %p0 | 
|  | 91 |  | 
|  | 92 | ; v1 = input[s * 2][t].f1; | 
| Jingyue Wu | 96d7400 | 2015-04-06 17:15:48 +0000 | [diff] [blame^] | 93 | %s2 = shl nsw i64 %s, 1 | 
| Jingyue Wu | 177a815 | 2015-03-26 16:49:24 +0000 | [diff] [blame] | 94 | ; CHECK: [[BUMP:%[a-zA-Z0-9]+]] = mul i64 %s, 60 | 
|  | 95 | %p1 = getelementptr inbounds [10 x [5 x %struct.S]], [10 x [5 x %struct.S]]* %input, i64 0, i64 %s2, i64 %t, i32 0 | 
|  | 96 | ; CHECK: getelementptr inbounds i8, i8* %{{[0-9]+}}, i64 [[BUMP]] | 
|  | 97 | %v1 = load i64, i64* %p1 | 
|  | 98 |  | 
|  | 99 | ; v2 = input[s * 3][t].f1; | 
|  | 100 | %s3 = mul nsw i64 %s, 3 | 
|  | 101 | %p2 = getelementptr inbounds [10 x [5 x %struct.S]], [10 x [5 x %struct.S]]* %input, i64 0, i64 %s3, i64 %t, i32 0 | 
|  | 102 | ; CHECK: getelementptr inbounds i8, i8* %{{[0-9]+}}, i64 [[BUMP]] | 
|  | 103 | %v2 = load i64, i64* %p2 | 
|  | 104 |  | 
|  | 105 | ; return v0 + v1 + v2; | 
|  | 106 | %1 = add i64 %v0, %v1 | 
|  | 107 | %2 = add i64 %1, %v2 | 
|  | 108 | ret i64 %2 | 
|  | 109 | } | 
| Jingyue Wu | 99a6bed | 2015-04-02 21:18:32 +0000 | [diff] [blame] | 110 |  | 
|  | 111 | define i32 @slsr_out_of_bounds_gep(i32* %input, i32 %s) { | 
|  | 112 | ; CHECK-LABEL: @slsr_out_of_bounds_gep( | 
|  | 113 | ; v0 = input[0]; | 
|  | 114 | %p0 = getelementptr i32, i32* %input, i64 0 | 
|  | 115 | %v0 = load i32, i32* %p0 | 
|  | 116 |  | 
|  | 117 | ; v1 = input[(long)s]; | 
|  | 118 | %t = sext i32 %s to i64 | 
|  | 119 | %p1 = getelementptr i32, i32* %input, i64 %t | 
|  | 120 | ; CHECK: %p1 = getelementptr i32, i32* %input, i64 %t | 
|  | 121 | %v1 = load i32, i32* %p1 | 
|  | 122 |  | 
|  | 123 | ; v2 = input[(long)(s * 2)]; | 
| Jingyue Wu | 96d7400 | 2015-04-06 17:15:48 +0000 | [diff] [blame^] | 124 | %s2 = shl nsw i32 %s, 1 | 
| Jingyue Wu | 99a6bed | 2015-04-02 21:18:32 +0000 | [diff] [blame] | 125 | %t2 = sext i32 %s2 to i64 | 
|  | 126 | %p2 = getelementptr i32, i32* %input, i64 %t2 | 
|  | 127 | ; CHECK: %p2 = getelementptr i32, i32* %p1, i64 %t | 
|  | 128 | %v2 = load i32, i32* %p2 | 
|  | 129 |  | 
|  | 130 | ; return v0 + v1 + v2; | 
|  | 131 | %1 = add i32 %v0, %v1 | 
|  | 132 | %2 = add i32 %1, %v2 | 
|  | 133 | ret i32 %2 | 
|  | 134 | } |