Skip to content
  1. Aug 30, 2012
  2. Aug 29, 2012
    • Andrew Trick's avatar
      Preserve branch profile metadata during switch formation. · 3051aa1c
      Andrew Trick authored
      Patch by Michael Ilseman!
      This fixes SimplifyCFGOpt::FoldValueComparisonIntoPredecessors to preserve metata when folding conditional branches into switches.
      
      void foo(int x) {
        if (x == 0)
          bar(1);
        else if (__builtin_expect(x == 10, 1))
          bar(2);
        else if (x == 20)
          bar(3);
      }
      
      CFG:
      
      B0
      |  \
      |   X0
      B10
      |  \
      |   X10
      B20
      |  \
      E   X20
      
      Merge B0-B10:
      w(B0-X0) = w(B0-X0)*sum-weights(B10) = w(B0-X0) * (w(B10-X10) + w(B10-B20))
      w(B0-X10) = w(B0-B10) * w(B10-X10)
      w(B0-B20) = w(B0-B10) * w(B10-B20)
      
      B0 __
      | \  \
      | X10 X0
      B20
      |  \
      E  X20
      
      Merge B0-B20:
      w(B0-X0) = w(B0-X0) * sum-weights(B20) = w(B0-X0) * (w(B20-E) + w(B20-X20))
      w(B0-X10) = w(B0-X10) * sum-weights(B20) = ...
      w(B0-X20) = w(B0-B20) * w(B20-X20)
      w(B0-E) = w(B0-B20) * w(B20-E)
      
      llvm-svn: 162868
      3051aa1c
Loading