Skip to content
  1. Feb 26, 2004
    • Chris Lattner's avatar
      remove obsolete comment · 234a2d4f
      Chris Lattner authored
      llvm-svn: 11872
      234a2d4f
    • Chris Lattner's avatar
      Make sure that at least one virtual method is defined in a .cpp file to avoid · 12003589
      Chris Lattner authored
      having the compiler emit RTTI and vtables to EVERY translation unit.
      
      llvm-svn: 11871
      12003589
    • Chris Lattner's avatar
      turn things like: · 21e941fb
      Chris Lattner authored
         if (X == 0 || X == 2)
      
      ...where the comparisons and branches are in different blocks... into a switch
      instruction.  This comes up a lot in various programs, and works well with
      the switch/switch merging code I checked earlier.  For example, this testcase:
      
      int switchtest(int C) {
        return C == 0 ? f(123) :
               C == 1 ? f(3123) :
               C == 4 ? f(312) :
               C == 5 ? f(1234): f(444);
      }
      
      is converted into this:
              switch int %C, label %cond_false.3 [
                       int 0, label %cond_true.0
                       int 1, label %cond_true.1
                       int 4, label %cond_true.2
                       int 5, label %cond_true.3
              ]
      
      instead of a whole bunch of conditional branches.
      
      Admittedly the code is ugly, and incomplete.  To be complete, we need to add
      br -> switch merging and switch -> br merging.  For example, this testcase:
      
      struct foo { int Q, R, Z; };
      #define A (X->Q+X->R * 123)
      int test(struct foo *X) {
        return A  == 123 ? X1() :
              A == 12321 ? X2():
              (A == 111 || A == 222) ? X3() :
              A == 875 ? X4() : X5();
      }
      
      Gets compiled to this:
              switch int %tmp.7, label %cond_false.2 [
                       int 123, label %cond_true.0
                       int 12321, label %cond_true.1
                       int 111, label %cond_true.2
                       int 222, label %cond_true.2
              ]
      ...
      cond_false.2:           ; preds = %entry
              %tmp.52 = seteq int %tmp.7, 875         ; <bool> [#uses=1]
              br bool %tmp.52, label %cond_true.3, label %cond_false.3
      
      where the branch could be folded into the switch.
      
      This kind of thing occurs *ALL OF THE TIME*, especially in programs like
      176.gcc, which is a horrible mess of code.  It contains stuff like *shudder*:
      
      #define SWITCH_TAKES_ARG(CHAR) \
        (   (CHAR) == 'D' \
         || (CHAR) == 'U' \
         || (CHAR) == 'o' \
         || (CHAR) == 'e' \
         || (CHAR) == 'u' \
         || (CHAR) == 'I' \
         || (CHAR) == 'm' \
         || (CHAR) == 'L' \
         || (CHAR) == 'A' \
         || (CHAR) == 'h' \
         || (CHAR) == 'z')
      
      and
      
      #define CONST_OK_FOR_LETTER_P(VALUE, C)                 \
        ((C) == 'I' ? SMALL_INTVAL (VALUE)                    \
         : (C) == 'J' ? SMALL_INTVAL (-(VALUE))               \
         : (C) == 'K' ? (unsigned)(VALUE) < 32                \
         : (C) == 'L' ? ((VALUE) & 0xffff) == 0               \
         : (C) == 'M' ? integer_ok_for_set (VALUE)            \
         : (C) == 'N' ? (VALUE) < 0                           \
         : (C) == 'O' ? (VALUE) == 0                          \
         : (C) == 'P' ? (VALUE) >= 0                          \
         : 0)
      
      and
      
      #define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)                     \
      {                                                               \
        if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1))) \
          (X) = gen_rtx (PLUS, SImode, XEXP (X, 0),                   \
                         copy_to_mode_reg (SImode, XEXP (X, 1)));     \
        if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 0))) \
          (X) = gen_rtx (PLUS, SImode, XEXP (X, 1),                   \
                         copy_to_mode_reg (SImode, XEXP (X, 0)));     \
        if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == MULT)   \
          (X) = gen_rtx (PLUS, SImode, XEXP (X, 1),                   \
                         force_operand (XEXP (X, 0), 0));             \
        if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == MULT)   \
          (X) = gen_rtx (PLUS, SImode, XEXP (X, 0),                   \
                         force_operand (XEXP (X, 1), 0));             \
        if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == PLUS)   \
          (X) = gen_rtx (PLUS, Pmode, force_operand (XEXP (X, 0), NULL_RTX),\
                         XEXP (X, 1));                                \
        if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == PLUS)   \
          (X) = gen_rtx (PLUS, Pmode, XEXP (X, 0),                    \
                         force_operand (XEXP (X, 1), NULL_RTX));      \
        if (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST       \
                 || GET_CODE (X) == LABEL_REF)                        \
          (X) = legitimize_address (flag_pic, X, 0, 0);               \
        if (memory_address_p (MODE, X))                               \
          goto WIN; }
      
      and others.  These macros get used multiple times of course.  These are such
      lovely candidates for macros, aren't they?  :)
      
      This code also nicely handles LLVM constructs that look like this:
      
        if (isa<CastInst>(I))
         ...
        else if (isa<BranchInst>(I))
         ...
        else if (isa<SetCondInst>(I))
         ...
        else if (isa<UnwindInst>(I))
         ...
        else if (isa<VAArgInst>(I))
         ...
      
      where the isa can obviously be a dyn_cast as well.  Switch instructions are a
      good thing.
      
      llvm-svn: 11870
      21e941fb
    • Chris Lattner's avatar
      No need to clear the map here, it will always be empty · 28a08859
      Chris Lattner authored
      llvm-svn: 11868
      28a08859
    • Chris Lattner's avatar
      Fix a bug in the densemap that was killing the local allocator, and probably · 5e39cf9f
      Chris Lattner authored
      other clients.  The problem is that the nullVal member was left to the default
      constructor to initialize, which for int's does nothing (ie, leaves it unspecified).
      
      To get a zero value, we must use T().  It's C++ wonderful? :)
      
      llvm-svn: 11867
      5e39cf9f
    • Alkis Evlogimenos's avatar
      Remove .micro references as those files no longer exist and add some more... · e008a4b2
      Alkis Evlogimenos authored
      Remove .micro references as those files no longer exist and add some more recent Makefile additions to the list
      
      llvm-svn: 11866
      e008a4b2
    • Chris Lattner's avatar
      973556b7
    • Chris Lattner's avatar
      Fix typo · 36ab728f
      Chris Lattner authored
      llvm-svn: 11864
      36ab728f
    • Chris Lattner's avatar
      The node doesn't have to be _no_ node flags, it just has to be complete and · 128e8419
      Chris Lattner authored
      not have any globals.
      
      llvm-svn: 11863
      128e8419
    • Chris Lattner's avatar
      Add _more_ functions · c8167b0e
      Chris Lattner authored
      llvm-svn: 11862
      c8167b0e
    • Chris Lattner's avatar
      We have this snazzy link-time optimizer. How about we start using it? This · 73687be9
      Chris Lattner authored
      removes some cruft from 255.vortex, cleaning up after DAE and IPCP, which
      do horrible, beautiful, things to vortex.
      
      llvm-svn: 11861
      73687be9
    • Chris Lattner's avatar
      Fix some warnings, some of which were spurious, and some of which were real · 9192bbda
      Chris Lattner authored
      bugs.  Thanks Brian!
      
      llvm-svn: 11859
      9192bbda
    • Misha Brukman's avatar
      Instructions to call and return from functions. · 1743c409
      Misha Brukman authored
      llvm-svn: 11858
      1743c409
    • Brian Gaeke's avatar
      One B00g fixed. · 11331e5d
      Brian Gaeke authored
      llvm-svn: 11857
      11331e5d
    • Alkis Evlogimenos's avatar
      Temporarily comment out asserts as they break things. I will uncomment · 802cf52b
      Alkis Evlogimenos authored
      them when all the problem areas are fixed.
      
      llvm-svn: 11855
      802cf52b
    • Alkis Evlogimenos's avatar
      Fix typo. I wonder how this actually worked. · 19aaae3f
      Alkis Evlogimenos authored
      llvm-svn: 11854
      19aaae3f
    • Alkis Evlogimenos's avatar
    • Chris Lattner's avatar
      Two changes: · 71626b8f
      Chris Lattner authored
       1. Functions do not make things incomplete, only variables
       2. Constant global variables no longer need to be marked incomplete, because
          we are guaranteed that the initializer for the global will be in the
          graph we are hacking on now.  This makes resolution of indirect calls happen
          a lot more in the bu pass, supports things like vtables and the C counterparts
          (giant constant arrays of function pointers), etc...
      
      Testcase here: test/Regression/Analysis/DSGraph/constant_globals.ll
      
      llvm-svn: 11852
      71626b8f
    • Chris Lattner's avatar
      New testcase · fc0912d0
      Chris Lattner authored
      llvm-svn: 11851
      fc0912d0
    • Chris Lattner's avatar
      When building local graphs, clone the initializer for constant globals into each · fab2872b
      Chris Lattner authored
      local graph that uses the global.
      
      llvm-svn: 11850
      fab2872b
    • Alkis Evlogimenos's avatar
      Fix bugs found with recent addition of assertions in · e62ddd40
      Alkis Evlogimenos authored
      MRegisterInfo::is{Physical,Virtual}Register.
      
      llvm-svn: 11849
      e62ddd40
    • Chris Lattner's avatar
      Simplify the dead node elimination stuff · 6ce59b4a
      Chris Lattner authored
      Make the incompleteness marker faster by looping directly over the globals
      instead of over the scalars to find the globals
      
      Fix a bug where we didn't mark a global incomplete if it didn't have any
      outgoing edges.  This wouldn't break any current clients but is still wrong.
      
      llvm-svn: 11848
      6ce59b4a
    • Chris Lattner's avatar
      Add a bunch more functions · 5e5e0606
      Chris Lattner authored
      llvm-svn: 11847
      5e5e0606
    • Chris Lattner's avatar
      Try harder to get symbol info · 17bce881
      Chris Lattner authored
      llvm-svn: 11846
      17bce881
    • Brian Gaeke's avatar
      Represent va_list in interpreter as a (ec-stack-depth . var-arg-index) · 7b4be13f
      Brian Gaeke authored
      pair, and look up varargs in the execution stack every time, instead of
      just pushing iterators (which can be invalidated during callFunction())
      around.  (union GenericValue now has a "pair of uints" member, to support
      this mechanism.) Fixes Bug 234.
      
      llvm-svn: 11845
      7b4be13f
  2. Feb 25, 2004
Loading