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