https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84095
--- Comment #14 from Arnd Bergmann <arnd at linaro dot org> --- I applied the patches and seem to still get a warning for this: $ x86_64-linux-gcc-8.0.1 -Wall -O2 -c nmi_int.c nmi_int.c: In function 'nmi_setup': nmi_int.c:43:3: warning: 'memcpy' source argument is the same as destination [-Wrestrict] memcpy(per_cpu(cpu_msrs, cpu).counters, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ per_cpu(cpu_msrs, 0).counters, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sizeof(int) * model->num_counters); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ typedef unsigned long __kernel_size_t; extern void * memcpy(void *,const void *,__kernel_size_t); struct op_msrs { int *counters; }; #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask) #define for_each_cpu(cpu, mask) for ((cpu) = 0; (cpu) < 1; (cpu)++,(void)mask) extern struct cpumask __cpu_possible_mask; #define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask) #define DEFINE_PER_CPU(type, name) __typeof__(type) name #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); ptr; }) #define raw_cpu_ptr(ptr) per_cpu_ptr(ptr, 0) #define per_cpu(var, cpu) (*per_cpu_ptr(&(var), cpu)) extern void *pcpu_base_addr; extern const unsigned long *pcpu_unit_offsets; struct op_x86_model_spec { unsigned int num_counters; }; static struct op_x86_model_spec *model; static DEFINE_PER_CPU(struct op_msrs, cpu_msrs); int nmi_setup(void) { int err = 0; int cpu; for_each_possible_cpu(cpu) { if (!cpu) continue; memcpy(per_cpu(cpu_msrs, cpu).counters, per_cpu(cpu_msrs, 0).counters, sizeof(int) * model->num_counters); } return err; } In this code, we do copy from a variable onto itself, but only in a dead branch, here because the for_each_possible_cpu() and per_cpu() macros degrade to trivial wrappers on an non-SMP build.