Skip to content
  1. Oct 12, 2011
    • Jakob Stoklund Olesen's avatar
      Use an existing function. · 35163e21
      Jakob Stoklund Olesen authored
      llvm-svn: 141763
      35163e21
    • Evan Cheng's avatar
      Fix r141744. · af138954
      Evan Cheng authored
      1. The speculation check may not have been performed if the BB hasn't had a load
         LICM candidate.
      2. If the candidate would be CSE'ed, then go ahead and speculatively LICM the
         instruction even if it's in high register pressure situation.
      
      llvm-svn: 141747
      af138954
    • Evan Cheng's avatar
      Refine r141689 with a tri-state variable. · f192ca07
      Evan Cheng authored
      Also teach MachineLICM to avoid "speculation" when register pressure is high.
      
      llvm-svn: 141744
      f192ca07
    • Eric Christopher's avatar
      Add a new wrapper node for a DILexicalBlock that encapsulates it and a · 6647b830
      Eric Christopher authored
      file. Since it should only be used when necessary propagate it through
      the backend code generation and tweak testcases accordingly.
      
      This helps with code like in clang's test/CodeGen/debug-info-line.c where
      we have multiple #line directives within a single lexical block and want
      to generate only a single block that contains each file change.
      
      Part of rdar://10246360
      
      llvm-svn: 141729
      6647b830
    • Eric Christopher's avatar
      Formatting. · 57d16927
      Eric Christopher authored
      llvm-svn: 141728
      57d16927
    • Bill Wendling's avatar
      N.B. This is with the new EH scheme: · 579ff6c3
      Bill Wendling authored
      The blocks with invokes have branches to the dispatch block, because that more
      correctly models the behavior of the CFG. The dispatch of course has edges to
      the landing pads. Those landing pads could contain invokes, which then have
      branches back to the dispatch. This creates a loop. The machine LICM pass looks
      at this loop and thinks it can hoist elements out of it. But because the
      dispatch is an alternate entry point into the program, the hoisted instructions
      won't be executed.
      
      I wasn't able to get a testcase which was small and could reproduce all of the
      time. The function_try_block.cpp in llvm-test was where this showed up.
      
      llvm-svn: 141726
      579ff6c3
  2. Oct 11, 2011
  3. Oct 10, 2011
  4. Oct 08, 2011
  5. Oct 07, 2011
  6. Oct 06, 2011
  7. Oct 05, 2011
    • Jakob Stoklund Olesen's avatar
      Remove unused DstSubIdx argument. · 3abead76
      Jakob Stoklund Olesen authored
      llvm-svn: 141214
      3abead76
    • Jakob Stoklund Olesen's avatar
      Simplify EXTRACT_SUBREG emission. · f7957a98
      Jakob Stoklund Olesen authored
      EXTRACT_SUBREG is emitted as %dst = COPY %src:sub, so there is no need to
      constrain the %dst register class.  RegisterCoalescer will apply the
      necessary constraints if it decides to eliminate the COPY.
      
      The %src register class does need to be constrained to something with
      the right sub-registers, though.  This is currently done manually with
      COPY_TO_REGCLASS nodes.  They can possibly be removed after this patch.
      
      llvm-svn: 141207
      f7957a98
    • Jakob Stoklund Olesen's avatar
      Simplify INSERT_SUBREG emission. · 8ff52c41
      Jakob Stoklund Olesen authored
      The register class created by INSERT_SUBREG and SUBREG_TO_REG must be
      legal and support the SubIdx sub-registers.
      
      The new getSubClassWithSubReg() hook can compute that.
      
      This may create INSERT_SUBREG instructions defining a larger register
      class than the sub-register being inserted.  That is OK,
      RegisterCoalescer will constrain the register class as needed when it
      eliminates the INSERT_SUBREG instructions.
      
      llvm-svn: 141198
      8ff52c41
    • Jakob Stoklund Olesen's avatar
      Add a FIXME. · ccdfbfb5
      Jakob Stoklund Olesen authored
      TwoAddressInstructionPass should annotate instructions with <undef>
      flags when it lower REG_SEQUENCE instructions.  LiveIntervals should not
      be in the business of modifying code (except for kill flags, perhaps).
      
      llvm-svn: 141187
      ccdfbfb5
    • Jakob Stoklund Olesen's avatar
      Also add <imp-use,kill> flags for redefined super-registers. · d5d39bb0
      Jakob Stoklund Olesen authored
      For example:
      
        %vreg10:dsub_0<def,undef> = COPY %vreg1
        %vreg10:dsub_1<def> = COPY %vreg2
      
      is rewritten as:
      
        %D2<def> = COPY %D0, %Q1<imp-def>
        %D3<def> = COPY %D1, %Q1<imp-use,kill>, %Q1<imp-def>
      
      The first COPY doesn't care about the previous value of %Q1, so it
      doesn't read that register.
      
      The second COPY is a partial redefinition of %Q1, so it implicitly kills
      and redefines that register.
      
      This makes it possible to recognize instructions that can harmlessly
      clobber the full super-register.  The write and don't read the
      super-register.
      
      llvm-svn: 141139
      d5d39bb0
    • Jakob Stoklund Olesen's avatar
      Also add <def,undef> flags when coalescing sub-registers. · 9d5bda9b
      Jakob Stoklund Olesen authored
      RegisterCoalescer can create sub-register defs when it is joining a
      register with a sub-register.  Add <undef> flags to these new
      sub-register defs where appropriate.
      
      llvm-svn: 141138
      9d5bda9b
    • Owen Anderson's avatar
      Teach the MC to output code/data region marker labels in MachO and ELF modes. ... · 0ca562ec
      Owen Anderson authored
      Teach the MC to output code/data region marker labels in MachO and ELF modes.  These are used by disassemblers to provide better disassembly, particularly on targets like ARM Thumb that like to intermingle data in the TEXT segment.
      
      llvm-svn: 141135
      0ca562ec
    • Bill Wendling's avatar
  8. Oct 04, 2011
    • Jakob Stoklund Olesen's avatar
      Allow <undef> flags on def operands as well as uses. · 10f2de32
      Jakob Stoklund Olesen authored
      The <undef> flag says that a MachineOperand doesn't read its register,
      or doesn't depend on the previous value of its register.
      
      A full register def never depends on the previous register value.  A
      partial register def may depend on the previous value if it is intended
      to update part of a register.
      
      For example:
      
        %vreg10:dsub_0<def,undef> = COPY %vreg1
        %vreg10:dsub_1<def> = COPY %vreg2
      
      The first copy instruction defines the full %vreg10 register with the
      bits not covered by dsub_0 defined as <undef>.  It is not considered a
      read of %vreg10.
      
      The second copy modifies part of %vreg10 while preserving the rest.  It
      has an implicit read of %vreg10.
      
      This patch adds a MachineOperand::readsReg() method to determine if an
      operand reads its register.
      
      Previously, this was modelled by adding a full-register <imp-def>
      operand to the instruction.  This approach makes it possible to
      determine directly from a MachineOperand if it reads its register.  No
      scanning of MI operands is required.
      
      llvm-svn: 141124
      10f2de32
    • Bill Wendling's avatar
      Generic cleanup. · ac3fb4c0
      Bill Wendling authored
      llvm-svn: 141050
      ac3fb4c0
    • Bill Wendling's avatar
      Don't carry over the dispatchsetup hack from the old system. · 97a8695f
      Bill Wendling authored
      llvm-svn: 141040
      97a8695f
  9. Oct 03, 2011
  10. Oct 01, 2011
    • Nadav Rotem's avatar
      Moved type construction out of the loop and added an assert on the legality of... · 52e8ed92
      Nadav Rotem authored
      Moved type construction out of the loop and added an assert on the legality of the type. Formatted lines to the 80 char limit.
      
      llvm-svn: 140952
      52e8ed92
    • Bill Wendling's avatar
      When inferring the pointer alignment, if the global doesn't have an initializer · 9925f197
      Bill Wendling authored
      and the alignment is 0 (i.e., it's defined globally in one file and declared in
      another file) it could get an alignment which is larger than the ABI allows for
      that type, resulting in aligned moves being used for unaligned loads.
      
      For instance, in file A.c:
      
         struct S s;
      
      In file B.c:
         struct {
           // something long
         };
         extern S s;
      
         void foo() {
           struct S p = s;
           // ...
         }
      
      this copy is a 'memcpy' which is turned into a series of 'movaps' instructions
      on X86. But this is wrong, because 'struct S' has alignment of 4, not 16.
      
      llvm-svn: 140902
      9925f197
Loading