@@ -16,16 +16,16 @@ target triple = "aarch64-linux-gnueabi"
16
16
17
17
; Check that when two complex GEPs are used in two basic blocks, LLVM can
18
18
; eliminate the common subexpression for the second use.
19
- define void @test_GEP_CSE ([ 240 x %struct ]* % string , i32* %adj , i32 %lib , i64 %idxprom ) {
20
- %liberties = getelementptr [240 x %struct ], [ 240 x %struct ]* %string , i64 1 , i64 %idxprom , i32 3
21
- %1 = load i32 , i32* %liberties , align 4
19
+ define void @test_GEP_CSE (ptr % string , ptr %adj , i32 %lib , i64 %idxprom ) {
20
+ %liberties = getelementptr [240 x %struct ], ptr %string , i64 1 , i64 %idxprom , i32 3
21
+ %1 = load i32 , ptr %liberties , align 4
22
22
%cmp = icmp eq i32 %1 , %lib
23
23
br i1 %cmp , label %if.then , label %if.end
24
24
25
25
if.then: ; preds = %entry
26
- %origin = getelementptr [240 x %struct ], [ 240 x %struct ]* %string , i64 1 , i64 %idxprom , i32 2
27
- %2 = load i32 , i32* %origin , align 4
28
- store i32 %2 , i32* %adj , align 4
26
+ %origin = getelementptr [240 x %struct ], ptr %string , i64 1 , i64 %idxprom , i32 2
27
+ %2 = load i32 , ptr %origin , align 4
28
+ store i32 %2 , ptr %adj , align 4
29
29
br label %if.end
30
30
31
31
if.end: ; preds = %if.then, %entry
@@ -39,7 +39,7 @@ if.end: ; preds = %if.then, %entry
39
39
; CHECK:ldr
40
40
41
41
; CHECK-NoAA-LABEL: @test_GEP_CSE(
42
- ; CHECK-NoAA: [[PTR0:%[a-zA-Z0-9]+]] = ptrtoint [240 x %struct]* %string to i64
42
+ ; CHECK-NoAA: [[PTR0:%[a-zA-Z0-9]+]] = ptrtoint ptr %string to i64
43
43
; CHECK-NoAA: [[PTR1:%[a-zA-Z0-9]+]] = mul i64 %idxprom, 96
44
44
; CHECK-NoAA: [[PTR2:%[a-zA-Z0-9]+]] = add i64 [[PTR0]], [[PTR1]]
45
45
; CHECK-NoAA: add i64 [[PTR2]], 23052
@@ -51,38 +51,35 @@ if.end: ; preds = %if.then, %entry
51
51
; CHECK-NoAA: inttoptr
52
52
53
53
; CHECK-UseAA-LABEL: @test_GEP_CSE(
54
- ; CHECK-UseAA: [[PTR0:%[a-zA-Z0-9]+]] = bitcast [240 x %struct]* %string to i8*
55
54
; CHECK-UseAA: [[IDX:%[a-zA-Z0-9]+]] = mul i64 %idxprom, 96
56
- ; CHECK-UseAA: [[PTR1:%[a-zA-Z0-9]+]] = getelementptr i8, i8* [[PTR0]], i64 [[IDX]]
57
- ; CHECK-UseAA: getelementptr i8, i8* [[PTR1]], i64 23052
58
- ; CHECK-UseAA: bitcast
55
+ ; CHECK-UseAA: [[PTR1:%[a-zA-Z0-9]+]] = getelementptr i8, ptr %string, i64 [[IDX]]
56
+ ; CHECK-UseAA: getelementptr i8, ptr [[PTR1]], i64 23052
59
57
; CHECK-UseAA: if.then:
60
- ; CHECK-UseAA: getelementptr i8, i8* [[PTR1]], i64 23048
61
- ; CHECK-UseAA: bitcast
58
+ ; CHECK-UseAA: getelementptr i8, ptr [[PTR1]], i64 23048
62
59
63
60
%class.my = type { i32 , [128 x i32 ], i32 , [256 x %struct.pt ]}
64
- %struct.pt = type { %struct.point* , i32 , i32 }
61
+ %struct.pt = type { ptr , i32 , i32 }
65
62
%struct.point = type { i32 , i32 }
66
63
67
64
; Check when a GEP is used across two basic block, LLVM can sink the address
68
65
; calculation and code gen can generate a better addressing mode for the second
69
66
; use.
70
- define void @test_GEP_across_BB (%class.my* %this , i64 %idx ) {
71
- %1 = getelementptr %class.my , %class.my* %this , i64 0 , i32 3 , i64 %idx , i32 1
72
- %2 = load i32 , i32* %1 , align 4
73
- %3 = getelementptr %class.my , %class.my* %this , i64 0 , i32 3 , i64 %idx , i32 2
74
- %4 = load i32 , i32* %3 , align 4
67
+ define void @test_GEP_across_BB (ptr %this , i64 %idx ) {
68
+ %1 = getelementptr %class.my , ptr %this , i64 0 , i32 3 , i64 %idx , i32 1
69
+ %2 = load i32 , ptr %1 , align 4
70
+ %3 = getelementptr %class.my , ptr %this , i64 0 , i32 3 , i64 %idx , i32 2
71
+ %4 = load i32 , ptr %3 , align 4
75
72
%5 = icmp eq i32 %2 , %4
76
73
br i1 %5 , label %if.true , label %exit
77
74
78
75
if.true:
79
76
%6 = shl i32 %4 , 1
80
- store i32 %6 , i32* %3 , align 4
77
+ store i32 %6 , ptr %3 , align 4
81
78
br label %exit
82
79
83
80
exit:
84
81
%7 = add nsw i32 %4 , 1
85
- store i32 %7 , i32* %1 , align 4
82
+ store i32 %7 , ptr %1 , align 4
86
83
ret void
87
84
}
88
85
; CHECK-LABEL: test_GEP_across_BB:
@@ -97,21 +94,19 @@ exit:
97
94
; CHECK-NoAA: add i64 [[TMP]], 532
98
95
; CHECK-NoAA: if.true:
99
96
; CHECK-NoAA: inttoptr
100
- ; CHECK-NoAA: bitcast
101
97
; CHECK-NoAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, {{.*}}, i64 532
102
98
; CHECK-NoAA: exit:
103
99
; CHECK-NoAA: inttoptr
104
- ; CHECK-NoAA: bitcast
105
100
; CHECK-NoAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, {{.*}}, i64 528
106
101
107
102
; CHECK-UseAA-LABEL: test_GEP_across_BB(
108
103
; CHECK-UseAA: [[PTR0:%[a-zA-Z0-9]+]] = getelementptr
109
- ; CHECK-UseAA: getelementptr i8, i8* [[PTR0]], i64 528
110
- ; CHECK-UseAA: getelementptr i8, i8* [[PTR0]], i64 532
104
+ ; CHECK-UseAA: getelementptr i8, ptr [[PTR0]], i64 528
105
+ ; CHECK-UseAA: getelementptr i8, ptr [[PTR0]], i64 532
111
106
; CHECK-UseAA: if.true:
112
- ; CHECK-UseAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, i8* [[PTR0]], i64 532
107
+ ; CHECK-UseAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, ptr [[PTR0]], i64 532
113
108
; CHECK-UseAA: exit:
114
- ; CHECK-UseAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, i8* [[PTR0]], i64 528
109
+ ; CHECK-UseAA: {{%sunk[a-zA-Z0-9]+}} = getelementptr i8, ptr [[PTR0]], i64 528
115
110
116
111
%struct.S = type { float , double }
117
112
@struct_array = global [1024 x %struct.S ] zeroinitializer , align 16
@@ -121,49 +116,49 @@ exit:
121
116
; The constant offsets are from indices "i64 %idxprom" and "i32 1". As the
122
117
; alloca size of %struct.S is 16, and "i32 1" is the 2rd element whose field
123
118
; offset is 8, the total constant offset is (5 * 16 + 8) = 88.
124
- define double * @test-struct_1 (i32 %i ) {
119
+ define ptr @test-struct_1 (i32 %i ) {
125
120
entry:
126
121
%add = add nsw i32 %i , 5
127
122
%idxprom = sext i32 %add to i64
128
- %p = getelementptr [1024 x %struct.S ], [ 1024 x %struct.S ]* @struct_array , i64 0 , i64 %idxprom , i32 1
129
- ret double * %p
123
+ %p = getelementptr [1024 x %struct.S ], ptr @struct_array , i64 0 , i64 %idxprom , i32 1
124
+ ret ptr %p
130
125
}
131
126
; CHECK-NoAA-LABEL: @test-struct_1(
132
127
; CHECK-NoAA-NOT: getelementptr
133
128
; CHECK-NoAA: add i64 %{{[a-zA-Z0-9]+}}, 88
134
129
135
130
; CHECK-UseAA-LABEL: @test-struct_1(
136
- ; CHECK-UseAA: getelementptr i8, i8* %{{[a-zA-Z0-9]+}}, i64 88
131
+ ; CHECK-UseAA: getelementptr i8, ptr %{{[a-zA-Z0-9]+}}, i64 88
137
132
138
133
%struct3 = type { i64 , i32 }
139
134
%struct2 = type { %struct3 , i32 }
140
135
%struct1 = type { i64 , %struct2 }
141
- %struct0 = type { i32 , i32 , i64* , [100 x %struct1 ] }
136
+ %struct0 = type { i32 , i32 , ptr , [100 x %struct1 ] }
142
137
143
138
; The constant offsets are from indices "i32 3", "i64 %arrayidx" and "i32 1".
144
139
; "i32 3" is the 4th element whose field offset is 16. The alloca size of
145
140
; %struct1 is 32. "i32 1" is the 2rd element whose field offset is 8. So the
146
141
; total constant offset is 16 + (-2 * 32) + 8 = -40
147
- define %struct2* @test-struct_2 (%struct0* %ptr , i64 %idx ) {
142
+ define ptr @test-struct_2 (ptr %ptr , i64 %idx ) {
148
143
entry:
149
144
%arrayidx = add nsw i64 %idx , -2
150
- %ptr2 = getelementptr %struct0 , %struct0* %ptr , i64 0 , i32 3 , i64 %arrayidx , i32 1
151
- ret %struct2* %ptr2
145
+ %ptr2 = getelementptr %struct0 , ptr %ptr , i64 0 , i32 3 , i64 %arrayidx , i32 1
146
+ ret ptr %ptr2
152
147
}
153
148
; CHECK-NoAA-LABEL: @test-struct_2(
154
149
; CHECK-NoAA-NOT: = getelementptr
155
150
; CHECK-NoAA: add i64 %{{[a-zA-Z0-9]+}}, -40
156
151
157
152
; CHECK-UseAA-LABEL: @test-struct_2(
158
- ; CHECK-UseAA: getelementptr i8, i8* %{{[a-zA-Z0-9]+}}, i64 -40
153
+ ; CHECK-UseAA: getelementptr i8, ptr %{{[a-zA-Z0-9]+}}, i64 -40
159
154
160
155
; Test that when a index is added from two constant, SeparateConstOffsetFromGEP
161
156
; pass does not generate incorrect result.
162
- define void @test_const_add ([ 3 x i32 ]* %in ) {
157
+ define void @test_const_add (ptr %in ) {
163
158
%inc = add nsw i32 2 , 1
164
159
%idxprom = sext i32 %inc to i64
165
- %arrayidx = getelementptr [3 x i32 ], [ 3 x i32 ]* %in , i64 %idxprom , i64 2
166
- store i32 0 , i32* %arrayidx , align 4
160
+ %arrayidx = getelementptr [3 x i32 ], ptr %in , i64 %idxprom , i64 2
161
+ store i32 0 , ptr %arrayidx , align 4
167
162
ret void
168
163
}
169
164
; CHECK-LABEL: test_const_add:
0 commit comments