From a1643ba71a6708cdbd7fd09c067ee5bc0a912ac1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 28 Dec 2007 22:30:05 +0000 Subject: [PATCH] add a note. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45388 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/README.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/Target/README.txt b/lib/Target/README.txt index b94bdeac94e..2ef77cb8d30 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -480,6 +480,38 @@ int i; } } +//===---------------------------------------------------------------------===// +We should investigate an instruction sinking pass. Consider this silly +example in pic mode: + +#include +void foo(int x) { + assert(x); + //... +} + +we compile this to: +_foo: + subl $28, %esp + call "L1$pb" +"L1$pb": + popl %eax + cmpl $0, 32(%esp) + je LBB1_2 # cond_true +LBB1_1: # return + # ... + addl $28, %esp + ret +LBB1_2: # cond_true +... + +The PIC base computation (call+popl) is only used on one path through the +code, but is currently always computed in the entry block. It would be +better to sink the picbase computation down into the block for the +assertion, as it is the only one that uses it. This happens for a lot of +code with early outs. + +In this case, whole-function-isel would also handle this. //===---------------------------------------------------------------------===//