PATCH: implement printf call lowering in the NVPTX backend

Jingyue Wu jingyue at
Thu Mar 27 10:46:23 PDT 2014

+    if (BufSize == 0) {

+      // If no arguments, pass a null pointer as the second argument to
+      BufferPtr = ConstantInt::get(Int32Ty, 0);

+    } else {

+      // Create the buffer to hold all the arguments. Align it to the
+      // alignment of the first object going into the buffer. Note: if
BufSize >
+      // 0, we know there's at least one object so getArgOperand(1) is
+      unsigned AlignOfFirst =

+          DL->getPrefTypeAlignment(Call->getArgOperand(1)->getType());

Does aligning the first argument ensures aligning other arguments? Consider
arguments, 1st 4-aligned, and 2nd 8-aligned. If the base of alloca is not a

multiple of 8, we can guarantee 2nd argument 8-aligned. For example, if the

base is 36, the address of 2nd argument is 36 + 8 which is not a multiple
of 8.

Is this alignment mandatory? Looks like getPrefTypeAlignment gives
type ailgnment". OK to use it here?

+      BufferPtr = new AllocaInst(Type::getInt8Ty(M.getContext()),

+                                 ConstantInt::get(Int32Ty, BufSize),

+                                 AlignOfFirst,

+                                 "buf_for_vprintf_args", Call);

On Wed, Mar 26, 2014 at 9:51 AM, Eli Bendersky <eliben at> wrote:

> Hello,
> This patch implements lowering of the printf call to the vprintf syscall
> in the NVPTX backend. It is implemented as a target-specific IR pass that
> runs before codegen. The pass builds the required data structure from the
> varargs to pass to the vprintf calls.
> Tests (IR to IR, and IR to PTX) included.
> Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the llvm-commits mailing list