[bpf] Avoid extra pointer arithmetic for stack access
authorAlexei Starovoitov <alexei.starovoitov@gmail.com>
Tue, 6 Oct 2015 04:00:53 +0000 (04:00 +0000)
committerAlexei Starovoitov <alexei.starovoitov@gmail.com>
Tue, 6 Oct 2015 04:00:53 +0000 (04:00 +0000)
commit49cdd6c3d109b734fea339568b147e4c06feed52
treefe39af43e4d472d10d5501109630e5848b7e309a
parent50bf4331f44b1cee0fcab3050d3b3d41ffa3a6ad
[bpf] Avoid extra pointer arithmetic for stack access

For the program like below
struct key_t {
  int pid;
  char name[16];
};
extern void test1(char *);
int test() {
  struct key_t key = {};
  test1(key.name);
  return 0;
}
For key.name, the llc/bpf may generate the below code:
  R1 = R10  // R10 is the frame pointer
  R1 += -24 // framepointer adjustment
  R1 |= 4   // R1 is then used as the first parameter of test1
OR operation is not recognized by in-kernel verifier.

This patch introduces an intermediate FI_ri instruction and
generates the following code that can be properly verified:
  R1 = R10
  R1 += -20

Patch by Yonghong Song <yhs@plumgrid.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249371 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/BPF/BPFISelDAGToDAG.cpp
lib/Target/BPF/BPFInstrInfo.td
lib/Target/BPF/BPFRegisterInfo.cpp
test/CodeGen/BPF/fi_ri.ll [new file with mode: 0644]