new testcase
[oota-llvm.git] / test / Transforms / InstCombine / getelementptr.ll
1 ; The %A getelementptr instruction should be eliminated here
2
3 ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep -v '%B' | not grep getelementptr &&
4 ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep foo1
5
6 %Global = constant [10 x sbyte] c"helloworld"
7
8 implementation
9
10 int *%foo1(int* %I) { ; Test noop elimination
11         %A = getelementptr int* %I, long 0
12         ret int * %A
13 }
14
15 int* %foo2(int* %I) {  ; Test noop elimination
16         %A = getelementptr int* %I
17         ret int* %A
18 }
19 int* %foo3(int * %I) { ; Test that two array indexing geps fold
20         %A = getelementptr int* %I, long 17
21         %B = getelementptr int* %A, long 4
22         ret int* %B
23 }
24
25 int* %foo4({int} *%I) { ; Test that two getelementptr insts fold
26         %A = getelementptr {int}* %I, long 1
27         %B = getelementptr {int}* %A, long 0, uint 0
28         ret int* %B
29 }
30
31 void %foo5(sbyte %B) {
32         ; This should be turned into a constexpr instead of being an instruction
33         %A = getelementptr [10 x sbyte]* %Global, long 0, long 4
34         store sbyte %B, sbyte* %A
35         ret void
36 }
37
38 int* %foo6() {
39         %M = malloc [4 x int]
40         %A = getelementptr [4 x int]* %M, long 0, long 0
41         %B = getelementptr int* %A, long 2
42         ret int* %B
43 }
44
45 int* %foo7(int* %I, long %C, long %D) {
46         %A = getelementptr int* %I, long %C
47         %B = getelementptr int* %A, long %D
48         ret int* %B
49 }
50
51 sbyte* %foo8([10 x int]* %X) {
52         %A = getelementptr [10 x int]* %X, long 0, long 0   ;; Fold into the cast.
53         %B = cast int* %A to sbyte*
54         ret sbyte * %B
55 }
56
57 int %test9() {
58         %A = getelementptr {int, double}* null, int 0, uint 1
59         %B = cast double* %A to int
60         ret int %B
61 }
62
63 bool %test10({int, int} * %x, {int, int} * %y) {
64         %tmp.1 = getelementptr {int,int}* %x, int 0, uint 1
65         %tmp.3 = getelementptr {int,int}* %y, int 0, uint 1
66         %tmp.4 = seteq int* %tmp.1, %tmp.3    ;; seteq x, y
67         ret bool %tmp.4
68 }
69
70 bool %test11({int,int} *%X) {
71         %P = getelementptr {int,int}* %X, int 0, uint 0
72         %Q = seteq int* %P, null
73         ret bool %Q
74 }