<div dir="ltr">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:<div>
<br></div><div style>$ cat struct1.ll</div><div><div>%mystruct = type { i32, i32 }</div><div><br></div><div>define i32 @foo(i32 %a) {</div><div>  %val = tail call %mystruct @llvm.my.intrinsic(i32 %a)</div><div>  %ret = extractvalue %mystruct %val, 0</div>
<div>  ret i32 %ret</div><div>}</div><div><br></div><div>declare %mystruct @llvm.my.intrinsic(i32)</div></div><div><br></div><div style>$ cat struct2.ll</div><div><div>%mytype = type { i32, i32 }</div><div><br></div><div>
define i32 @bar(i32 %a) {</div><div>  %val = tail call %mytype @llvm.my.intrinsic(i32 %a)</div><div>  %ret = extractvalue %mytype %val, 1</div><div>  ret i32 %ret</div><div>}</div><div><br></div><div>declare %mytype @llvm.my.intrinsic(i32)</div>
</div><div><br></div><div><div>$ bin/llvm-link struct1.ll struct2.ll -S</div><div>; ModuleID = 'struct1.ll'</div><div><br></div><div>%mystruct = type { i32, i32 }</div><div><br></div><div>define i32 @foo(i32 %a) {</div>
<div>  %val = tail call %mystruct @llvm.my.intrinsic(i32 %a)</div><div>  %ret = extractvalue %mystruct %val, 0</div><div>  ret i32 %ret</div><div>}</div><div><br></div><div>declare %mystruct @llvm.my.intrinsic(i32)</div><div>
<br></div><div>define i32 @bar(i32 %a) {</div><div>  %val = tail call %mystruct @llvm.my.intrinsic(i32 %a)</div><div>  %ret = extractvalue %mystruct %val, 1</div><div>  ret i32 %ret</div><div>}</div></div><div><br></div><div class="gmail_extra">
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?<br><br><div class="gmail_quote">On Sun, Dec 30, 2012 at 6:19 PM, NAKAMURA Takumi <span dir="ltr"><<a href="mailto:geek4civic@gmail.com" target="_blank">geek4civic@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Justin,<br>
<br>
<a href="http://llvm.org/docs/LangRef.html#structure-type" target="_blank">http://llvm.org/docs/LangRef.html#structure-type</a><br>
"Identified types can be recursive, can be opaqued, and are never uniqued."<br>
Do you think it would be less descriptive?<br>
<br>
"Identified type, aka named llvm::StructType, is never uniqued against<br>
other identified types nor literal types, aka unnamed StructType(s)."<br>
?<br>
<br>
See also; <a href="http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html" target="_blank">http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html</a><br>
<br>
...Takumi<br>
<br>
2012/12/30 Justin Holewinski <<a href="mailto:justin.holewinski@gmail.com">justin.holewinski@gmail.com</a>>:<br>
<div><div class="h5">> With primitive types, I can interchange literal usage and type aliases in<br>
> IR:<br>
><br>
> %mytype = type i32<br>
><br>
> define void @foo(%mytype* %ptr) {<br>
>   %t1 = load %mytype* %ptr<br>
>   store i32 %t1, i32* %ptr<br>
>   ret void<br>
> }<br>
><br>
> But for structs, I cannot:<br>
><br>
> %mytype = type { i32, i32 }<br>
><br>
> define void @foo(%mytype* %ptr) {<br>
>   %t1 = load %mytype* %ptr<br>
>   store { i32, i32 } %t1, { i32, i32 }* %ptr<br>
>   ret void<br>
> }<br>
><br>
> bin/llvm-as: alias2.ll:6:22: error: '%t1' defined with type '%mytype = type<br>
> { i32, i32 }'<br>
>   store { i32, i32 } %t1, { i32, i32 }* %ptr<br>
><br>
> I don't see anything in the language reference manual that disallows such<br>
> usage, as the literal struct type and %mytype are equivalent.  Am I missing<br>
> something here, or is this just a bug in the assembly parser?<br>
><br>
> --<br>
><br>
> Thanks,<br>
><br>
> Justin Holewinski<br>
><br>
</div></div>> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div>
</div></div>