Given 2 GEPs as follows, %tmp124 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, !dbg !1051 ; <[2 x i16]*> [#uses=1] %tmp125 = getelementptr inbounds [2 x i16]* %tmp124, i64 0, i64 0, !dbg !1051 ; <i16*> [#uses=1] can I replace the 2nd one with %tmp126 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, i64 0, i64 0 ; <i16*> When I try to create this instruction i get the follwoing error, opt: /home/vadve/aggarwa4/llvm27/llvm-2.7/include/llvm/Instructions.h:276: const llvm::Type* llvm::checkType(const llvm::Type*): Assertion `Ty && "Invalid GetElementPtrInst indices for type!"' failed. Thanks! Arushi -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110224/9637942c/attachment.html>
On 2/24/11 10:39 AM, Arushi Aggarwal wrote:> Given 2 GEPs as follows, > > %tmp124 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, > i32 5, !dbg !1051 ; <[2 x i16]*> [#uses=1] > %tmp125 = getelementptr inbounds [2 x i16]* %tmp124, i64 0, i64 0, > !dbg !1051 ; <i16*> [#uses=1] > > can I replace the 2nd one with > > %tmp126 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, > i32 5, i64 0, i64 0 ; <i16*>You should double-check the LangRef manual, but I think the problem stems from the fact that a GEP returns a pointer to the type found after all indexing is completed. So, in %tmp124, indexing %termptr.1 by i32 0 and i32 5 yields a [2xi16] type, and then the result of the GEP is a pointer to that, which is of type [2xi16] *. In the new GEP you've created, I think you can remove the first i64 0 index because the result of indexing i32 0 and i32 5 is a [2 x i16] and not a [2 x i16] *. -- John T.> > When I try to create this instruction i get the follwoing error, > > opt: > /home/vadve/aggarwa4/llvm27/llvm-2.7/include/llvm/Instructions.h:276: > const llvm::Type* llvm::checkType(const llvm::Type*): Assertion `Ty && > "Invalid GetElementPtrInst indices for type!"' failed. > > Thanks! > Arushi > > > > > > >
Thanks John. You are right. Is this also true for constant GEP expressions? Do they also create a pointer to the calculated type? The language manual does not state so explicitly. Arushi On Thu, Feb 24, 2011 at 10:47 AM, John Criswell <criswell at illinois.edu>wrote:> On 2/24/11 10:39 AM, Arushi Aggarwal wrote: > >> Given 2 GEPs as follows, >> >> %tmp124 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 >> 5, !dbg !1051 ; <[2 x i16]*> [#uses=1] >> %tmp125 = getelementptr inbounds [2 x i16]* %tmp124, i64 0, i64 0, !dbg >> !1051 ; <i16*> [#uses=1] >> >> can I replace the 2nd one with >> >> %tmp126 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 >> 5, i64 0, i64 0 ; <i16*> >> > > You should double-check the LangRef manual, but I think the problem stems > from the fact that a GEP returns a pointer to the type found after all > indexing is completed. > > So, in %tmp124, indexing %termptr.1 by i32 0 and i32 5 yields a [2xi16] > type, and then the result of the GEP is a pointer to that, which is of type > [2xi16] *. > > In the new GEP you've created, I think you can remove the first i64 0 index > because the result of indexing i32 0 and i32 5 is a [2 x i16] and not a [2 x > i16] *. > > -- John T. > > > >> When I try to create this instruction i get the follwoing error, >> >> opt: /home/vadve/aggarwa4/llvm27/llvm-2.7/include/llvm/Instructions.h:276: >> const llvm::Type* llvm::checkType(const llvm::Type*): Assertion `Ty && >> "Invalid GetElementPtrInst indices for type!"' failed. >> >> Thanks! >> Arushi >> >> >> >> >> >> >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110224/56e850bd/attachment.html>