1 ; The %A getelementptr instruction should be eliminated here
3 ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep -v '%B' | not grep getelementptr
5 %Global = constant [10 x sbyte] c"helloworld"
9 int *%foo1(int* %I) { ; Test noop elimination
10 %A = getelementptr int* %I, long 0
14 int* %foo2(int* %I) { ; Test noop elimination
15 %A = getelementptr int* %I
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
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
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
39 %A = getelementptr [4 x int]* %M, long 0, long 0
40 %B = getelementptr int* %A, long 2
44 int* %foo7(int* %I, long %C, long %D) {
45 %A = getelementptr int* %I, long %C
46 %B = getelementptr int* %A, long %D
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*
57 %A = getelementptr {int, double}* null, int 0, uint 1
58 %B = cast double* %A to int
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
69 bool %test11({int,int} *%X) {
70 %P = getelementptr {int,int}* %X, int 0, uint 0
71 %Q = seteq int* %P, null