[LLVMdev] [RFC] Using i8 for boolean return types and arguments.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Mar 23 21:38:16 PDT 2012


With the optimization patch I emailed, clang compiles

bool f(bool *x) {
  return *x;
}

to

define zeroext i1 @_Z1fPb(i8* nocapture %x) nounwind uwtable readonly {
entry:
 %0 = load i8* %x, align 1, !tbaa !0, !range !3
 %tobool = icmp ne i8 %0, 0
 ret i1 %tobool
}

Which I think is the perfect IL if we are going to return an i1.
Unfortunately, this still codegens to

       cmpb    $0, (%rdi)
       setne   %al
       ret

One way to fix this is to implement
http://nondot.org/sabre/LLVMNotes/ExtendedIntegerResults.txt. The
attached patch does it for boolean types only. The result is that the
IL (after the optimizer simplify it) becomes

define i8 @_Z1fPb(i8* nocapture %x) nounwind readonly optsize {
entry:
  %0 = load i8* %x, align 1, !tbaa !0, !range !3
  ret i8 %0
}

and the assembly is

	movb	(%rdi), %al
	ret

What is lost is that anything using the function has no way to know
that the lest significant byte can only be 0 or 1. This is easier to
see with a boolean argument. Currently clang compiles

int f(bool x) {
  return x;
}

to

define i32 @_Z1fb(i1 zeroext %x) nounwind readnone optsize {
entry:
  %conv = zext i1 %x to i32
  ret i32 %conv
}

which codegens to

	movzbl	%dil, %eax
	ret

With this patch we regress to

define i32 @_Z1fb(i8 %x.coerce) nounwind readnone optsize {
entry:
  %0 = and i8 %x.coerce, 1
  %conv = zext i8 %0 to i32
  ret i32 %conv
}

and

	andl	$1, %edi
	movl	%edi, %eax
	ret

How should we handle this? The proposal on LLVMNotes is to have an
attribute of the form "zext_from(i8)", which requires extending what
parameter attributes are. Another option is allowing metadata on
parameters, in which case we would be able to just use the new range
metadata.

Has anyone tried adding metadata to parameters before?

Cheers,
Rafael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: t.patch
Type: text/x-patch
Size: 965 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120324/bb5017c8/attachment.bin>


More information about the llvm-dev mailing list