On Fri, 2020-06-26 at 23:54 +0200, Ilya Leoshkevich wrote:
> 
> How should this work ideally?  Suppose we have:
> 
> static inline void foo (int i)
> {
>   if (__builtin_is_constant_p (i))
>     asm volatile ("bar" :: "i" (i))
>   else
>     asm volatile ("baz" :: "d" (i));
> }
> 
> First of all, this is a supported use case, right?
Yes, this is a supported case.

> 
> Then, the way I see it, is that at least for a while there must exist
> trees like the ones above, regardless of whether their asm arguments
> match constraints.  But ultimately dead code elimination should get rid
> of the wrong ones before they reach RTL.

> 
> E.g. in the example above, the non-inlined version should have
> `!__builtin_is_constant_p (i)`, so `bar` should not survive until
> RTL.  The same for inlined `foo (1)` version's `baz`.
In theory yes, but there are cases where paths converge (like you've shown) 
where
you may have evaluated to a constant on the paths, but it's not a constant at 
the
convergence point.  You have to be very careful using b_c_p like this and it's
been a regular source of kernel bugs.


I'd recommend looking at the .ssa dump and walk forward from there if the .ssa
dump looks correct.

jeff

Reply via email to