Skip to content
  1. Feb 28, 2004
    • Alkis Evlogimenos's avatar
      Update comments. · f87966b8
      Alkis Evlogimenos authored
      llvm-svn: 11932
      f87966b8
    • Alkis Evlogimenos's avatar
      My previous commit broke the jit. The shift instructions always take · 2dbc79df
      Alkis Evlogimenos authored
      an 8-bit immediate. So mark the shifts that take immediates as taking
      an 8-bit argument. The rest with the implicit use of CL are marked
      appropriately.
      
      A bug still exists:
      
      def SHLDmri32  : I2A8 <"shld", 0xA4, MRMDestMem>, TB;           // [mem32] <<= [mem32],R32 imm8
      
      The immediate in the above instruction is 8-bit but the memory
      reference is 32-bit. The printer prints this as an 8-bit reference
      which confuses the assembler. Same with SHRDmri32.
      
      llvm-svn: 11931
      2dbc79df
  2. Feb 27, 2004
  3. Feb 26, 2004
    • John Criswell's avatar
      Fixes for PR258 and PR259. · feb7c49c
      John Criswell authored
      Functions with linkonce linkage are declared with weak linkage.
      Global floating point constants used to represent unprintable values
      (such as NaN and infinity) are declared static so that they don't interfere
      with other CBE generated translation units.
      
      llvm-svn: 11884
      feb7c49c
    • Chris Lattner's avatar
      Be a good little compiler and handle direct calls efficiently, even if there · 5ef1638d
      Chris Lattner authored
      are beastly ConstantPointerRefs in the way...
      
      llvm-svn: 11883
      5ef1638d
    • Alkis Evlogimenos's avatar
      Uncomment assertions that register# != 0 on calls to · 61719d48
      Alkis Evlogimenos authored
      MRegisterInfo::is{Physical,Virtual}Register. Apply appropriate fixes
      to relevant files.
      
      llvm-svn: 11882
      61719d48
    • Chris Lattner's avatar
      Since LLVM uses structure type equivalence, it isn't useful to keep around · 79636d7c
      Chris Lattner authored
      multiple type names for the same structural type.  Make DTE eliminate all
      but one of the type names
      
      llvm-svn: 11879
      79636d7c
    • Chris Lattner's avatar
      Use a map instead of annotations · 7140e469
      Chris Lattner authored
      llvm-svn: 11875
      7140e469
    • 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 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
      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
    • 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
      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
Loading