[PATCH] D29591: [DAGCombiner] Support {a|s}ext, {a|z|s}ext load nodes in load combine
Simon Pilgrim via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 14 10:15:50 PST 2017
RKSimon added a subscriber: jmolloy.
RKSimon added inline comments.
================
Comment at: test/CodeGen/ARM/fp16-promote.ll:857
; CHECK-VFP: add sp, sp, #8
-; CHECK-VFP: bx lr
+; CHECK-VFP: pop
; CHECK-NOVFP: ldrh
----------------
filcab wrote:
> apilipenko wrote:
> > filcab wrote:
> > > This looks sketchy. Does `pop` change the PC on ARM? Did it appear but wasn't there?
> > > If so, shouldn't `bx lr` still be there, to go back to the caller? (I'm not very familiar with ARM asm)
> > Here is the codegen for this test case:
> > ```
> > test_extractelement:
> > .fnstart
> > @ BB#0:
> > .save {r4, r5, r11, lr}
> > push {r4, r5, r11, lr}
> > .pad #8
> > sub sp, sp, #8
> > ldrd r4, r5, [r1]
> > and r1, r2, #3
> > mov r2, sp
> > orr r1, r2, r1, lsl #1
> > stm sp, {r4, r5}
> > ldrh r1, [r1]
> > strh r1, [r0]
> > add sp, sp, #8
> > pop {r4, r5, r11, pc}
> > ```
> > So, in fact we push `lr` and then pop it to `pc`. I changed the pattern matching slightly to make it more clear.
> Ah. That makes sense, yes. I didn't remember you could pop multiple registers in that way.
> What doesn't make sense is that code.
> @rengolin Can you take a look at the post-patch `test_extractelement`?
> It's loading stuff onto registers only to spill it again and reload the actual data we want. It's also saving r11 for no reason.
>
@rengolin @jmolloy Please can you advise on the ARM codegen in test_extractelement? Is it something to worry about?
https://reviews.llvm.org/D29591
More information about the llvm-commits
mailing list