This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Why does GCC reload my array base pointer? (C++, ASM)
- From: David Pfander <David dot Pfander at ipvs dot uni-stuttgart dot de>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 11 Jul 2017 18:16:43 +0200
- Subject: Why does GCC reload my array base pointer? (C++, ASM)
- Authentication-results: sourceware.org; auth=none
Hello everyone,
I have some trouble understanding GCC's code generation. I'm accessing
different components of a big array. (Or in more detail: I'm writing a
struct-of-array abstraction in C++.) Now, I want to read different
components with minimal overhead, because this access takes place in an
extremely hot loop:
[...]
m[0] = expansions_SoA.value<0>(flat_index);
m[1] = expansions_SoA.value<1>(flat_index);
[...]
The expansions_SoA is an instance of a class that has the accessed array
as a member:
template <typename component_type, size_t num_components, size_t entries>
class struct_of_array_data {
private:
component_type* const data;
[...]
}
The array pointer is initialized, used and absolutely never changed (and
finally deleted[]).
If you now look at a screenshot of vtune (or gdb) ouput here:
http://imgur.com/a/7YJBC
You'll see that there is a suspicious mov instruction
movq (%rax), %rdx
over and over again. This reloads the "data" member, so basically it
reloads the same value.
My question is: Why isn't this value just kept in registers (it is
reused immediately)? (How) can I get rid of the duplicate load?
Best regards,
David Pfander