New testcase, distilled from PR324
[oota-llvm.git] / test / Transforms / InstCombine / getelementptr.ll
1 ; The %A getelementptr instruction should be eliminated here
2
3 ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep getelementptr | not grep '%A '
4
5 %Global = constant [10 x sbyte] c"helloworld"
6
7 implementation
8
9 int *%foo1(int* %I) { ; Test noop elimination
10         %A = getelementptr int* %I, long 0
11         ret int * %A
12 }
13
14 int* %foo2(int* %I) {  ; Test noop elimination
15         %A = getelementptr int* %I
16         ret int* %A
17 }
18 int* %foo3(int * %I) { ; Test that two array indexing geps fold
19         %A = getelementptr int* %I, long 17
20         %B = getelementptr int* %A, long 4
21         ret int* %B
22 }
23
24 int* %foo4({int} *%I) { ; Test that two getelementptr insts fold
25         %A = getelementptr {int}* %I, long 1
26         %B = getelementptr {int}* %A, long 0, ubyte 0
27         ret int* %B
28 }
29
30 sbyte * %foo5() {
31         ; This should be turned into a constexpr instead of being an instruction
32         %A = getelementptr [10 x sbyte]* %Global, long 0, long 4
33         ret sbyte* %A
34 }
35
36 int* %foo6() {
37         %M = malloc [4 x int]
38         %A = getelementptr [4 x int]* %M, long 0, long 0
39         %B = getelementptr int* %A, long 2
40         ret int* %B
41 }
42
43 int* %foo7(int* %I, long %C, long %D) {
44         %A = getelementptr int* %I, long %C
45         %B = getelementptr int* %A, long %D
46         ret int* %B
47 }
48
49 sbyte* %foo8([10 x int]* %X) {
50         %A = getelementptr [10 x int]* %X, long 0, long 0   ;; Fold into the cast.
51         %B = cast int* %A to sbyte*
52         ret sbyte * %B
53 }