|
2 | 2 | ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
3 | 3 |
|
4 | 4 | @glob = internal global [10 x [10 x [10 x i32]]] zeroinitializer
|
| 5 | +@glob_i8 = internal global [10 x [10 x [10 x i8]]] zeroinitializer |
| 6 | +@glob_i16 = internal global [10 x [10 x [10 x i16]]] zeroinitializer |
| 7 | +@glob_i64 = internal global [10 x [10 x [10 x i64]]] zeroinitializer |
5 | 8 |
|
6 | 9 | define ptr @x12(i64 %x) {
|
7 | 10 | ; CHECK-LABEL: define ptr @x12(
|
@@ -76,3 +79,61 @@ entry:
|
76 | 79 | %c = add i32 %a, %b
|
77 | 80 | ret i32 %c
|
78 | 81 | }
|
| 82 | + |
| 83 | +define i8* @flat_gep8(i64 %x) { |
| 84 | +; CHECK-LABEL: define ptr @flat_gep8( |
| 85 | +; CHECK-SAME: i64 [[X:%.*]]) { |
| 86 | +; CHECK-NEXT: entry: |
| 87 | +; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 100 |
| 88 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @glob_i8, i64 [[GEP_IDX]] |
| 89 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 35 |
| 90 | +; CHECK-NEXT: ret ptr [[GEP]] |
| 91 | +; |
| 92 | +entry: |
| 93 | + %gep = getelementptr [10 x [10 x [10 x i8]]], ptr @glob_i8, i64 0, i64 %x, i64 3, i64 5 |
| 94 | + ret ptr %gep |
| 95 | +} |
| 96 | + |
| 97 | +define i16* @flat_gep16(i64 %x) { |
| 98 | +; CHECK-LABEL: define ptr @flat_gep16( |
| 99 | +; CHECK-SAME: i64 [[X:%.*]]) { |
| 100 | +; CHECK-NEXT: entry: |
| 101 | +; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 200 |
| 102 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @glob_i16, i64 [[GEP_IDX]] |
| 103 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 46 |
| 104 | +; CHECK-NEXT: ret ptr [[GEP]] |
| 105 | +; |
| 106 | +entry: |
| 107 | + %gep = getelementptr [10 x [10 x [10 x i16]]], ptr @glob_i16, i64 0, i64 %x, i64 2, i64 3 |
| 108 | + ret ptr %gep |
| 109 | +} |
| 110 | + |
| 111 | +define i32* @flat_gep(i64 %x) { |
| 112 | +; CHECK-LABEL: define ptr @flat_gep( |
| 113 | +; CHECK-SAME: i64 [[X:%.*]]) { |
| 114 | +; CHECK-NEXT: entry: |
| 115 | +; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 400 |
| 116 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @glob, i64 [[GEP_IDX]] |
| 117 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 100 |
| 118 | +; CHECK-NEXT: ret ptr [[GEP]] |
| 119 | +; |
| 120 | +entry: |
| 121 | + %gep = getelementptr [10 x [10 x [10 x i32]]], ptr @glob, i64 0, i64 %x, i64 2, i64 5 |
| 122 | + ret ptr %gep |
| 123 | +} |
| 124 | + |
| 125 | +define i64* @flat_gep64(i64 %x) { |
| 126 | +; CHECK-LABEL: define ptr @flat_gep64( |
| 127 | +; CHECK-SAME: i64 [[X:%.*]]) { |
| 128 | +; CHECK-NEXT: entry: |
| 129 | +; CHECK-NEXT: [[GEP_IDX:%.*]] = mul i64 [[X]], 800 |
| 130 | +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @glob_i64, i64 [[GEP_IDX]] |
| 131 | +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 288 |
| 132 | +; CHECK-NEXT: ret ptr [[GEP]] |
| 133 | +; |
| 134 | +entry: |
| 135 | + %gep = getelementptr [10 x [10 x [10 x i64]]], ptr @glob_i64, i64 0, i64 %x, i64 3, i64 6 |
| 136 | + ret ptr %gep |
| 137 | +} |
| 138 | + |
| 139 | + |
0 commit comments