oota-llvm.git
20 years agoAdd the prototype for the LoopExtractor Pass.
Misha Brukman [Sat, 28 Feb 2004 03:33:17 +0000 (03:33 +0000)]
Add the prototype for the LoopExtractor Pass.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11937 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoA pass that uses the generic CodeExtractor to rip out *every* loop in every
Misha Brukman [Sat, 28 Feb 2004 03:33:01 +0000 (03:33 +0000)]
A pass that uses the generic CodeExtractor to rip out *every* loop in every
function, as long as the loop isn't the only one in that function. This should
help debugging passes easier with BugPoint.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11936 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoA generic code extractor: given a list of BasicBlocks, it will rip them out into
Misha Brukman [Sat, 28 Feb 2004 03:26:20 +0000 (03:26 +0000)]
A generic code extractor: given a list of BasicBlocks, it will rip them out into
a new function, taking care of inputs and outputs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11935 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTwo testcases for loops: one with outputs, one without.
Misha Brukman [Sat, 28 Feb 2004 03:20:41 +0000 (03:20 +0000)]
Two testcases for loops: one with outputs, one without.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11934 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFurther comment updates.
Alkis Evlogimenos [Sat, 28 Feb 2004 03:20:31 +0000 (03:20 +0000)]
Further comment updates.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11933 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoUpdate comments.
Alkis Evlogimenos [Sat, 28 Feb 2004 03:12:31 +0000 (03:12 +0000)]
Update comments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11932 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMy previous commit broke the jit. The shift instructions always take
Alkis Evlogimenos [Sat, 28 Feb 2004 02:56:26 +0000 (02:56 +0000)]
My previous commit broke the jit. The shift instructions always take
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11931 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTurn off the SparcV9MachineCodeDestructionPass for now, because it's buggy
Brian Gaeke [Fri, 27 Feb 2004 21:15:40 +0000 (21:15 +0000)]
Turn off the SparcV9MachineCodeDestructionPass for now, because it's buggy

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11930 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoCorrect DestroyMachineFunction's getPassName
Brian Gaeke [Fri, 27 Feb 2004 21:01:14 +0000 (21:01 +0000)]
Correct DestroyMachineFunction's getPassName

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11929 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoOnly clone global nodes between graphs if both graphs have the global.
Chris Lattner [Fri, 27 Feb 2004 20:05:15 +0000 (20:05 +0000)]
Only clone global nodes between graphs if both graphs have the global.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11928 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoADD MORE FUNCTIONS!
Chris Lattner [Fri, 27 Feb 2004 20:04:48 +0000 (20:04 +0000)]
ADD MORE FUNCTIONS!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11927 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix argument size for SHL, SHR, SAR, SHLD and SHRD families of
Alkis Evlogimenos [Fri, 27 Feb 2004 19:46:30 +0000 (19:46 +0000)]
Fix argument size for SHL, SHR, SAR, SHLD and SHRD families of
instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11923 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix encoding of ADD and SUB family of instructions. Also rearrange
Alkis Evlogimenos [Fri, 27 Feb 2004 18:57:00 +0000 (18:57 +0000)]
Fix encoding of ADD and SUB family of instructions. Also rearrange
them so that they are consistent with AND, XOR, etc...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11922 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRename MRMS[0-7]{r,m} to MRM[0-7]{r,m}.
Alkis Evlogimenos [Fri, 27 Feb 2004 18:55:12 +0000 (18:55 +0000)]
Rename MRMS[0-7]{r,m} to MRM[0-7]{r,m}.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11921 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agosetcond instructions don't have aliasing implications.
Chris Lattner [Fri, 27 Feb 2004 18:09:25 +0000 (18:09 +0000)]
setcond instructions don't have aliasing implications.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11919 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdded d and hbd MultiSource applications.
John Criswell [Fri, 27 Feb 2004 18:02:06 +0000 (18:02 +0000)]
Added d and hbd MultiSource applications.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11915 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix Regression/Assembler/2004-02-27-SelfUseAssertError.ll
Chris Lattner [Fri, 27 Feb 2004 17:28:25 +0000 (17:28 +0000)]
Fix Regression/Assembler/2004-02-27-SelfUseAssertError.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11913 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix a verifier bug that was preventing us from ripping povray+libpng to pieces.
Chris Lattner [Fri, 27 Feb 2004 17:26:08 +0000 (17:26 +0000)]
Fix a verifier bug that was preventing us from ripping povray+libpng to pieces.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11912 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoBuild zlib and libpng
Chris Lattner [Fri, 27 Feb 2004 17:00:29 +0000 (17:00 +0000)]
Build zlib and libpng

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11911 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoUpdates from Reid
Chris Lattner [Fri, 27 Feb 2004 16:17:20 +0000 (16:17 +0000)]
Updates from Reid

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11908 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd memory operand folding support for the SETcc family of
Alkis Evlogimenos [Fri, 27 Feb 2004 16:13:37 +0000 (16:13 +0000)]
Add memory operand folding support for the SETcc family of
instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11907 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMake MachineOperand's immediate value an int and save 4 bytes out of
Alkis Evlogimenos [Fri, 27 Feb 2004 15:05:28 +0000 (15:05 +0000)]
Make MachineOperand's immediate value an int and save 4 bytes out of
each MachineOperand. We don't really need an int64_t immediate :-).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11906 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd memory operand folding support for SHLD and SHRD instructions.
Alkis Evlogimenos [Fri, 27 Feb 2004 15:03:18 +0000 (15:03 +0000)]
Add memory operand folding support for SHLD and SHRD instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11905 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd memory operand folding support for SHL, SHR and SAR, SHLD instructions.
Alkis Evlogimenos [Fri, 27 Feb 2004 09:28:43 +0000 (09:28 +0000)]
Add memory operand folding support for SHL, SHR and SAR, SHLD instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11903 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRename SHL, SHR, SAR, SHLD and SHLR instructions to make them
Alkis Evlogimenos [Fri, 27 Feb 2004 06:57:05 +0000 (06:57 +0000)]
Rename SHL, SHR, SAR, SHLD and SHLR instructions to make them
consistent with the rest and also pepare for the addition of their
memory operand variants.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11902 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoInitial checkin of document, contributed by Reid Spencer.
Chris Lattner [Fri, 27 Feb 2004 06:28:34 +0000 (06:28 +0000)]
Initial checkin of document, contributed by Reid Spencer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11901 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoImplement test/Regression/Transforms/InstCombine/canonicalize_branch.ll
Chris Lattner [Fri, 27 Feb 2004 06:27:46 +0000 (06:27 +0000)]
Implement test/Regression/Transforms/InstCombine/canonicalize_branch.ll

This is a really minor thing, but might help out the 'switch statement induction'
code in simplifycfg.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11900 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoThe instcombiner should canonicalize comparisons.
Chris Lattner [Fri, 27 Feb 2004 06:27:07 +0000 (06:27 +0000)]
The instcombiner should canonicalize comparisons.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11899 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRename member function to be consistent with the rest.
Alkis Evlogimenos [Fri, 27 Feb 2004 06:11:15 +0000 (06:11 +0000)]
Rename member function to be consistent with the rest.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11898 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd improvements to the code generator.
Alkis Evlogimenos [Fri, 27 Feb 2004 05:26:23 +0000 (05:26 +0000)]
Add improvements to the code generator.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11896 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMake spiller push stores right after the definition of a register so
Alkis Evlogimenos [Fri, 27 Feb 2004 04:51:35 +0000 (04:51 +0000)]
Make spiller push stores right after the definition of a register so
that they are as far away from the loads as possible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11895 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix crash caused by passing register 0 to
Alkis Evlogimenos [Fri, 27 Feb 2004 01:52:34 +0000 (01:52 +0000)]
Fix crash caused by passing register 0 to
MRegisterInfo::isPhysicalRegister().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11894 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoClear maps right after basic block is processed.
Alkis Evlogimenos [Thu, 26 Feb 2004 23:22:23 +0000 (23:22 +0000)]
Clear maps right after basic block is processed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11892 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoDoxygenify comments.
Misha Brukman [Thu, 26 Feb 2004 23:20:29 +0000 (23:20 +0000)]
Doxygenify comments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11891 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoDoxygenify and tersify comments.
Misha Brukman [Thu, 26 Feb 2004 23:20:08 +0000 (23:20 +0000)]
Doxygenify and tersify comments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11890 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdded PR258 and 259.
John Criswell [Thu, 26 Feb 2004 23:13:34 +0000 (23:13 +0000)]
Added PR258 and 259.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11889 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdded support for C++ compilation.
John Criswell [Thu, 26 Feb 2004 23:02:25 +0000 (23:02 +0000)]
Added support for C++ compilation.
Made removing the object files a separate sh command so that it can easily
be commented out.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11888 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoC++ version of llvm-native-gcc.
John Criswell [Thu, 26 Feb 2004 23:01:21 +0000 (23:01 +0000)]
C++ version of llvm-native-gcc.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11887 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFixed test case to actually check for the static declaration.
John Criswell [Thu, 26 Feb 2004 22:56:13 +0000 (22:56 +0000)]
Fixed test case to actually check for the static declaration.
Oops.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11886 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRegression tests for PR258 and PR259.
John Criswell [Thu, 26 Feb 2004 22:55:11 +0000 (22:55 +0000)]
Regression tests for PR258 and PR259.
2004-02-26-FPNotPrintableConstants.llx ensures that constants used in an
LLVM program are declared static if they are assigned to global variables.
2004-02-26-LinkOnceFunctions.llx ensures that linkonce functions get the
weak attribute.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11885 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFixes for PR258 and PR259.
John Criswell [Thu, 26 Feb 2004 22:20:58 +0000 (22:20 +0000)]
Fixes for PR258 and PR259.
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11884 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoBe a good little compiler and handle direct calls efficiently, even if there
Chris Lattner [Thu, 26 Feb 2004 22:07:22 +0000 (22:07 +0000)]
Be a good little compiler and handle direct calls efficiently, even if there
are beastly ConstantPointerRefs in the way...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11883 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoUncomment assertions that register# != 0 on calls to
Alkis Evlogimenos [Thu, 26 Feb 2004 22:00:20 +0000 (22:00 +0000)]
Uncomment assertions that register# != 0 on calls to
MRegisterInfo::is{Physical,Virtual}Register. Apply appropriate fixes
to relevant files.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11882 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoModified the default pathname for Povray.
John Criswell [Thu, 26 Feb 2004 20:22:59 +0000 (20:22 +0000)]
Modified the default pathname for Povray.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11881 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSince LLVM uses structure type equivalence, it isn't useful to keep around
Chris Lattner [Thu, 26 Feb 2004 20:02:23 +0000 (20:02 +0000)]
Since LLVM uses structure type equivalence, it isn't useful to keep around
multiple type names for the same structural type.  Make DTE eliminate all
but one of the type names

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11879 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAnnotations are evil. This makes Value not derive from Annotable, which makes
Chris Lattner [Thu, 26 Feb 2004 08:08:38 +0000 (08:08 +0000)]
Annotations are evil.  This makes Value not derive from Annotable, which makes
all dynamically allocated LLVM values 4 bytes smaller, eliminate some vtables, and
make Value's destructor faster.

This makes Function derive from Annotation now because it is the only core LLVM
class that still has an annotation stuck onto it: MachineFunction.
MachineFunction is obviously horrible and gross (like most other annotations), but
will be the subject of refactorings later in the future.  Besides many fewer
Function objects are dynamically allocated that instructions blocks, constants,
types, etc... :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11878 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoadd note
Chris Lattner [Thu, 26 Feb 2004 08:02:57 +0000 (08:02 +0000)]
add note

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11876 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoUse a map instead of annotations
Chris Lattner [Thu, 26 Feb 2004 08:02:17 +0000 (08:02 +0000)]
Use a map instead of annotations

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11875 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMake TargetData no longer use annotations!
Chris Lattner [Thu, 26 Feb 2004 08:01:57 +0000 (08:01 +0000)]
Make TargetData no longer use annotations!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11874 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoEliminate copy-and-paste comments
Chris Lattner [Thu, 26 Feb 2004 08:01:30 +0000 (08:01 +0000)]
Eliminate copy-and-paste comments

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11873 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoremove obsolete comment
Chris Lattner [Thu, 26 Feb 2004 07:59:22 +0000 (07:59 +0000)]
remove obsolete comment

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11872 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMake sure that at least one virtual method is defined in a .cpp file to avoid
Chris Lattner [Thu, 26 Feb 2004 07:24:18 +0000 (07:24 +0000)]
Make sure that at least one virtual method is defined in a .cpp file to avoid
having the compiler emit RTTI and vtables to EVERY translation unit.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11871 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoturn things like:
Chris Lattner [Thu, 26 Feb 2004 07:13:46 +0000 (07:13 +0000)]
turn things like:
   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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11870 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoNo need to clear the map here, it will always be empty
Chris Lattner [Thu, 26 Feb 2004 05:21:21 +0000 (05:21 +0000)]
No need to clear the map here, it will always be empty

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11868 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix a bug in the densemap that was killing the local allocator, and probably
Chris Lattner [Thu, 26 Feb 2004 05:00:15 +0000 (05:00 +0000)]
Fix a bug in the densemap that was killing the local allocator, and probably
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? :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11867 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRemove .micro references as those files no longer exist and add some more recent...
Alkis Evlogimenos [Thu, 26 Feb 2004 04:14:10 +0000 (04:14 +0000)]
Remove .micro references as those files no longer exist and add some more recent Makefile additions to the list

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11866 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix typeo. grow() cannot shrink storage. clear() should really nuke storage
Chris Lattner [Thu, 26 Feb 2004 04:07:12 +0000 (04:07 +0000)]
Fix typeo.  grow() cannot shrink storage.  clear() should really nuke storage

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11865 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix typo
Chris Lattner [Thu, 26 Feb 2004 03:45:03 +0000 (03:45 +0000)]
Fix typo

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11864 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoThe node doesn't have to be _no_ node flags, it just has to be complete and
Chris Lattner [Thu, 26 Feb 2004 03:43:43 +0000 (03:43 +0000)]
The node doesn't have to be _no_ node flags, it just has to be complete and
not have any globals.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11863 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd _more_ functions
Chris Lattner [Thu, 26 Feb 2004 03:43:08 +0000 (03:43 +0000)]
Add _more_ functions

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11862 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoWe have this snazzy link-time optimizer. How about we start using it? This
Chris Lattner [Thu, 26 Feb 2004 03:34:30 +0000 (03:34 +0000)]
We have this snazzy link-time optimizer.  How about we start using it?  This
removes some cruft from 255.vortex, cleaning up after DAE and IPCP, which
do horrible, beautiful, things to vortex.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11861 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix some warnings, some of which were spurious, and some of which were real
Chris Lattner [Thu, 26 Feb 2004 01:20:02 +0000 (01:20 +0000)]
Fix some warnings, some of which were spurious, and some of which were real
bugs.  Thanks Brian!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11859 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoInstructions to call and return from functions.
Misha Brukman [Thu, 26 Feb 2004 00:37:12 +0000 (00:37 +0000)]
Instructions to call and return from functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11858 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoOne B00g fixed.
Brian Gaeke [Thu, 26 Feb 2004 00:08:25 +0000 (00:08 +0000)]
One B00g fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11857 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTemporarily comment out asserts as they break things. I will uncomment
Alkis Evlogimenos [Wed, 25 Feb 2004 23:56:36 +0000 (23:56 +0000)]
Temporarily comment out asserts as they break things. I will uncomment
them when all the problem areas are fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11855 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix typo. I wonder how this actually worked.
Alkis Evlogimenos [Wed, 25 Feb 2004 23:47:17 +0000 (23:47 +0000)]
Fix typo. I wonder how this actually worked.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11854 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoComplete the SPEC_ROOT and USE_SPEC to SPEC2000_ROOT and USE_SPEC200 rename.
Alkis Evlogimenos [Wed, 25 Feb 2004 23:41:32 +0000 (23:41 +0000)]
Complete the SPEC_ROOT and USE_SPEC to SPEC2000_ROOT and USE_SPEC200 rename.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11853 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTwo changes:
Chris Lattner [Wed, 25 Feb 2004 23:36:08 +0000 (23:36 +0000)]
Two changes:
 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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11852 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoNew testcase
Chris Lattner [Wed, 25 Feb 2004 23:34:04 +0000 (23:34 +0000)]
New testcase

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11851 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoWhen building local graphs, clone the initializer for constant globals into each
Chris Lattner [Wed, 25 Feb 2004 23:31:02 +0000 (23:31 +0000)]
When building local graphs, clone the initializer for constant globals into each
local graph that uses the global.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11850 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix bugs found with recent addition of assertions in
Alkis Evlogimenos [Wed, 25 Feb 2004 23:21:52 +0000 (23:21 +0000)]
Fix bugs found with recent addition of assertions in
MRegisterInfo::is{Physical,Virtual}Register.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11849 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSimplify the dead node elimination stuff
Chris Lattner [Wed, 25 Feb 2004 23:08:00 +0000 (23:08 +0000)]
Simplify the dead node elimination stuff
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11848 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd a bunch more functions
Chris Lattner [Wed, 25 Feb 2004 23:06:40 +0000 (23:06 +0000)]
Add a bunch more functions

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11847 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTry harder to get symbol info
Chris Lattner [Wed, 25 Feb 2004 23:06:30 +0000 (23:06 +0000)]
Try harder to get symbol info

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11846 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRepresent va_list in interpreter as a (ec-stack-depth . var-arg-index)
Brian Gaeke [Wed, 25 Feb 2004 23:01:48 +0000 (23:01 +0000)]
Represent va_list in interpreter as a (ec-stack-depth . var-arg-index)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11845 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoGreat sparc renaming fallout IV: Sparc --> SparcV9.
Brian Gaeke [Wed, 25 Feb 2004 22:09:36 +0000 (22:09 +0000)]
Great sparc renaming fallout IV: Sparc --> SparcV9.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11844 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoDuh, forgot to close the parenthesis.
Alkis Evlogimenos [Wed, 25 Feb 2004 22:07:14 +0000 (22:07 +0000)]
Duh, forgot to close the parenthesis.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11843 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd assert to isPhysicalRegister and isVirtualRegister to fail when
Alkis Evlogimenos [Wed, 25 Feb 2004 22:04:28 +0000 (22:04 +0000)]
Add assert to isPhysicalRegister and isVirtualRegister to fail when
passed the special 'register' 0.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11842 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoRemove asssert since it is breaking cases that it shouldn't.
Alkis Evlogimenos [Wed, 25 Feb 2004 22:01:06 +0000 (22:01 +0000)]
Remove asssert since it is breaking cases that it shouldn't.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11841 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd DenseMap template and actually use it for for mapping virtual regs
Alkis Evlogimenos [Wed, 25 Feb 2004 21:55:45 +0000 (21:55 +0000)]
Add DenseMap template and actually use it for for mapping virtual regs
to objects.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11840 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd a new pass, run internalize first
Chris Lattner [Wed, 25 Feb 2004 21:35:13 +0000 (21:35 +0000)]
Add a new pass, run internalize first

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11839 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd a new pass
Chris Lattner [Wed, 25 Feb 2004 21:35:02 +0000 (21:35 +0000)]
Add a new pass

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11838 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd prototype
Chris Lattner [Wed, 25 Feb 2004 21:34:51 +0000 (21:34 +0000)]
Add prototype

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11837 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoMy faith in programmers has been found to be totally misplaced. One would
Chris Lattner [Wed, 25 Feb 2004 21:34:36 +0000 (21:34 +0000)]
My faith in programmers has been found to be totally misplaced.  One would
assume that if they don't intend to write to a global variable, that they
would mark it as constant.  However, there are people that don't understand
that the compiler can do nice things for them if they give it the information
it needs.

This pass looks for blatently obvious globals that are only ever read from.
Though it uses a trivially simple "alias analysis" of sorts, it is still able
to do amazing things to important benchmarks.  253.perlbmk, for example,
contains several ***GIANT*** function pointer tables that are not marked
constant and should be.  Marking them constant allows the optimizer to turn
a whole bunch of indirect calls into direct calls.  Note that only a link-time
optimizer can do this transformation, but perlbmk does have several strings
and other minor globals that can be marked constant by this pass when run
from GCCAS.

176.gcc has a ton of strings and large tables that are marked constant, both
at compile time (38 of them) and at link time (48 more).  Other benchmarks
give similar results, though it seems like big ones have disproportionally
more than small ones.

This pass is extremely quick and does good things.  I'm going to enable it
in gccas & gccld.  Not bad for 50 SLOC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11836 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSparcV8 regs are really 32-bit, not 64! Thanks, Chris.
Misha Brukman [Wed, 25 Feb 2004 21:03:02 +0000 (21:03 +0000)]
SparcV8 regs are really 32-bit, not 64! Thanks, Chris.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11835 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoClean up the tablegen descriptions for SparcV8.
Misha Brukman [Wed, 25 Feb 2004 21:02:21 +0000 (21:02 +0000)]
Clean up the tablegen descriptions for SparcV8.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11834 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix the SparcV8 register definitions that were imported from PPC template.
Misha Brukman [Wed, 25 Feb 2004 21:00:05 +0000 (21:00 +0000)]
Fix the SparcV8 register definitions that were imported from PPC template.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11833 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSparcV8 has different types of instructions, but F1 is only used for CALL.
Misha Brukman [Wed, 25 Feb 2004 20:52:20 +0000 (20:52 +0000)]
SparcV8 has different types of instructions, but F1 is only used for CALL.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11832 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoNote that this test is currently expected to fail.
Brian Gaeke [Wed, 25 Feb 2004 20:34:02 +0000 (20:34 +0000)]
Note that this test is currently expected to fail.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11831 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd an assertion
Chris Lattner [Wed, 25 Feb 2004 19:37:44 +0000 (19:37 +0000)]
Add an assertion

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11830 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix failures in 099.go due to the cfgsimplify pass creating switch instructions
Chris Lattner [Wed, 25 Feb 2004 19:30:19 +0000 (19:30 +0000)]
Fix failures in 099.go due to the cfgsimplify pass creating switch instructions
where there did not used to be any before

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11829 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSparcV8 skeleton
Brian Gaeke [Wed, 25 Feb 2004 19:28:19 +0000 (19:28 +0000)]
SparcV8 skeleton

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11828 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoGreat renaming part II: Sparc --> SparcV9 (also includes command-line options and...
Brian Gaeke [Wed, 25 Feb 2004 19:08:12 +0000 (19:08 +0000)]
Great renaming part II: Sparc --> SparcV9 (also includes command-line options and Makefiles)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11827 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoGreat renaming: Sparc --> SparcV9
Brian Gaeke [Wed, 25 Feb 2004 18:44:15 +0000 (18:44 +0000)]
Great renaming: Sparc --> SparcV9

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11826 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoAdd a bunch more functions used by perlbmk
Chris Lattner [Wed, 25 Feb 2004 17:43:20 +0000 (17:43 +0000)]
Add a bunch more functions used by perlbmk

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11824 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoUpdated to use llc to generate CBE code.
John Criswell [Wed, 25 Feb 2004 17:15:02 +0000 (17:15 +0000)]
Updated to use llc to generate CBE code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11823 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoSubstantial improvements and cleanups for the release notes. We were missing
Chris Lattner [Wed, 25 Feb 2004 16:36:51 +0000 (16:36 +0000)]
Substantial improvements and cleanups for the release notes.  We were missing
a bunch of stuff!  :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11822 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoFix incorrect debug code
Chris Lattner [Wed, 25 Feb 2004 15:15:04 +0000 (15:15 +0000)]
Fix incorrect debug code

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11821 91177308-0d34-0410-b5e6-96231b3b80d8

20 years agoTeach the instruction selector how to transform 'array' GEP computations into X86
Chris Lattner [Wed, 25 Feb 2004 07:00:55 +0000 (07:00 +0000)]
Teach the instruction selector how to transform 'array' GEP computations into X86
scaled indexes.  This allows us to compile GEP's like this:

int* %test([10 x { int, { int } }]* %X, int %Idx) {
        %Idx = cast int %Idx to long
        %X = getelementptr [10 x { int, { int } }]* %X, long 0, long %Idx, ubyte 1, ubyte 0
        ret int* %X
}

Into a single address computation:

test:
        mov %EAX, DWORD PTR [%ESP + 4]
        mov %ECX, DWORD PTR [%ESP + 8]
        lea %EAX, DWORD PTR [%EAX + 8*%ECX + 4]
        ret

Before it generated:
test:
        mov %EAX, DWORD PTR [%ESP + 4]
        mov %ECX, DWORD PTR [%ESP + 8]
        shl %ECX, 3
        add %EAX, %ECX
        lea %EAX, DWORD PTR [%EAX + 4]
        ret

This is useful for things like int/float/double arrays, as the indexing can be folded into
the loads&stores, reducing register pressure and decreasing the pressure on the decode unit.
With these changes, I expect our performance on 256.bzip2 and gzip to improve a lot.  On
bzip2 for example, we go from this:

10665 asm-printer           - Number of machine instrs printed
   40 ra-local              - Number of loads/stores folded into instructions
 1708 ra-local              - Number of loads added
 1532 ra-local              - Number of stores added
 1354 twoaddressinstruction - Number of instructions added
 1354 twoaddressinstruction - Number of two-address instructions
 2794 x86-peephole          - Number of peephole optimization performed

to this:
9873 asm-printer           - Number of machine instrs printed
  41 ra-local              - Number of loads/stores folded into instructions
1710 ra-local              - Number of loads added
1521 ra-local              - Number of stores added
 789 twoaddressinstruction - Number of instructions added
 789 twoaddressinstruction - Number of two-address instructions
2142 x86-peephole          - Number of peephole optimization performed

... and these types of instructions are often in tight loops.

Linear scan is also helped, but not as much.  It goes from:

8787 asm-printer           - Number of machine instrs printed
2389 liveintervals         - Number of identity moves eliminated after coalescing
2288 liveintervals         - Number of interval joins performed
3522 liveintervals         - Number of intervals after coalescing
5810 liveintervals         - Number of original intervals
 700 spiller               - Number of loads added
 487 spiller               - Number of stores added
 303 spiller               - Number of register spills
1354 twoaddressinstruction - Number of instructions added
1354 twoaddressinstruction - Number of two-address instructions
 363 x86-peephole          - Number of peephole optimization performed

to:

7982 asm-printer           - Number of machine instrs printed
1759 liveintervals         - Number of identity moves eliminated after coalescing
1658 liveintervals         - Number of interval joins performed
3282 liveintervals         - Number of intervals after coalescing
4940 liveintervals         - Number of original intervals
 635 spiller               - Number of loads added
 452 spiller               - Number of stores added
 288 spiller               - Number of register spills
 789 twoaddressinstruction - Number of instructions added
 789 twoaddressinstruction - Number of two-address instructions
 258 x86-peephole          - Number of peephole optimization performed

Though I'm not complaining about the drop in the number of intervals.  :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11820 91177308-0d34-0410-b5e6-96231b3b80d8

20 years ago* Make the previous patch more efficient by not allocating a temporary MachineInstr
Chris Lattner [Wed, 25 Feb 2004 06:13:04 +0000 (06:13 +0000)]
* Make the previous patch more efficient by not allocating a temporary MachineInstr
  to do analysis.

*** FOLD getelementptr instructions into loads and stores when possible,
    making use of some of the crazy X86 addressing modes.

For example, the following C++ program fragment:

struct complex {
    double re, im;
    complex(double r, double i) : re(r), im(i) {}
};
inline complex operator+(const complex& a, const complex& b) {
    return complex(a.re+b.re, a.im+b.im);
}
complex addone(const complex& arg) {
    return arg + complex(1,0);
}

Used to be compiled to:
_Z6addoneRK7complex:
        mov %EAX, DWORD PTR [%ESP + 4]
        mov %ECX, DWORD PTR [%ESP + 8]
***     mov %EDX, %ECX
        fld QWORD PTR [%EDX]
        fld1
        faddp %ST(1)
***     add %ECX, 8
        fld QWORD PTR [%ECX]
        fldz
        faddp %ST(1)
***     mov %ECX, %EAX
        fxch %ST(1)
        fstp QWORD PTR [%ECX]
***     add %EAX, 8
        fstp QWORD PTR [%EAX]
        ret

Now it is compiled to:
_Z6addoneRK7complex:
        mov %EAX, DWORD PTR [%ESP + 4]
        mov %ECX, DWORD PTR [%ESP + 8]
        fld QWORD PTR [%ECX]
        fld1
        faddp %ST(1)
        fld QWORD PTR [%ECX + 8]
        fldz
        faddp %ST(1)
        fxch %ST(1)
        fstp QWORD PTR [%EAX]
        fstp QWORD PTR [%EAX + 8]
        ret

Other programs should see similar improvements, across the board.  Note that
in addition to reducing instruction count, this also reduces register pressure
a lot, always a good thing on X86.  :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11819 91177308-0d34-0410-b5e6-96231b3b80d8