Rename isWeakForLinker to mayBeOverridden. Use it
[oota-llvm.git] / lib / Target / PowerPC / README.txt
index 10ee323954693e6e5e0d7b3e8a91e323de240ee8..e5d4002846ebde813221a819f09791f386d53699 100644 (file)
@@ -3,7 +3,7 @@
 TODO:
 * gpr0 allocation
 * implement do-loop -> bdnz transform
-* __builtin_return_address not supported on PPC
+* lmw/stmw pass a la arm load store optimizer for prolog/epilog
 
 ===-------------------------------------------------------------------------===
 
@@ -153,29 +153,6 @@ more than one use.  Itanium will want this too.
 
 ===-------------------------------------------------------------------------===
 
-Compile this:
-
-int %f1(int %a, int %b) {
-        %tmp.1 = and int %a, 15         ; <int> [#uses=1]
-        %tmp.3 = and int %b, 240                ; <int> [#uses=1]
-        %tmp.4 = or int %tmp.3, %tmp.1          ; <int> [#uses=1]
-        ret int %tmp.4
-}
-
-without a copy.  We make this currently:
-
-_f1:
-        rlwinm r2, r4, 0, 24, 27
-        rlwimi r2, r3, 0, 28, 31
-        or r3, r2, r2
-        blr
-
-The two-addr pass or RA needs to learn when it is profitable to commute an
-instruction to avoid a copy AFTER the 2-addr instruction.  The 2-addr pass
-currently only commutes to avoid inserting a copy BEFORE the two addr instr.
-
-===-------------------------------------------------------------------------===
-
 Compile offsets from allocas:
 
 int *%test() {
@@ -677,5 +654,101 @@ LBB1_1: ;bb
         cmplwi cr0, r6, 33920
         bne cr0, LBB1_1
 
-===-------------------------------------------------------------------------===
+//===---------------------------------------------------------------------===//
+
+This:
+        #include <algorithm>
+        inline std::pair<unsigned, bool> full_add(unsigned a, unsigned b)
+        { return std::make_pair(a + b, a + b < a); }
+        bool no_overflow(unsigned a, unsigned b)
+        { return !full_add(a, b).second; }
+
+Should compile to:
 
+__Z11no_overflowjj:
+        add r4,r3,r4
+        subfc r3,r3,r4
+        li r3,0
+        adde r3,r3,r3
+        blr
+
+(or better) not:
+
+__Z11no_overflowjj:
+        add r2, r4, r3
+        cmplw cr7, r2, r3
+        mfcr r2
+        rlwinm r2, r2, 29, 31, 31
+        xori r3, r2, 1
+        blr 
+
+//===---------------------------------------------------------------------===//
+
+We compile some FP comparisons into an mfcr with two rlwinms and an or.  For
+example:
+#include <math.h>
+int test(double x, double y) { return islessequal(x, y);}
+int test2(double x, double y) {  return islessgreater(x, y);}
+int test3(double x, double y) {  return !islessequal(x, y);}
+
+Compiles into (all three are similar, but the bits differ):
+
+_test:
+       fcmpu cr7, f1, f2
+       mfcr r2
+       rlwinm r3, r2, 29, 31, 31
+       rlwinm r2, r2, 31, 31, 31
+       or r3, r2, r3
+       blr 
+
+GCC compiles this into:
+
+ _test:
+       fcmpu cr7,f1,f2
+       cror 30,28,30
+       mfcr r3
+       rlwinm r3,r3,31,1
+       blr
+        
+which is more efficient and can use mfocr.  See PR642 for some more context.
+
+//===---------------------------------------------------------------------===//
+
+void foo(float *data, float d) {
+   long i;
+   for (i = 0; i < 8000; i++)
+      data[i] = d;
+}
+void foo2(float *data, float d) {
+   long i;
+   data--;
+   for (i = 0; i < 8000; i++) {
+      data[1] = d;
+      data++;
+   }
+}
+
+These compile to:
+
+_foo:
+       li r2, 0
+LBB1_1:        ; bb
+       addi r4, r2, 4
+       stfsx f1, r3, r2
+       cmplwi cr0, r4, 32000
+       mr r2, r4
+       bne cr0, LBB1_1 ; bb
+       blr 
+_foo2:
+       li r2, 0
+LBB2_1:        ; bb
+       addi r4, r2, 4
+       stfsx f1, r3, r2
+       cmplwi cr0, r4, 32000
+       mr r2, r4
+       bne cr0, LBB2_1 ; bb
+       blr 
+
+The 'mr' could be eliminated to folding the add into the cmp better.
+
+//===---------------------------------------------------------------------===//