diff options
-rw-r--r-- | lib/Target/README.txt | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 2db7e64..008271e 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -463,5 +463,42 @@ entry: ret int %tmp3 } +//===---------------------------------------------------------------------===// +on this code: + +unsigned array[4]; +unsigned foo(unsigned long x) { + return array[(x>>2)&3ul]; +} + +we should dag combine the left+right shift together. We currently get: + +_foo: + movl 4(%esp), %eax + shrl $2, %eax + andl $3, %eax + movl _array(,%eax,4), %eax + ret +similar on ppc: +_foo: + lis r2, ha16(_array) + srwi r3, r3, 2 + la r2, lo16(_array)(r2) + rlwinm r3, r3, 2, 28, 29 + lwzx r3, r2, r3 + blr + +similar on arm: + +_foo: + mov r3, #3 + and r3, r3, r0, lsr #2 + ldr r2, LCPI1_0 + ldr r0, [r2, +r3, lsl #2] + bx lr + +this is a trivial dag combine xform. + +//===---------------------------------------------------------------------===// |