add a note: we need whole-function selectiondags :)
authorChris Lattner <sabre@nondot.org>
Tue, 16 Jan 2007 06:39:48 +0000 (06:39 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 16 Jan 2007 06:39:48 +0000 (06:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33252 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/README.txt

index 9ea0a91daf518c27f1eec33dd3acd87ccf04c7b5..2f6ecfacd1255b49f08570edd1421fabec32ff90 100644 (file)
@@ -387,3 +387,31 @@ void good(unsigned x)
 to enable further optimizations.
 
 //===---------------------------------------------------------------------===//
+
+Consider:
+
+typedef unsigned U32;
+typedef unsigned long long U64;
+int test (U32 *inst, U64 *regs) {
+    U64 effective_addr2;
+    U32 temp = *inst;
+    int r1 = (temp >> 20) & 0xf;
+    int b2 = (temp >> 16) & 0xf;
+    effective_addr2 = temp & 0xfff;
+    if (b2) effective_addr2 += regs[b2];
+    b2 = (temp >> 12) & 0xf;
+    if (b2) effective_addr2 += regs[b2];
+    effective_addr2 &= regs[4];
+     if ((effective_addr2 & 3) == 0)
+        return 1;
+    return 0;
+}
+
+Note that only the low 2 bits of effective_addr2 are used.  On 32-bit systems,
+we don't eliminate the computation of the top half of effective_addr2 because
+we don't have whole-function selection dags.  On x86, this means we use one
+extra register for the function when effective_addr2 is declared as U64 than
+when it is declared U32.
+
+//===---------------------------------------------------------------------===//
+