[LLVMdev] defining types structurally equivalent to a recursive type
Jianzhou Zhao
jianzhou at seas.upenn.edu
Thu Nov 11 06:45:48 PST 2010
On Thu, Nov 11, 2010 at 8:28 AM, Jianzhou Zhao <jianzhou at seas.upenn.edu> wrote:
> Hi all,
>
> http://www.llvm.org/docs/ProgrammersManual.html#BuildRecType suggests
> us to define recursive types via opaque and refine. Since LLVM has
> structural types, %rt = type { %rt* } and %rt1 = type { %rt* } should
> be same structurally. I tested the following code,
>
> %rt = type { %rt* }
> %rt1 = type { %rt* }
>
> define i32 @main() nounwind {
> entry:
> %0 = alloca %rt ; <%rt*> [#uses=1]
> %1 = alloca %rt ; <%rt*> [#uses=1]
> %2 = icmp eq %rt* %0, %1 ; <i1> [#uses=0]
> ret i32 0
> }
Sorry, my orginal test code is:
%rt = type { %rt* }
%rt1 = type { %rt* }
define i32 @main() nounwind {
entry:
%0 = alloca %rt
%1 = alloca %rt1
%2 = icmp eq %rt* %0, %1
ret i32 0
}
After llvm-as, llvm-dis, LLVM automatically renames all %rt1 to be
%rt. The 'icmp' is to test if LLVM takes them to be same, since icmp
requires operands be of same type.
>
> In the code, LLVM unifies %rt and %rt1 to be same, and picks %rt to
> represent them. If I define %rt %rt1 manually, can I first define %rt
> by opaque and refine, and then define %rt1 as normal structures ---
> defining %rt1 as a 'concreate' structure by Struct::Get with the
> element type %rt, since %rt1 is not a recursive type 'syntatically'.
> But I am wondering if I need PATypeHolder to protect %rt1. Will %rt1
> be deleted if LLVM finds it is same to %rt?
>
> Thanks.
> --
> Jianzhou
>
--
Jianzhou
More information about the llvm-dev
mailing list