Skip to content
  • Chris Lattner's avatar
    Reimplement rip-relative addressing in the X86-64 backend. The new · fea81da4
    Chris Lattner authored
    implementation primarily differs from the former in that the asmprinter
    doesn't make a zillion decisions about whether or not something will be
    RIP relative or not.  Instead, those decisions are made by isel lowering
    and propagated through to the asm printer.  To achieve this, we:
    
    1. Represent RIP relative addresses by setting the base of the X86 addr
       mode to X86::RIP.
    2. When ISel Lowering decides that it is safe to use RIP, it lowers to
       X86ISD::WrapperRIP.  When it is unsafe to use RIP, it lowers to
       X86ISD::Wrapper as before.
    3. This removes isRIPRel from X86ISelAddressMode, representing it with
       a basereg of RIP instead.
    4. The addressing mode matching logic in isel is greatly simplified.
    5. The asmprinter is greatly simplified, notably the "NotRIPRel" predicate
       passed through various printoperand routines is gone now.
    6. The various symbol printing routines in asmprinter now no longer infer
       when to emit (%rip), they just print the symbol.
    
    I think this is a big improvement over the previous situation.  It does have
    two small caveats though: 1. I implemented a horrible "no-rip" modifier for
    the inline asm "P" constraint modifier.  This is a short term hack, there is
    a much better, but more involved, solution.  2. I had to xfail an 
    -aggressive-remat testcase because it isn't handling the use of RIP in the
    constant-pool reading instruction.  This specific test is easy to fix without
    -aggressive-remat, which I intend to do next.
    
    llvm-svn: 74372
    fea81da4
Loading