xref: /aosp_15_r20/external/llvm/docs/GetElementPtr.rst (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker=======================================
2*9880d681SAndroid Build Coastguard WorkerThe Often Misunderstood GEP Instruction
3*9880d681SAndroid Build Coastguard Worker=======================================
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker.. contents::
6*9880d681SAndroid Build Coastguard Worker   :local:
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard WorkerIntroduction
9*9880d681SAndroid Build Coastguard Worker============
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard WorkerThis document seeks to dispel the mystery and confusion surrounding LLVM's
12*9880d681SAndroid Build Coastguard Worker`GetElementPtr <LangRef.html#i_getelementptr>`_ (GEP) instruction.  Questions
13*9880d681SAndroid Build Coastguard Workerabout the wily GEP instruction are probably the most frequently occurring
14*9880d681SAndroid Build Coastguard Workerquestions once a developer gets down to coding with LLVM. Here we lay out the
15*9880d681SAndroid Build Coastguard Workersources of confusion and show that the GEP instruction is really quite simple.
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard WorkerAddress Computation
18*9880d681SAndroid Build Coastguard Worker===================
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard WorkerWhen people are first confronted with the GEP instruction, they tend to relate
21*9880d681SAndroid Build Coastguard Workerit to known concepts from other programming paradigms, most notably C array
22*9880d681SAndroid Build Coastguard Workerindexing and field selection. GEP closely resembles C array indexing and field
23*9880d681SAndroid Build Coastguard Workerselection, however it is a little different and this leads to the following
24*9880d681SAndroid Build Coastguard Workerquestions.
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard WorkerWhat is the first index of the GEP instruction?
27*9880d681SAndroid Build Coastguard Worker-----------------------------------------------
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard WorkerQuick answer: The index stepping through the first operand.
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard WorkerThe confusion with the first index usually arises from thinking about the
32*9880d681SAndroid Build Coastguard WorkerGetElementPtr instruction as if it was a C index operator. They aren't the
33*9880d681SAndroid Build Coastguard Workersame. For example, when we write, in "C":
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker.. code-block:: c++
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker  AType *Foo;
38*9880d681SAndroid Build Coastguard Worker  ...
39*9880d681SAndroid Build Coastguard Worker  X = &Foo->F;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerit is natural to think that there is only one index, the selection of the field
42*9880d681SAndroid Build Coastguard Worker``F``.  However, in this example, ``Foo`` is a pointer. That pointer
43*9880d681SAndroid Build Coastguard Workermust be indexed explicitly in LLVM. C, on the other hand, indices through it
44*9880d681SAndroid Build Coastguard Workertransparently.  To arrive at the same address location as the C code, you would
45*9880d681SAndroid Build Coastguard Workerprovide the GEP instruction with two index operands. The first operand indexes
46*9880d681SAndroid Build Coastguard Workerthrough the pointer; the second operand indexes the field ``F`` of the
47*9880d681SAndroid Build Coastguard Workerstructure, just as if you wrote:
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker.. code-block:: c++
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  X = &Foo[0].F;
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard WorkerSometimes this question gets rephrased as:
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker.. _GEP index through first pointer:
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker  *Why is it okay to index through the first pointer, but subsequent pointers
58*9880d681SAndroid Build Coastguard Worker  won't be dereferenced?*
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard WorkerThe answer is simply because memory does not have to be accessed to perform the
61*9880d681SAndroid Build Coastguard Workercomputation. The first operand to the GEP instruction must be a value of a
62*9880d681SAndroid Build Coastguard Workerpointer type. The value of the pointer is provided directly to the GEP
63*9880d681SAndroid Build Coastguard Workerinstruction as an operand without any need for accessing memory. It must,
64*9880d681SAndroid Build Coastguard Workertherefore be indexed and requires an index operand. Consider this example:
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker.. code-block:: c++
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker  struct munger_struct {
69*9880d681SAndroid Build Coastguard Worker    int f1;
70*9880d681SAndroid Build Coastguard Worker    int f2;
71*9880d681SAndroid Build Coastguard Worker  };
72*9880d681SAndroid Build Coastguard Worker  void munge(struct munger_struct *P) {
73*9880d681SAndroid Build Coastguard Worker    P[0].f1 = P[1].f1 + P[2].f2;
74*9880d681SAndroid Build Coastguard Worker  }
75*9880d681SAndroid Build Coastguard Worker  ...
76*9880d681SAndroid Build Coastguard Worker  munger_struct Array[3];
77*9880d681SAndroid Build Coastguard Worker  ...
78*9880d681SAndroid Build Coastguard Worker  munge(Array);
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard WorkerIn this "C" example, the front end compiler (Clang) will generate three GEP
81*9880d681SAndroid Build Coastguard Workerinstructions for the three indices through "P" in the assignment statement.  The
82*9880d681SAndroid Build Coastguard Workerfunction argument ``P`` will be the first operand of each of these GEP
83*9880d681SAndroid Build Coastguard Workerinstructions.  The second operand indexes through that pointer.  The third
84*9880d681SAndroid Build Coastguard Workeroperand will be the field offset into the ``struct munger_struct`` type, for
85*9880d681SAndroid Build Coastguard Workereither the ``f1`` or ``f2`` field. So, in LLVM assembly the ``munge`` function
86*9880d681SAndroid Build Coastguard Workerlooks like:
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker  void %munge(%struct.munger_struct* %P) {
91*9880d681SAndroid Build Coastguard Worker  entry:
92*9880d681SAndroid Build Coastguard Worker    %tmp = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 1, i32 0
93*9880d681SAndroid Build Coastguard Worker    %tmp = load i32* %tmp
94*9880d681SAndroid Build Coastguard Worker    %tmp6 = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 2, i32 1
95*9880d681SAndroid Build Coastguard Worker    %tmp7 = load i32* %tmp6
96*9880d681SAndroid Build Coastguard Worker    %tmp8 = add i32 %tmp7, %tmp
97*9880d681SAndroid Build Coastguard Worker    %tmp9 = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 0, i32 0
98*9880d681SAndroid Build Coastguard Worker    store i32 %tmp8, i32* %tmp9
99*9880d681SAndroid Build Coastguard Worker    ret void
100*9880d681SAndroid Build Coastguard Worker  }
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard WorkerIn each case the first operand is the pointer through which the GEP instruction
103*9880d681SAndroid Build Coastguard Workerstarts. The same is true whether the first operand is an argument, allocated
104*9880d681SAndroid Build Coastguard Workermemory, or a global variable.
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard WorkerTo make this clear, let's consider a more obtuse example:
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker  %MyVar = uninitialized global i32
111*9880d681SAndroid Build Coastguard Worker  ...
112*9880d681SAndroid Build Coastguard Worker  %idx1 = getelementptr i32, i32* %MyVar, i64 0
113*9880d681SAndroid Build Coastguard Worker  %idx2 = getelementptr i32, i32* %MyVar, i64 1
114*9880d681SAndroid Build Coastguard Worker  %idx3 = getelementptr i32, i32* %MyVar, i64 2
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard WorkerThese GEP instructions are simply making address computations from the base
117*9880d681SAndroid Build Coastguard Workeraddress of ``MyVar``.  They compute, as follows (using C syntax):
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker.. code-block:: c++
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  idx1 = (char*) &MyVar + 0
122*9880d681SAndroid Build Coastguard Worker  idx2 = (char*) &MyVar + 4
123*9880d681SAndroid Build Coastguard Worker  idx3 = (char*) &MyVar + 8
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard WorkerSince the type ``i32`` is known to be four bytes long, the indices 0, 1 and 2
126*9880d681SAndroid Build Coastguard Workertranslate into memory offsets of 0, 4, and 8, respectively. No memory is
127*9880d681SAndroid Build Coastguard Workeraccessed to make these computations because the address of ``%MyVar`` is passed
128*9880d681SAndroid Build Coastguard Workerdirectly to the GEP instructions.
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard WorkerThe obtuse part of this example is in the cases of ``%idx2`` and ``%idx3``. They
131*9880d681SAndroid Build Coastguard Workerresult in the computation of addresses that point to memory past the end of the
132*9880d681SAndroid Build Coastguard Worker``%MyVar`` global, which is only one ``i32`` long, not three ``i32``\s long.
133*9880d681SAndroid Build Coastguard WorkerWhile this is legal in LLVM, it is inadvisable because any load or store with
134*9880d681SAndroid Build Coastguard Workerthe pointer that results from these GEP instructions would produce undefined
135*9880d681SAndroid Build Coastguard Workerresults.
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard WorkerWhy is the extra 0 index required?
138*9880d681SAndroid Build Coastguard Worker----------------------------------
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard WorkerQuick answer: there are no superfluous indices.
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard WorkerThis question arises most often when the GEP instruction is applied to a global
143*9880d681SAndroid Build Coastguard Workervariable which is always a pointer type. For example, consider this:
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker  %MyStruct = uninitialized global { float*, i32 }
148*9880d681SAndroid Build Coastguard Worker  ...
149*9880d681SAndroid Build Coastguard Worker  %idx = getelementptr { float*, i32 }, { float*, i32 }* %MyStruct, i64 0, i32 1
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard WorkerThe GEP above yields an ``i32*`` by indexing the ``i32`` typed field of the
152*9880d681SAndroid Build Coastguard Workerstructure ``%MyStruct``. When people first look at it, they wonder why the ``i64
153*9880d681SAndroid Build Coastguard Worker0`` index is needed. However, a closer inspection of how globals and GEPs work
154*9880d681SAndroid Build Coastguard Workerreveals the need. Becoming aware of the following facts will dispel the
155*9880d681SAndroid Build Coastguard Workerconfusion:
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker#. The type of ``%MyStruct`` is *not* ``{ float*, i32 }`` but rather ``{ float*,
158*9880d681SAndroid Build Coastguard Worker   i32 }*``. That is, ``%MyStruct`` is a pointer to a structure containing a
159*9880d681SAndroid Build Coastguard Worker   pointer to a ``float`` and an ``i32``.
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker#. Point #1 is evidenced by noticing the type of the first operand of the GEP
162*9880d681SAndroid Build Coastguard Worker   instruction (``%MyStruct``) which is ``{ float*, i32 }*``.
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker#. The first index, ``i64 0`` is required to step over the global variable
165*9880d681SAndroid Build Coastguard Worker   ``%MyStruct``.  Since the first argument to the GEP instruction must always
166*9880d681SAndroid Build Coastguard Worker   be a value of pointer type, the first index steps through that pointer. A
167*9880d681SAndroid Build Coastguard Worker   value of 0 means 0 elements offset from that pointer.
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker#. The second index, ``i32 1`` selects the second field of the structure (the
170*9880d681SAndroid Build Coastguard Worker   ``i32``).
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard WorkerWhat is dereferenced by GEP?
173*9880d681SAndroid Build Coastguard Worker----------------------------
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard WorkerQuick answer: nothing.
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard WorkerThe GetElementPtr instruction dereferences nothing. That is, it doesn't access
178*9880d681SAndroid Build Coastguard Workermemory in any way. That's what the Load and Store instructions are for.  GEP is
179*9880d681SAndroid Build Coastguard Workeronly involved in the computation of addresses. For example, consider this:
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker  %MyVar = uninitialized global { [40 x i32 ]* }
184*9880d681SAndroid Build Coastguard Worker  ...
185*9880d681SAndroid Build Coastguard Worker  %idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard WorkerIn this example, we have a global variable, ``%MyVar`` that is a pointer to a
188*9880d681SAndroid Build Coastguard Workerstructure containing a pointer to an array of 40 ints. The GEP instruction seems
189*9880d681SAndroid Build Coastguard Workerto be accessing the 18th integer of the structure's array of ints. However, this
190*9880d681SAndroid Build Coastguard Workeris actually an illegal GEP instruction. It won't compile. The reason is that the
191*9880d681SAndroid Build Coastguard Workerpointer in the structure *must* be dereferenced in order to index into the
192*9880d681SAndroid Build Coastguard Workerarray of 40 ints. Since the GEP instruction never accesses memory, it is
193*9880d681SAndroid Build Coastguard Workerillegal.
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard WorkerIn order to access the 18th integer in the array, you would need to do the
196*9880d681SAndroid Build Coastguard Workerfollowing:
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker  %idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %, i64 0, i32 0
201*9880d681SAndroid Build Coastguard Worker  %arr = load [40 x i32]** %idx
202*9880d681SAndroid Build Coastguard Worker  %idx = getelementptr [40 x i32], [40 x i32]* %arr, i64 0, i64 17
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard WorkerIn this case, we have to load the pointer in the structure with a load
205*9880d681SAndroid Build Coastguard Workerinstruction before we can index into the array. If the example was changed to:
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker  %MyVar = uninitialized global { [40 x i32 ] }
210*9880d681SAndroid Build Coastguard Worker  ...
211*9880d681SAndroid Build Coastguard Worker  %idx = getelementptr { [40 x i32] }, { [40 x i32] }*, i64 0, i32 0, i64 17
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerthen everything works fine. In this case, the structure does not contain a
214*9880d681SAndroid Build Coastguard Workerpointer and the GEP instruction can index through the global variable, into the
215*9880d681SAndroid Build Coastguard Workerfirst field of the structure and access the 18th ``i32`` in the array there.
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard WorkerWhy don't GEP x,0,0,1 and GEP x,1 alias?
218*9880d681SAndroid Build Coastguard Worker----------------------------------------
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard WorkerQuick Answer: They compute different address locations.
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard WorkerIf you look at the first indices in these GEP instructions you find that they
223*9880d681SAndroid Build Coastguard Workerare different (0 and 1), therefore the address computation diverges with that
224*9880d681SAndroid Build Coastguard Workerindex. Consider this example:
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker  %MyVar = global { [10 x i32] }
229*9880d681SAndroid Build Coastguard Worker  %idx1 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 0, i32 0, i64 1
230*9880d681SAndroid Build Coastguard Worker  %idx2 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard WorkerIn this example, ``idx1`` computes the address of the second integer in the
233*9880d681SAndroid Build Coastguard Workerarray that is in the structure in ``%MyVar``, that is ``MyVar+4``. The type of
234*9880d681SAndroid Build Coastguard Worker``idx1`` is ``i32*``. However, ``idx2`` computes the address of *the next*
235*9880d681SAndroid Build Coastguard Workerstructure after ``%MyVar``. The type of ``idx2`` is ``{ [10 x i32] }*`` and its
236*9880d681SAndroid Build Coastguard Workervalue is equivalent to ``MyVar + 40`` because it indexes past the ten 4-byte
237*9880d681SAndroid Build Coastguard Workerintegers in ``MyVar``. Obviously, in such a situation, the pointers don't
238*9880d681SAndroid Build Coastguard Workeralias.
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard WorkerWhy do GEP x,1,0,0 and GEP x,1 alias?
241*9880d681SAndroid Build Coastguard Worker-------------------------------------
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard WorkerQuick Answer: They compute the same address location.
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard WorkerThese two GEP instructions will compute the same address because indexing
246*9880d681SAndroid Build Coastguard Workerthrough the 0th element does not change the address. However, it does change the
247*9880d681SAndroid Build Coastguard Workertype. Consider this example:
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker.. code-block:: llvm
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker  %MyVar = global { [10 x i32] }
252*9880d681SAndroid Build Coastguard Worker  %idx1 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1, i32 0, i64 0
253*9880d681SAndroid Build Coastguard Worker  %idx2 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard WorkerIn this example, the value of ``%idx1`` is ``%MyVar+40`` and its type is
256*9880d681SAndroid Build Coastguard Worker``i32*``. The value of ``%idx2`` is also ``MyVar+40`` but its type is ``{ [10 x
257*9880d681SAndroid Build Coastguard Workeri32] }*``.
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard WorkerCan GEP index into vector elements?
260*9880d681SAndroid Build Coastguard Worker-----------------------------------
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard WorkerThis hasn't always been forcefully disallowed, though it's not recommended.  It
263*9880d681SAndroid Build Coastguard Workerleads to awkward special cases in the optimizers, and fundamental inconsistency
264*9880d681SAndroid Build Coastguard Workerin the IR. In the future, it will probably be outright disallowed.
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard WorkerWhat effect do address spaces have on GEPs?
267*9880d681SAndroid Build Coastguard Worker-------------------------------------------
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard WorkerNone, except that the address space qualifier on the first operand pointer type
270*9880d681SAndroid Build Coastguard Workeralways matches the address space qualifier on the result type.
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard WorkerHow is GEP different from ``ptrtoint``, arithmetic, and ``inttoptr``?
273*9880d681SAndroid Build Coastguard Worker---------------------------------------------------------------------
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard WorkerIt's very similar; there are only subtle differences.
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard WorkerWith ptrtoint, you have to pick an integer type. One approach is to pick i64;
278*9880d681SAndroid Build Coastguard Workerthis is safe on everything LLVM supports (LLVM internally assumes pointers are
279*9880d681SAndroid Build Coastguard Workernever wider than 64 bits in many places), and the optimizer will actually narrow
280*9880d681SAndroid Build Coastguard Workerthe i64 arithmetic down to the actual pointer size on targets which don't
281*9880d681SAndroid Build Coastguard Workersupport 64-bit arithmetic in most cases. However, there are some cases where it
282*9880d681SAndroid Build Coastguard Workerdoesn't do this. With GEP you can avoid this problem.
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard WorkerAlso, GEP carries additional pointer aliasing rules. It's invalid to take a GEP
285*9880d681SAndroid Build Coastguard Workerfrom one object, address into a different separately allocated object, and
286*9880d681SAndroid Build Coastguard Workerdereference it. IR producers (front-ends) must follow this rule, and consumers
287*9880d681SAndroid Build Coastguard Worker(optimizers, specifically alias analysis) benefit from being able to rely on
288*9880d681SAndroid Build Coastguard Workerit. See the `Rules`_ section for more information.
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard WorkerAnd, GEP is more concise in common cases.
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard WorkerHowever, for the underlying integer computation implied, there is no
293*9880d681SAndroid Build Coastguard Workerdifference.
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard WorkerI'm writing a backend for a target which needs custom lowering for GEP. How do I do this?
297*9880d681SAndroid Build Coastguard Worker-----------------------------------------------------------------------------------------
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard WorkerYou don't. The integer computation implied by a GEP is target-independent.
300*9880d681SAndroid Build Coastguard WorkerTypically what you'll need to do is make your backend pattern-match expressions
301*9880d681SAndroid Build Coastguard Workertrees involving ADD, MUL, etc., which are what GEP is lowered into. This has the
302*9880d681SAndroid Build Coastguard Workeradvantage of letting your code work correctly in more cases.
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard WorkerGEP does use target-dependent parameters for the size and layout of data types,
305*9880d681SAndroid Build Coastguard Workerwhich targets can customize.
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard WorkerIf you require support for addressing units which are not 8 bits, you'll need to
308*9880d681SAndroid Build Coastguard Workerfix a lot of code in the backend, with GEP lowering being only a small piece of
309*9880d681SAndroid Build Coastguard Workerthe overall picture.
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard WorkerHow does VLA addressing work with GEPs?
312*9880d681SAndroid Build Coastguard Worker---------------------------------------
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard WorkerGEPs don't natively support VLAs. LLVM's type system is entirely static, and GEP
315*9880d681SAndroid Build Coastguard Workeraddress computations are guided by an LLVM type.
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard WorkerVLA indices can be implemented as linearized indices. For example, an expression
318*9880d681SAndroid Build Coastguard Workerlike ``X[a][b][c]``, must be effectively lowered into a form like
319*9880d681SAndroid Build Coastguard Worker``X[a*m+b*n+c]``, so that it appears to the GEP as a single-dimensional array
320*9880d681SAndroid Build Coastguard Workerreference.
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard WorkerThis means if you want to write an analysis which understands array indices and
323*9880d681SAndroid Build Coastguard Workeryou want to support VLAs, your code will have to be prepared to reverse-engineer
324*9880d681SAndroid Build Coastguard Workerthe linearization. One way to solve this problem is to use the ScalarEvolution
325*9880d681SAndroid Build Coastguard Workerlibrary, which always presents VLA and non-VLA indexing in the same manner.
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker.. _Rules:
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard WorkerRules
330*9880d681SAndroid Build Coastguard Worker=====
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard WorkerWhat happens if an array index is out of bounds?
333*9880d681SAndroid Build Coastguard Worker------------------------------------------------
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard WorkerThere are two senses in which an array index can be out of bounds.
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard WorkerFirst, there's the array type which comes from the (static) type of the first
338*9880d681SAndroid Build Coastguard Workeroperand to the GEP. Indices greater than the number of elements in the
339*9880d681SAndroid Build Coastguard Workercorresponding static array type are valid. There is no problem with out of
340*9880d681SAndroid Build Coastguard Workerbounds indices in this sense. Indexing into an array only depends on the size of
341*9880d681SAndroid Build Coastguard Workerthe array element, not the number of elements.
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard WorkerA common example of how this is used is arrays where the size is not known.
344*9880d681SAndroid Build Coastguard WorkerIt's common to use array types with zero length to represent these. The fact
345*9880d681SAndroid Build Coastguard Workerthat the static type says there are zero elements is irrelevant; it's perfectly
346*9880d681SAndroid Build Coastguard Workervalid to compute arbitrary element indices, as the computation only depends on
347*9880d681SAndroid Build Coastguard Workerthe size of the array element, not the number of elements. Note that zero-sized
348*9880d681SAndroid Build Coastguard Workerarrays are not a special case here.
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard WorkerThis sense is unconnected with ``inbounds`` keyword. The ``inbounds`` keyword is
351*9880d681SAndroid Build Coastguard Workerdesigned to describe low-level pointer arithmetic overflow conditions, rather
352*9880d681SAndroid Build Coastguard Workerthan high-level array indexing rules.
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard WorkerAnalysis passes which wish to understand array indexing should not assume that
355*9880d681SAndroid Build Coastguard Workerthe static array type bounds are respected.
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard WorkerThe second sense of being out of bounds is computing an address that's beyond
358*9880d681SAndroid Build Coastguard Workerthe actual underlying allocated object.
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard WorkerWith the ``inbounds`` keyword, the result value of the GEP is undefined if the
361*9880d681SAndroid Build Coastguard Workeraddress is outside the actual underlying allocated object and not the address
362*9880d681SAndroid Build Coastguard Workerone-past-the-end.
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard WorkerWithout the ``inbounds`` keyword, there are no restrictions on computing
365*9880d681SAndroid Build Coastguard Workerout-of-bounds addresses. Obviously, performing a load or a store requires an
366*9880d681SAndroid Build Coastguard Workeraddress of allocated and sufficiently aligned memory. But the GEP itself is only
367*9880d681SAndroid Build Coastguard Workerconcerned with computing addresses.
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard WorkerCan array indices be negative?
370*9880d681SAndroid Build Coastguard Worker------------------------------
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard WorkerYes. This is basically a special case of array indices being out of bounds.
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard WorkerCan I compare two values computed with GEPs?
375*9880d681SAndroid Build Coastguard Worker--------------------------------------------
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard WorkerYes. If both addresses are within the same allocated object, or
378*9880d681SAndroid Build Coastguard Workerone-past-the-end, you'll get the comparison result you expect. If either is
379*9880d681SAndroid Build Coastguard Workeroutside of it, integer arithmetic wrapping may occur, so the comparison may not
380*9880d681SAndroid Build Coastguard Workerbe meaningful.
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard WorkerCan I do GEP with a different pointer type than the type of the underlying object?
383*9880d681SAndroid Build Coastguard Worker----------------------------------------------------------------------------------
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard WorkerYes. There are no restrictions on bitcasting a pointer value to an arbitrary
386*9880d681SAndroid Build Coastguard Workerpointer type. The types in a GEP serve only to define the parameters for the
387*9880d681SAndroid Build Coastguard Workerunderlying integer computation. They need not correspond with the actual type of
388*9880d681SAndroid Build Coastguard Workerthe underlying object.
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard WorkerFurthermore, loads and stores don't have to use the same types as the type of
391*9880d681SAndroid Build Coastguard Workerthe underlying object. Types in this context serve only to specify memory size
392*9880d681SAndroid Build Coastguard Workerand alignment. Beyond that there are merely a hint to the optimizer indicating
393*9880d681SAndroid Build Coastguard Workerhow the value will likely be used.
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard WorkerCan I cast an object's address to integer and add it to null?
396*9880d681SAndroid Build Coastguard Worker-------------------------------------------------------------
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard WorkerYou can compute an address that way, but if you use GEP to do the add, you can't
399*9880d681SAndroid Build Coastguard Workeruse that pointer to actually access the object, unless the object is managed
400*9880d681SAndroid Build Coastguard Workeroutside of LLVM.
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard WorkerThe underlying integer computation is sufficiently defined; null has a defined
403*9880d681SAndroid Build Coastguard Workervalue --- zero --- and you can add whatever value you want to it.
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard WorkerHowever, it's invalid to access (load from or store to) an LLVM-aware object
406*9880d681SAndroid Build Coastguard Workerwith such a pointer. This includes ``GlobalVariables``, ``Allocas``, and objects
407*9880d681SAndroid Build Coastguard Workerpointed to by noalias pointers.
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard WorkerIf you really need this functionality, you can do the arithmetic with explicit
410*9880d681SAndroid Build Coastguard Workerinteger instructions, and use inttoptr to convert the result to an address. Most
411*9880d681SAndroid Build Coastguard Workerof GEP's special aliasing rules do not apply to pointers computed from ptrtoint,
412*9880d681SAndroid Build Coastguard Workerarithmetic, and inttoptr sequences.
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard WorkerCan I compute the distance between two objects, and add that value to one address to compute the other address?
415*9880d681SAndroid Build Coastguard Worker---------------------------------------------------------------------------------------------------------------
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard WorkerAs with arithmetic on null, you can use GEP to compute an address that way, but
418*9880d681SAndroid Build Coastguard Workeryou can't use that pointer to actually access the object if you do, unless the
419*9880d681SAndroid Build Coastguard Workerobject is managed outside of LLVM.
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard WorkerAlso as above, ptrtoint and inttoptr provide an alternative way to do this which
422*9880d681SAndroid Build Coastguard Workerdo not have this restriction.
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard WorkerCan I do type-based alias analysis on LLVM IR?
425*9880d681SAndroid Build Coastguard Worker----------------------------------------------
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard WorkerYou can't do type-based alias analysis using LLVM's built-in type system,
428*9880d681SAndroid Build Coastguard Workerbecause LLVM has no restrictions on mixing types in addressing, loads or stores.
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard WorkerLLVM's type-based alias analysis pass uses metadata to describe a different type
431*9880d681SAndroid Build Coastguard Workersystem (such as the C type system), and performs type-based aliasing on top of
432*9880d681SAndroid Build Coastguard Workerthat.  Further details are in the `language reference <LangRef.html#tbaa>`_.
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard WorkerWhat happens if a GEP computation overflows?
435*9880d681SAndroid Build Coastguard Worker--------------------------------------------
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard WorkerIf the GEP lacks the ``inbounds`` keyword, the value is the result from
438*9880d681SAndroid Build Coastguard Workerevaluating the implied two's complement integer computation. However, since
439*9880d681SAndroid Build Coastguard Workerthere's no guarantee of where an object will be allocated in the address space,
440*9880d681SAndroid Build Coastguard Workersuch values have limited meaning.
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard WorkerIf the GEP has the ``inbounds`` keyword, the result value is undefined (a "trap
443*9880d681SAndroid Build Coastguard Workervalue") if the GEP overflows (i.e. wraps around the end of the address space).
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard WorkerAs such, there are some ramifications of this for inbounds GEPs: scales implied
446*9880d681SAndroid Build Coastguard Workerby array/vector/pointer indices are always known to be "nsw" since they are
447*9880d681SAndroid Build Coastguard Workersigned values that are scaled by the element size.  These values are also
448*9880d681SAndroid Build Coastguard Workerallowed to be negative (e.g. "``gep i32 *%P, i32 -1``") but the pointer itself
449*9880d681SAndroid Build Coastguard Workeris logically treated as an unsigned value.  This means that GEPs have an
450*9880d681SAndroid Build Coastguard Workerasymmetric relation between the pointer base (which is treated as unsigned) and
451*9880d681SAndroid Build Coastguard Workerthe offset applied to it (which is treated as signed). The result of the
452*9880d681SAndroid Build Coastguard Workeradditions within the offset calculation cannot have signed overflow, but when
453*9880d681SAndroid Build Coastguard Workerapplied to the base pointer, there can be signed overflow.
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard WorkerHow can I tell if my front-end is following the rules?
456*9880d681SAndroid Build Coastguard Worker------------------------------------------------------
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard WorkerThere is currently no checker for the getelementptr rules. Currently, the only
459*9880d681SAndroid Build Coastguard Workerway to do this is to manually check each place in your front-end where
460*9880d681SAndroid Build Coastguard WorkerGetElementPtr operators are created.
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard WorkerIt's not possible to write a checker which could find all rule violations
463*9880d681SAndroid Build Coastguard Workerstatically. It would be possible to write a checker which works by instrumenting
464*9880d681SAndroid Build Coastguard Workerthe code with dynamic checks though. Alternatively, it would be possible to
465*9880d681SAndroid Build Coastguard Workerwrite a static checker which catches a subset of possible problems. However, no
466*9880d681SAndroid Build Coastguard Workersuch checker exists today.
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard WorkerRationale
469*9880d681SAndroid Build Coastguard Worker=========
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard WorkerWhy is GEP designed this way?
472*9880d681SAndroid Build Coastguard Worker-----------------------------
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard WorkerThe design of GEP has the following goals, in rough unofficial order of
475*9880d681SAndroid Build Coastguard Workerpriority:
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Worker* Support C, C-like languages, and languages which can be conceptually lowered
478*9880d681SAndroid Build Coastguard Worker  into C (this covers a lot).
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker* Support optimizations such as those that are common in C compilers. In
481*9880d681SAndroid Build Coastguard Worker  particular, GEP is a cornerstone of LLVM's `pointer aliasing
482*9880d681SAndroid Build Coastguard Worker  model <LangRef.html#pointeraliasing>`_.
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker* Provide a consistent method for computing addresses so that address
485*9880d681SAndroid Build Coastguard Worker  computations don't need to be a part of load and store instructions in the IR.
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Worker* Support non-C-like languages, to the extent that it doesn't interfere with
488*9880d681SAndroid Build Coastguard Worker  other goals.
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker* Minimize target-specific information in the IR.
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard WorkerWhy do struct member indices always use ``i32``?
493*9880d681SAndroid Build Coastguard Worker------------------------------------------------
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard WorkerThe specific type i32 is probably just a historical artifact, however it's wide
496*9880d681SAndroid Build Coastguard Workerenough for all practical purposes, so there's been no need to change it.  It
497*9880d681SAndroid Build Coastguard Workerdoesn't necessarily imply i32 address arithmetic; it's just an identifier which
498*9880d681SAndroid Build Coastguard Workeridentifies a field in a struct. Requiring that all struct indices be the same
499*9880d681SAndroid Build Coastguard Workerreduces the range of possibilities for cases where two GEPs are effectively the
500*9880d681SAndroid Build Coastguard Workersame but have distinct operand types.
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard WorkerWhat's an uglygep?
503*9880d681SAndroid Build Coastguard Worker------------------
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard WorkerSome LLVM optimizers operate on GEPs by internally lowering them into more
506*9880d681SAndroid Build Coastguard Workerprimitive integer expressions, which allows them to be combined with other
507*9880d681SAndroid Build Coastguard Workerinteger expressions and/or split into multiple separate integer expressions. If
508*9880d681SAndroid Build Coastguard Workerthey've made non-trivial changes, translating back into LLVM IR can involve
509*9880d681SAndroid Build Coastguard Workerreverse-engineering the structure of the addressing in order to fit it into the
510*9880d681SAndroid Build Coastguard Workerstatic type of the original first operand. It isn't always possibly to fully
511*9880d681SAndroid Build Coastguard Workerreconstruct this structure; sometimes the underlying addressing doesn't
512*9880d681SAndroid Build Coastguard Workercorrespond with the static type at all. In such cases the optimizer instead will
513*9880d681SAndroid Build Coastguard Workeremit a GEP with the base pointer casted to a simple address-unit pointer, using
514*9880d681SAndroid Build Coastguard Workerthe name "uglygep". This isn't pretty, but it's just as valid, and it's
515*9880d681SAndroid Build Coastguard Workersufficient to preserve the pointer aliasing guarantees that GEP provides.
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard WorkerSummary
518*9880d681SAndroid Build Coastguard Worker=======
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard WorkerIn summary, here's some things to always remember about the GetElementPtr
521*9880d681SAndroid Build Coastguard Workerinstruction:
522*9880d681SAndroid Build Coastguard Worker
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker#. The GEP instruction never accesses memory, it only provides pointer
525*9880d681SAndroid Build Coastguard Worker   computations.
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker#. The first operand to the GEP instruction is always a pointer and it must be
528*9880d681SAndroid Build Coastguard Worker   indexed.
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker#. There are no superfluous indices for the GEP instruction.
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker#. Trailing zero indices are superfluous for pointer aliasing, but not for the
533*9880d681SAndroid Build Coastguard Worker   types of the pointers.
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker#. Leading zero indices are not superfluous for pointer aliasing nor the types
536*9880d681SAndroid Build Coastguard Worker   of the pointers.
537