On Thu, Sep 03, 2015 at 05:25:43PM +0100, Kyrill Tkachov wrote: > >void g(void); > >void f(int *x) { if (*x & 2) g(); }
> A testcase I was looking at is: > int > foo (int a) > { > return (a & 7) != 0; > } > > For me this generates: > and w0, w0, 7 > cmp w0, wzr > cset w0, ne > ret > > when it could be: > tst w0, 7 > cset w0, ne > ret Interesting, thanks. That testcase with 4 (instead of 7) results in a single ubfx (a zero_extract) (this case is written differently before combine already, however). With 6 it does what you want (combine does not handle it as an extract, no matter what the docs say); and 7 is as you say (combine tries the extract, there is no insn like that). Segher