Use the llvm-upgrade program to upgrade llvm assembly.
[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
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, uint 0
27         ret int* %B
28 }
29
30 void %foo5(sbyte %B) {
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         store sbyte %B, sbyte* %A
34         ret void
35 }
36
37 int* %foo6() {
38         %M = malloc [4 x int]
39         %A = getelementptr [4 x int]* %M, long 0, long 0
40         %B = getelementptr int* %A, long 2
41         ret int* %B
42 }
43
44 int* %foo7(int* %I, long %C, long %D) {
45         %A = getelementptr int* %I, long %C
46         %B = getelementptr int* %A, long %D
47         ret int* %B
48 }
49
50 sbyte* %foo8([10 x int]* %X) {
51         %A = getelementptr [10 x int]* %X, long 0, long 0   ;; Fold into the cast.
52         %B = cast int* %A to sbyte*
53         ret sbyte * %B
54 }
55
56 int %test9() {
57         %A = getelementptr {int, double}* null, int 0, uint 1
58         %B = cast double* %A to int
59         ret int %B
60 }
61
62 bool %test10({int, int} * %x, {int, int} * %y) {
63         %tmp.1 = getelementptr {int,int}* %x, int 0, uint 1
64         %tmp.3 = getelementptr {int,int}* %y, int 0, uint 1
65         %tmp.4 = seteq int* %tmp.1, %tmp.3    ;; seteq x, y
66         ret bool %tmp.4
67 }
68
69 bool %test11({int,int} *%X) {
70         %P = getelementptr {int,int}* %X, int 0, uint 0
71         %Q = seteq int* %P, null
72         ret bool %Q
73 }