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