Dan implemented one multiply issue. Replace it with another. :)
authorChris Lattner <sabre@nondot.org>
Thu, 21 Feb 2008 06:51:29 +0000 (06:51 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 21 Feb 2008 06:51:29 +0000 (06:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47431 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index f6a0b7831ba2576cfca122f89dfc953ef510c670..736e299ad80bccf1fc0923f92f055bcf510d6bfd 100644 (file)
@@ -1392,23 +1392,44 @@ _foo:
 
 //===---------------------------------------------------------------------===//
 
-We're missing an obvious fold of a load into imul:
+We're codegen'ing multiply of long longs inefficiently:
 
-int test(long a, long b) { return a * b; } 
+unsigned long long LLM(unsigned long long arg1, unsigned long long arg2) {
+  return arg1 *  arg2;
+}
 
-LLVM produces:
-_test:
-        movl    4(%esp), %ecx
-        movl    8(%esp), %eax
-        imull   %ecx, %eax
-        ret
+We compile to (fomit-frame-pointer):
 
-vs:
-_test:
-        movl    8(%esp), %eax
-        imull   4(%esp), %eax
+_LLM:
+       pushl   %esi
+       movl    8(%esp), %ecx
+       movl    16(%esp), %esi
+       movl    %esi, %eax
+       mull    %ecx
+       imull   12(%esp), %esi
+       addl    %edx, %esi
+       imull   20(%esp), %ecx
+       movl    %esi, %edx
+       addl    %ecx, %edx
+       popl    %esi
+       ret
+
+This looks like a scheduling deficiency and lack of remat of the load from
+the argument area.  ICC apparently produces:
+
+        movl      8(%esp), %ecx
+        imull     12(%esp), %ecx
+        movl      16(%esp), %eax
+        imull     4(%esp), %eax 
+        addl      %eax, %ecx  
+        movl      4(%esp), %eax
+        mull      12(%esp) 
+        addl      %ecx, %edx
         ret
 
+Note that it remat'd loads from 4(esp) and 12(esp).  See this GCC PR:
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17236
+
 //===---------------------------------------------------------------------===//
 
 We can fold a store into "zeroing a reg".  Instead of: