[LLVMdev] Cannot interchange "literal" and "identified" structs
Justin Holewinski
justin.holewinski at gmail.com
Mon Dec 31 04:38:15 PST 2012
Alright, I misunderstood that statement then. This does seem to be
inconsistent with llvm-link, though. If I have two identified structs in
the same module, I cannot interchange them. But if they are in different
modules, llvm-link will merge them:
$ cat struct1.ll
%mystruct = type { i32, i32 }
define i32 @foo(i32 %a) {
%val = tail call %mystruct @llvm.my.intrinsic(i32 %a)
%ret = extractvalue %mystruct %val, 0
ret i32 %ret
}
declare %mystruct @llvm.my.intrinsic(i32)
$ cat struct2.ll
%mytype = type { i32, i32 }
define i32 @bar(i32 %a) {
%val = tail call %mytype @llvm.my.intrinsic(i32 %a)
%ret = extractvalue %mytype %val, 1
ret i32 %ret
}
declare %mytype @llvm.my.intrinsic(i32)
$ bin/llvm-link struct1.ll struct2.ll -S
; ModuleID = 'struct1.ll'
%mystruct = type { i32, i32 }
define i32 @foo(i32 %a) {
%val = tail call %mystruct @llvm.my.intrinsic(i32 %a)
%ret = extractvalue %mystruct %val, 0
ret i32 %ret
}
declare %mystruct @llvm.my.intrinsic(i32)
define i32 @bar(i32 %a) {
%val = tail call %mystruct @llvm.my.intrinsic(i32 %a)
%ret = extractvalue %mystruct %val, 1
ret i32 %ret
}
Shouldn't llvm-link throw an error saying %mystruct and %mytype are
different structs and @llvm.my.intrinsic cannot be double-defined with both
return types?
On Sun, Dec 30, 2012 at 6:19 PM, NAKAMURA Takumi <geek4civic at gmail.com>wrote:
> Justin,
>
> http://llvm.org/docs/LangRef.html#structure-type
> "Identified types can be recursive, can be opaqued, and are never uniqued."
> Do you think it would be less descriptive?
>
> "Identified type, aka named llvm::StructType, is never uniqued against
> other identified types nor literal types, aka unnamed StructType(s)."
> ?
>
> See also; http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html
>
> ...Takumi
>
> 2012/12/30 Justin Holewinski <justin.holewinski at gmail.com>:
> > With primitive types, I can interchange literal usage and type aliases in
> > IR:
> >
> > %mytype = type i32
> >
> > define void @foo(%mytype* %ptr) {
> > %t1 = load %mytype* %ptr
> > store i32 %t1, i32* %ptr
> > ret void
> > }
> >
> > But for structs, I cannot:
> >
> > %mytype = type { i32, i32 }
> >
> > define void @foo(%mytype* %ptr) {
> > %t1 = load %mytype* %ptr
> > store { i32, i32 } %t1, { i32, i32 }* %ptr
> > ret void
> > }
> >
> > bin/llvm-as: alias2.ll:6:22: error: '%t1' defined with type '%mytype =
> type
> > { i32, i32 }'
> > store { i32, i32 } %t1, { i32, i32 }* %ptr
> >
> > I don't see anything in the language reference manual that disallows such
> > usage, as the literal struct type and %mytype are equivalent. Am I
> missing
> > something here, or is this just a bug in the assembly parser?
> >
> > --
> >
> > Thanks,
> >
> > Justin Holewinski
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
>
--
Thanks,
Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121231/314b955f/attachment.html>
More information about the llvm-dev
mailing list