[LLVMdev] Question about compilation result - taking address of input array member

Eli Bendersky eliben at google.com
Fri Feb 1 12:11:04 PST 2013


Hello,

I'm playing around with some LEA-related code generation on x86-64
(trunk LLVM & Clang), and I run into a case I don't understand:

$ cat takeaddr.c
int* bar(int table[10]) {
  return &table[2];
}

$ clang -cc1 -emit-llvm takeaddr.c
$ cat takeaddr.ll
; ModuleID = 'takeaddr.c'
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32* @bar(i32* %table) nounwind {
entry:
  %table.addr = alloca i32*, align 8
  store i32* %table, i32** %table.addr, align 8
  %0 = load i32** %table.addr, align 8
  %arrayidx = getelementptr inbounds i32* %0, i64 2
  ret i32* %arrayidx
}

$ llc -O3 takeaddr.ll -o -
.file "takeaddr.ll"
.text
.globl bar
.align 16, 0x90
.type bar, at function
bar:                                    # @bar
# BB#0:                                 # %entry
movq %rdi, -8(%rsp)
leaq 8(%rdi), %rax
ret
.Ltmp0:
.size bar, .Ltmp0-bar


.section ".note.GNU-stack","", at progbits

The first instruction in "bar" is not clear. Why is it needed? It
seems harmless, but does it serve any purpose? Alignment? ISTM that
the leaq suffices to pefrorm the actual task of the function. Is this
a missed optimization of some sort?

Thanks in advance,
Eli



More information about the llvm-dev mailing list