[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