add a note
authorChris Lattner <sabre@nondot.org>
Thu, 11 Nov 2010 18:23:57 +0000 (18:23 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 11 Nov 2010 18:23:57 +0000 (18:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118806 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/README.txt

index b27d99e18b5048187a62fac75f13633a412e2403..d1e4bfb075e6909651232a8bcf53b077d85fcb2f 100644 (file)
@@ -1984,3 +1984,31 @@ void check_c28 () {
 }
 
 //===---------------------------------------------------------------------===//
+
+We compile this:
+
+int foo(int a) { return (a & (~15)) / 16; }
+
+Into:
+
+define i32 @foo(i32 %a) nounwind readnone ssp {
+entry:
+  %and = and i32 %a, -16
+  %div = sdiv i32 %and, 16
+  ret i32 %div
+}
+
+but this code (X & -A)/A is X >> log2(A) when A is a power of 2, so this case
+should be instcombined into just "a >> 4".
+
+We do get this at the codegen level, so something knows about it, but 
+instcombine should catch it earlier:
+
+_foo:                                   ## @foo
+## BB#0:                                ## %entry
+       movl    %edi, %eax
+       sarl    $4, %eax
+       ret
+
+//===---------------------------------------------------------------------===//
+