1; RUN: opt -S -instsimplify < %s | FileCheck %s
2
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4
5declare void @helper(<2 x i8*>)
6define void @test(<2 x i8*> %a) {
7  %A = getelementptr i8, <2 x i8*> %a, <2 x i32> <i32 0, i32 0>
8  call void @helper(<2 x i8*> %A)
9  ret void
10}
11
12define <4 x i8*> @test1(<4 x i8*> %a) {
13  %gep = getelementptr i8, <4 x i8*> %a, <4 x i32> zeroinitializer
14  ret <4 x i8*> %gep
15
16; CHECK-LABEL: @test1
17; CHECK-NEXT: ret <4 x i8*> %a
18}
19
20define <4 x i8*> @test2(<4 x i8*> %a) {
21  %gep = getelementptr i8, <4 x i8*> %a
22  ret <4 x i8*> %gep
23
24; CHECK-LABEL: @test2
25; CHECK-NEXT: ret <4 x i8*> %a
26}
27
28%struct = type { double, float }
29
30define <4 x float*> @test3() {
31  %gep = getelementptr %struct, <4 x %struct*> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
32  ret <4 x float*> %gep
33
34; CHECK-LABEL: @test3
35; CHECK-NEXT: ret <4 x float*> undef
36}
37
38%struct.empty = type { }
39
40define <4 x %struct.empty*> @test4(<4 x %struct.empty*> %a) {
41  %gep = getelementptr %struct.empty, <4 x %struct.empty*> %a, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
42  ret <4 x %struct.empty*> %gep
43
44; CHECK-LABEL: @test4
45; CHECK-NEXT: ret <4 x %struct.empty*> %a
46}
47
48define <4 x i8*> @test5() {
49  %c = inttoptr <4 x i64> <i64 1, i64 2, i64 3, i64 4> to <4 x i8*>
50  %gep = getelementptr i8, <4 x i8*> %c, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
51  ret <4 x i8*> %gep
52
53; CHECK-LABEL: @test5
54; CHECK-NEXT: ret <4 x i8*> getelementptr (i8, <4 x i8*> <i8* inttoptr (i64 1 to i8*), i8* inttoptr (i64 2 to i8*), i8* inttoptr (i64 3 to i8*), i8* inttoptr (i64 4 to i8*)>, <4 x i64> <i64 1, i64 1, i64 1, i64 1>)
55}
56
57@v = global [24 x [42 x [3 x i32]]] zeroinitializer, align 16
58
59define <16 x i32*> @test6() {
60; CHECK-LABEL: @test6
61; CHECK-NEXT: ret <16 x i32*> getelementptr inbounds ([24 x [42 x [3 x i32]]], [24 x [42 x [3 x i32]]]* @v, <16 x i64> zeroinitializer, <16 x i64> zeroinitializer, <16 x i64> <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, <16 x i64> zeroinitializer)
62  %VectorGep = getelementptr [24 x [42 x [3 x i32]]], [24 x [42 x [3 x i32]]]* @v, i64 0, i64 0, <16 x i64> <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, i64 0
63  ret <16 x i32*> %VectorGep
64}
65
66; PR32697
67; CHECK-LABEL: tinkywinky(
68; CHECK-NEXT: ret <4 x i8*> undef
69define <4 x i8*> @tinkywinky() {
70  %patatino = getelementptr i8, i8* undef, <4 x i64> undef
71  ret <4 x i8*> %patatino
72}
73
74; PR32697
75; CHECK-LABEL: dipsy(
76; CHECK-NEXT: ret <4 x i8*> undef
77define <4 x i8*> @dipsy() {
78  %patatino = getelementptr i8, <4 x i8 *> undef, <4 x i64> undef
79  ret <4 x i8*> %patatino
80}
81
82; PR32697
83; CHECK-LABEL: laalaa(
84; CHECK-NEXT: ret <4 x i8*> undef
85define <4 x i8*> @laalaa() {
86  %patatino = getelementptr i8, <4 x i8 *> undef, i64 undef
87  ret <4 x i8*> %patatino
88}
89
90define <2 x i8*> @zero_index(i8* %p) {
91; CHECK-LABEL: @zero_index(
92; CHECK-NEXT:    %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
93; CHECK-NEXT:    ret <2 x i8*> %gep
94;
95  %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
96  ret <2 x i8*> %gep
97}
98
99define <2 x {}*> @unsized({}* %p) {
100; CHECK-LABEL: @unsized(
101; CHECK-NEXT:    %gep = getelementptr {}, {}* %p, <2 x i64> undef
102; CHECK-NEXT:    ret <2 x {}*> %gep
103;
104  %gep = getelementptr {}, {}* %p, <2 x i64> undef
105  ret <2 x {}*> %gep
106}
107