New note about something bad happening in target independent optimizers
authorNate Begeman <natebegeman@mac.com>
Mon, 8 May 2006 20:08:28 +0000 (20:08 +0000)
committerNate Begeman <natebegeman@mac.com>
Mon, 8 May 2006 20:08:28 +0000 (20:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28170 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/README.txt

index 21d0165077400789ffa371ad5091e8fe50fea88e..fb6eca5da58fde6528644a6775775ac755e48e47 100644 (file)
@@ -492,8 +492,6 @@ transformation, good for PI.  See PPCISelLowering.cpp, this comment:
 
 ===-------------------------------------------------------------------------===
 
-Another missed rlwimi case:
-
 void %foo(uint *%tmp) {
         %tmp = load uint* %tmp          ; <uint> [#uses=3]
         %tmp1 = shr uint %tmp, ubyte 31         ; <uint> [#uses=1]
@@ -529,3 +527,21 @@ _foo:
         or r2, r2, r4
         stw r2, 0(r3)
         blr
+
+===-------------------------------------------------------------------------===
+
+Distilled from the code above, something wacky is going in the optimizers before
+code generation time...
+
+unsigned foo(unsigned x) {
+  return (unsigned)((unsigned char)(x >> 30) | (unsigned char)(x >> 31)) << 31;
+}
+
+unsigned bar(unsigned x) {
+  return ((x >> 30) | (x >> 31)) << 31;
+}
+
+generate different code when -O is passed to llvm-gcc.  However, when no
+optimization is specified and the output is passed into opt with just -mem2reg
+and -instcombine, the good code comes out of both. Something is happening before
+instcombine to confuse it, and not delete the no-op casts.