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