I just added a patch for bug 1085824, which includes several fixes for problems in the move resolver, designed to deal with insanity induced by having aliased registers. I would like to: Revert the move resolver to the state it was in originally (plus information about aliasing) Add in a second move resolver that just spills all registers to the stack, then loads them in order Rather than handling every corner case, if we ever run into a compound cycle (they are easy enough to detect, these were assertions in the original MoveResolver), fall back to the simple move resolver. I haven't checked yet, but my intuition tells me that these rare cases basically never come up in real code.
If it's going to be rewritten we should also consider fixing problems like these: [MoveGroup] 03dfe2c8 e52de004 str lr, [sp, #-4]! 03dfe2cc e59de09c ldr lr, [sp, #+156] 03dfe2d0 e58de070 str lr, [sp, #+112] 03dfe2d4 e59de000 ldr lr, [sp, #+0] 03dfe2d8 e28dd004 add sp, sp, #4 Two bugs in this sequence: (1) ip is available as a scratch so spilling and and restoring lr is unnecessary, and (2) the two last instructions could be merged into a regular pop. (Will attach the test case, which is trivial; this code is from a run with -D with the new disassembler; the block in question is not hot, but the code could be tighter even so.)
You need to log in before you can comment on or make changes to this bug.