[LLVMdev] Loads not hoisted out of the loop
Krzysztof Parzyszek
kparzysz at codeaurora.org
Fri Jan 18 06:36:30 PST 2013
On 1/17/2013 11:33 PM, Owen Anderson wrote:
>
> Almost certainly, the compiler can't tell that the load from the struct
> (to get the array pointer) doesn't alias with the stores to the array
> itself. This is exactly the kind of thing that type-based alias
> analysis (-fstrict-aliasing) can help with. Use with caution, as it
> can break some type-unsafe idioms.
The problem is actually the stores to out->data. While "d" and "out"
are restricted pointers, it tells us nothing about the relation between
"d->data" and "out->data", since the "data" member is a pointer itself.
Since both "d->data" and "out->data" are both of type double, the
type-based alias analysis won't help.
In the case when you pass "double*" to the function, the restrict
keyword tells us that the arrays of doubles themselves do not alias,
which allows the compiler to infer that the loads and stores in the loop
do not depend on each other.
-Krzysztof
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list