Jimborean Alexandra
2011-Aug-30 15:10 UTC
[LLVMdev] compare two GEP instructions operand by operand
Hi, I have a question regarding the GEP instruction. Is it correct to consider that two GEP instructions compute the same memory address if and only if all their corresponding fields are equal? For instance, for a two-dimensional array of integers, can we have two GEP instructions that are equal? %arrayidx = getelementptr [10 x [30 x i32]]* @main.B, i64 0, i64 0, i64 %tmp157 %tmp = load i32* getelementptr inbounds ([10 x [30 x i32]]* @main.B, i64 0, i64 3, i64 10), align 8 although their corresponding indices are different? For instance if %tmp157 goes out of the bounds of the line 0 and computes the address of the 10th element in line 3. Thank you,Alexandra -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110830/a964c954/attachment.html>
Eli Friedman
2011-Aug-30 15:33 UTC
[LLVMdev] compare two GEP instructions operand by operand
On Tue, Aug 30, 2011 at 8:10 AM, Jimborean Alexandra <xinfinity_a at yahoo.com> wrote:> Hi, > I have a question regarding the GEP instruction. Is it correct to consider > that two GEP instructions compute the same memory address if and only if all > their corresponding fields are equal? > > For instance, for a two-dimensional array of integers, can we have two GEP > instructions that are equal? > > %arrayidx = getelementptr [10 x [30 x i32]]* @main.B, i64 0, i64 0, i64 > %tmp157 > %tmp = load i32* getelementptr inbounds ([10 x [30 x i32]]* @main.B, i64 > 0, i64 3, i64 10), align 8 > although their corresponding indices are different? For instance if %tmp157 > goes out of the bounds of the line 0 and computes the address of the 10th > element in line 3.LLVM allows those GEP's to evaluate to the same value. -Eli
John Criswell
2011-Aug-30 15:35 UTC
[LLVMdev] compare two GEP instructions operand by operand
On 8/30/11 10:10 AM, Jimborean Alexandra wrote:> Hi, > > I have a question regarding the GEP instruction. Is it correct to > consider that two GEP instructions compute the same memory address if > and only if all their corresponding fields are equal?It's more complicated than that. First, all the operands of the GEP must be dynamically identical for all executions. Second, the *type* of the pointer operands must be identical. The first requirement means that you can't just statically look at the SSA values and figure out if they're identical. Consider the following psuedo-LLVM IR/C code example: while (x > 0) { y = gep p, 0, x } z = gep p, 0, x The two GEPs have identical, static SSA operands but won't compute the same address because one is in a loop, and the other is not. You have to tack on some additional requirements, like requiring that y and z be in the same basic block. In short, you have to take control-dependence into account somehow. The second requirement handles issues like the following: p = global int y = gep p, 0, x z = gep cast p to char *, 0, x Note that requirement 1 is fulfilled, but because p is an int * when calculating y and a char * when calculating z, y and z will not be the same values. -- John T.> > For instance, for a two-dimensional array of integers, can we have two > GEP instructions that are equal? > > %arrayidx = getelementptr [10 x [30 x i32]]* @main.B, i64 0, i64 0, > i64 %tmp157 > > %tmp = load i32* getelementptr inbounds ([10 x [30 x i32]]* @main.B, > i64 0, i64 3, i64 10), align 8 > > although their corresponding indices are different? For instance if > %tmp157 goes out of the bounds of the line 0 and computes the address > of the 10th element in line 3. > > > Thank you, > Alexandra > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110830/c600aa99/attachment.html>
Reasonably Related Threads
- [LLVMdev] print the memory address computed by getelementptr
- [LLVMdev] print the memory address computed by getelementptr
- [LLVMdev] scalar evolution to determine access functions in arays
- [LLVMdev] print the memory address computed by getelementptr
- [LLVMdev] scalar evolution to determine access functions in arays