[PATCH] D125285: [BuildLibCalls] infer inreg param attrs from NumRegisterParameters

Nick Desaulniers via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 10 13:46:38 PDT 2022


nickdesaulniers marked an inline comment as done.
nickdesaulniers added a comment.

In D125285#3504529 <https://reviews.llvm.org/D125285#3504529>, @efriedma wrote:

> I can't find any libcalls with i64 arguments we emit in IR (on 32-bit targets).

Should I drop the `getTypeAllocSize` related check for now, if we can't provide test coverage? (I guess I could write a unittest, but plz no).



================
Comment at: llvm/test/Transforms/InstCombine/simplify-libcalls-inreg.ll:47
+
+; CHECK:     declare noundef i32 @sprintf(ptr inreg noalias nocapture noundef writeonly, ptr inreg nocapture noundef readonly, ...)
+; CHECK-NOT: declare noundef i32 @sprintf(ptr noalias nocapture noundef writeonly, ptr nocapture noundef readonly, ...)
----------------
nickdesaulniers wrote:
> efriedma wrote:
> > Is this inreg marking correct for sprintf?
> > 
> > Looking at clang output, we actually add inreg markings, but the backend ignores them.  I guess if we do the same thing, that's fine?
> > Is this inreg marking correct for sprintf?
> 
> sprintf takes two ptr params, then the rest are variadic; yes?
> 
> > I guess if we do the same thing, that's fine?
> 
> I think so:
> 
> ```
> // /tmp/sprintf.c
> #include <stdio.h>
> 
> char a [20];
> char b [20];
> 
> int x(void) {
>   return sprintf(a, b, "hello");
> }
> ```
> ```
> $ gcc -m32 -mregparm=3 -S -o - -O2 /tmp/sprintf.c -fno-pic -fno-asynchronous-unwind-tables
> ...
> x:
>         subl    $16, %esp
>         pushl   $.LC0
>         pushl   $b
>         pushl   $a
>         call    sprintf
>         addl    $28, %esp
>         ret
> $ clang -m32 -mregparm=3 -S -o - -O2 /tmp/sprintf.c -fno-pic -fno-asynchronous-unwind-tables
> ...
> x:                                      # @x
> # %bb.0:                                # %entry
>         subl    $16, %esp
>         pushl   $.L.str
>         pushl   $b
>         pushl   $a
>         calll   sprintf
>         addl    $28, %esp
>         retl
> ```
Or would you prefer then that I set none of the params as inreg for variadic? That way we don't rely on the backend DTRT?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125285/new/

https://reviews.llvm.org/D125285



More information about the llvm-commits mailing list