Skip to content
  1. Nov 19, 2014
    • Kostya Serebryany's avatar
      Introduce llvm::SplitAllCriticalEdges · e5ea424a
      Kostya Serebryany authored
      Summary:
      move the code from BreakCriticalEdges::runOnFunction()
      into a separate utility function llvm::SplitAllCriticalEdges()
      so that it can be used independently.
      No functionality change intended.
      
      Test Plan: check-llvm
      
      Reviewers: nlewycky
      
      Reviewed By: nlewycky
      
      Subscribers: llvm-commits
      
      Differential Revision: http://reviews.llvm.org/D6313
      
      llvm-svn: 222288
      e5ea424a
  2. Nov 18, 2014
  3. Nov 17, 2014
    • Juergen Ributzka's avatar
      [SimplifyCFG] Make the value type of the hole check bitmask a power-of-2. · c9591e9b
      Juergen Ributzka authored
      When converting a switch to a lookup table we might have to generate a bitmaks
      to encode and check for holes in the original switch statement.
      
      The type of this mask depends on the number of switch statements, which can
      result in illegal types for pretty much all architectures.
      
      To avoid unnecessary type legalization and help FastISel this commit increases
      the size of the bitmask to next power-of-2 value when necessary.
      
      This fixes rdar://problem/18984639.
      
      llvm-svn: 222168
      c9591e9b
    • Erik Eckstein's avatar
      Optimize switch lookup tables with linear mapping. · 105374fe
      Erik Eckstein authored
      This is a simple optimization for switch table lookup:
      It computes the output value directly with an (optional) mul and add if there is a linear mapping between index and output.
      Example:
      
      int f1(int x) {
        switch (x) {
          case 0: return 10;
          case 1: return 11;
          case 2: return 12;
          case 3: return 13;
        }
        return 0;
      }
      
      generates:
      
      define i32 @f1(i32 %x) #0 {
      entry:
        %0 = icmp ult i32 %x, 4
        br i1 %0, label %switch.lookup, label %return
      
      switch.lookup:
        %switch.offset = add i32 %x, 10
        ret i32 %switch.offset
      
      return:
        ret i32 0
      }
      
      llvm-svn: 222121
      105374fe
  4. Nov 14, 2014
  5. Nov 13, 2014
    • Reid Kleckner's avatar
      Use nullptr instead of NULL for variadic sentinels · 971c3ea6
      Reid Kleckner authored
      Windows defines NULL to 0, which when used as an argument to a variadic
      function, is not a null pointer constant. As a result, Clang's
      -Wsentinel fires on this code. Using '0' would be wrong on most 64-bit
      platforms, but both MSVC and Clang make it work on Windows. Sidestep the
      issue with nullptr.
      
      llvm-svn: 221940
      971c3ea6
  6. Nov 12, 2014
  7. Nov 11, 2014
    • Duncan P. N. Exon Smith's avatar
      Revert "IR: MDNode => Value" · de36e804
      Duncan P. N. Exon Smith authored
      Instead, we're going to separate metadata from the Value hierarchy.  See
      PR21532.
      
      This reverts commit r221375.
      This reverts commit r221373.
      This reverts commit r221359.
      This reverts commit r221167.
      This reverts commit r221027.
      This reverts commit r221024.
      This reverts commit r221023.
      This reverts commit r220995.
      This reverts commit r220994.
      
      llvm-svn: 221711
      de36e804
  8. Nov 10, 2014
    • Juergen Ributzka's avatar
      [SwitchLowering] Fix the "fixPhis" function. · d441725d
      Juergen Ributzka authored
      Switch statements may have more than one incoming edge into the same BB if they
      all have the same value. When the switch statement is converted these incoming
      edges are now coming from multiple BBs. Updating all incoming values to be from
      a single BB is incorrect and would generate invalid LLVM IR.
      
      The fix is to only update the first occurrence of an incoming value. Switch
      lowering will perform subsequent calls to this helper function for each incoming
      edge with a new basic block - updating all edges in the process.
      
      This fixes rdar://problem/18916275.
      
      llvm-svn: 221627
      d441725d
    • Vasileios Kalintiris's avatar
      Fix extra semicolon warning. NFC. · ccde2a9a
      Vasileios Kalintiris authored
      llvm-svn: 221613
      ccde2a9a
  9. Nov 08, 2014
  10. Nov 07, 2014
    • Saleem Abdulrasool's avatar
      Transforms: use typedef rather than using aliases · 89c5ad4c
      Saleem Abdulrasool authored
      Visual Studio 2012 apparently does not support using alias declarations.  Use
      the more traditional typedef approach.  This should let the Windows buildbots
      pass.  NFC.
      
      llvm-svn: 221554
      89c5ad4c
    • Saleem Abdulrasool's avatar
      Transform: add SymbolRewriter pass · 5898e090
      Saleem Abdulrasool authored
      This introduces the symbol rewriter. This is an IR->IR transformation that is
      implemented as a CodeGenPrepare pass. This allows for the transparent
      adjustment of the symbols during compilation.
      
      It provides a clean, simple, elegant solution for symbol inter-positioning. This
      technique is often used, such as in the various sanitizers and performance
      analysis.
      
      The control of this is via a custom YAML syntax map file that indicates source
      to destination mapping, so as to avoid having the compiler to know the exact
      details of the source to destination transformations.
      
      llvm-svn: 221548
      5898e090
  11. Nov 05, 2014
  12. Nov 04, 2014
  13. Nov 03, 2014
  14. Nov 01, 2014
  15. Oct 28, 2014
    • Saleem Abdulrasool's avatar
      Transforms: reapply SVN r219899 · d178ada5
      Saleem Abdulrasool authored
      This restores the commit from SVN r219899 with an additional change to ensure
      that the CodeGen is correct for the case that was identified as being incorrect
      (originally PR7272).
      
      In the case that during inlining we need to synthesize a value on the stack
      (i.e. for passing a value byval), then any function involving that alloca must
      be stripped of its tailness as the restriction that it does not access the
      parent's stack no longer holds.  Unfortunately, a single alloca can cause a
      rippling effect through out the inlining as the value may be aliased or may be
      mutated through an escaped external call.  As such, we simply track if an alloca
      has been introduced in the frame during inlining, and strip any tail calls.
      
      llvm-svn: 220811
      d178ada5
    • NAKAMURA Takumi's avatar
      Untabify and whitespace cleanups. · 335a7bcf
      NAKAMURA Takumi authored
      llvm-svn: 220771
      335a7bcf
  16. Oct 23, 2014
    • Sanjay Patel's avatar
      Handle sqrt() shrinking in SimplifyLibCalls like any other call · 848309da
      Sanjay Patel authored
      This patch removes a chunk of special case logic for folding 
      (float)sqrt((double)x) -> sqrtf(x)
      in InstCombineCasts and handles it in the mainstream path of SimplifyLibCalls.
      
      No functional change intended, but I loosened the restriction on the existing
      sqrt testcases to allow for this optimization even without unsafe-fp-math because
      that's the existing behavior.
      
      I also added a missing test case for not shrinking the llvm.sqrt.f64 intrinsic
      in case the result is used as a double.
      
      Differential Revision: http://reviews.llvm.org/D5919
      
      llvm-svn: 220514
      848309da
  17. Oct 22, 2014
  18. Oct 21, 2014
    • Philip Reames's avatar
      Teach combineMetadata how to merge 'nonnull' metadata. · d7c21364
      Philip Reames authored
      combineMetadata is used when merging two instructions into one.  This change teaches it how to merge 'nonnull' - i.e. only preserve it on the new instruction if it's set on both sources.  This isn't actually used yet since I haven't adjusted any of the call sites to pass in nonnull as a 'known metadata'.  
      
      llvm-svn: 220325
      d7c21364
    • Paul Robinson's avatar
      Do not attribute static allocas to the call site's DebugLoc. · f60e0a16
      Paul Robinson authored
      When functions are inlined, instructions without debug information are
      attributed to the call site's DebugLoc. After inlining, inlined static
      allocas are moved to the caller's entry block, adjacent to the caller's
      original static alloca instructions. By retaining the call site's
      DebugLoc, these instructions could cause instructions that were
      subsequently inserted at the entry block to pick up the same DebugLoc.
      
      Patch by Wolfgang Pieb!
      
      llvm-svn: 220255
      f60e0a16
  19. Oct 16, 2014
    • Sanjay Patel's avatar
      fold: sqrt(x * x * y) -> fabs(x) * sqrt(y) · c699a611
      Sanjay Patel authored
      If a square root call has an FP multiplication argument that can be reassociated,
      then we can hoist a repeated factor out of the square root call and into a fabs().
      
      In the simplest case, this:
      
         y = sqrt(x * x);
      
      becomes this:
      
         y = fabs(x);
      
      This patch relies on an earlier optimization in instcombine or reassociate to put the
      multiplication tree into a canonical form, so we don't have to search over
      every permutation of the multiplication tree.
      
      Because there are no IR-level FastMathFlags for intrinsics (PR21290), we have to
      use function-level attributes to do this optimization. This needs to be fixed
      for both the intrinsics and in the backend.
      
      Differential Revision: http://reviews.llvm.org/D5787
      
      llvm-svn: 219944
      c699a611
    • Hal Finkel's avatar
      Preserve non-byval pointer alignment attributes using @llvm.assume when inlining · 68dc3c7a
      Hal Finkel authored
      For pointer-typed function arguments, enhanced alignment can be asserted using
      the 'align' attribute. When inlining, if this enhanced alignment information is
      not otherwise available, preserve it using @llvm.assume-based alignment
      assumptions.
      
      llvm-svn: 219876
      68dc3c7a
  20. Oct 14, 2014
  21. Oct 12, 2014
  22. Oct 10, 2014
    • Arnold Schwaighofer's avatar
      SimplifyCFG: Don't convert phis into selects if we could remove undef behavior · d7d010eb
      Arnold Schwaighofer authored
      instead
      
      We used to transform this:
      
        define void @test6(i1 %cond, i8* %ptr) {
        entry:
          br i1 %cond, label %bb1, label %bb2
      
        bb1:
          br label %bb2
      
        bb2:
          %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ]
          store i8 2, i8* %ptr.2, align 8
          ret void
        }
      
      into this:
      
        define void @test6(i1 %cond, i8* %ptr) {
          %ptr.2 = select i1 %cond, i8* null, i8* %ptr
          store i8 2, i8* %ptr.2, align 8
          ret void
        }
      
      because the simplifycfg transformation into selects would happen to happen
      before the simplifycfg transformation that removes unreachable control flow
      (We have 'unreachable control flow' due to the store to null which is undefined
      behavior).
      
      The existing transformation that removes unreachable control flow in simplifycfg
      is:
      
        /// If BB has an incoming value that will always trigger undefined behavior
        /// (eg. null pointer dereference), remove the branch leading here.
        static bool removeUndefIntroducingPredecessor(BasicBlock *BB)
      
      Now we generate:
      
        define void @test6(i1 %cond, i8* %ptr) {
          store i8 2, i8* %ptr.2, align 8
          ret void
        }
      
      I did not see any impact on the test-suite + externals.
      
      rdar://18596215
      
      llvm-svn: 219462
      d7d010eb
  23. Oct 07, 2014
    • Duncan P. N. Exon Smith's avatar
      LoopUnroll: Create sub-loops in LoopInfo · c46cfcbb
      Duncan P. N. Exon Smith authored
      `LoopUnrollPass` says that it preserves `LoopInfo` -- make it so.  In
      particular, tell `LoopInfo` about copies of inner loops when unrolling
      the outer loop.
      
      Conservatively, also tell `ScalarEvolution` to forget about the original
      versions of these loops, since their inputs may have changed.
      
      Fixes PR20987.
      
      llvm-svn: 219241
      c46cfcbb
    • Duncan P. N. Exon Smith's avatar
      LoopUnroll: Only check for ScalarEvolution analysis once, NFC · 9b4d37e8
      Duncan P. N. Exon Smith authored
      A follow-up commit will add use to a tight loop.  We might as well just
      find it once anyway.
      
      llvm-svn: 219239
      9b4d37e8
    • Marcello Maggioni's avatar
      Two case switch to select optimization · 963bc87d
      Marcello Maggioni authored
      This optimization tries to convert switch instructions that are used to select a value with only 2 unique cases + default block
      to a select or a couple of selects (depending if the default block is reachable or not).
      
      The typical case this optimization wants to be able to optimize is this one:
      
      Example:
      switch (a) {
        case 10:                %0 = icmp eq i32 %a, 10
          return 10;            %1 = select i1 %0, i32 10, i32 4
        case 20:        ---->   %2 = icmp eq i32 %a, 20
          return 2;             %3 = select i1 %2, i32 2, i32 %1
        default:
          return 4;
      }
      
      It also sets the base for further optimizations that are planned and being reviewed.
      
      llvm-svn: 219223
      963bc87d
    • Duncan P. N. Exon Smith's avatar
      LoopUnroll: Change code order of changes to new basic blocks · e5d7d979
      Duncan P. N. Exon Smith authored
      Add new basic blocks to `LoopInfo` earlier.  No functionality change
      intended (simplifies upcoming bugfix patch).
      
      llvm-svn: 219150
      e5d7d979
    • Duncan P. N. Exon Smith's avatar
      Sink comment, NFC · 0bbf5418
      Duncan P. N. Exon Smith authored
      llvm-svn: 219149
      0bbf5418
  24. Oct 01, 2014
Loading