Hi all, in the following example g++ (at least avr-g++) doesn't optimize the call f(n2) to use a single value register as in the case of f(n1). Is this a bug or can one use some option to enforce that. Version: gcc-7.1.0 #include <cstdint> #include <type_traits> struct A { A() = default; A(const volatile A& o) : m1(o.m1) {} uint8_t m1{0}; }; volatile uint8_t v; template<typename T> void f(const T& x) __attribute__((noinline)); template<typename T> void f(const T& x) { if constexpr(std::is_same<std::remove_cv_t<T>, A>::value) { v = x.m1; } else { v = x; } } volatile uint8_t v1; uint8_t n1; volatile A v2; A n2; int main() { f(v1); f(n1); f(v2); f(n2); } The generated machine code: .text .type void f<unsigned char>(unsigned char const&) [clone .isra.0], @function void f<unsigned char>(unsigned char const&) [clone .isra.0]: sts v,r24 ; v, ISRA.2 ret .size void f<unsigned char>(unsigned char const&) [clone .isra.0], .-void f<unsigned char>(unsigned char const&) [clone .isra. 0] .section .text._Z1fIVhEvRKT_,"axG",@progbits,void f<unsigned char volatile>(unsigned char volatile const&),comdat .weak void f<unsigned char volatile>(unsigned char volatile const&) .type void f<unsigned char volatile>(unsigned char volatile const&), @function void f<unsigned char volatile>(unsigned char volatile const&): movw r30,r24 ; , x ld r24,Z ; _1, *x_3(D) sts v,r24 ; v, _1 ret .size void f<unsigned char volatile>(unsigned char volatile const&), .-void f<unsigned char volatile>(unsigned char volatile c onst&) .section .text._Z1fIV1AEvRKT_,"axG",@progbits,void f<A volatile>(A volatile const&),comdat .weak void f<A volatile>(A volatile const&) .type void f<A volatile>(A volatile const&), @function void f<A volatile>(A volatile const&): movw r30,r24 ; , x ld r24,Z ; _1, x_3(D)->m1 sts v,r24 ; v, _1 ret .size void f<A volatile>(A volatile const&), .-void f<A volatile>(A volatile const&) .section .text._Z1fI1AEvRKT_,"axG",@progbits,void f<A>(A const&),comdat .weak void f<A>(A const&) .type void f<A>(A const&), @function void f<A>(A const&): movw r30,r24 ; , x ld r24,Z ; _1, x_3(D)->m1 sts v,r24 ; v, _1 ret .size void f<A>(A const&), .-void f<A>(A const&) .section .text.startup,"ax",@progbits .type main, @function main: ldi r24,lo8(v1) ; , ldi r25,hi8(v1) ; , call void f<unsigned char volatile>(unsigned char volatile const&) ; lds r24,n1 ; , n1 call void f<unsigned char>(unsigned char const&) [clone .isra.0] ; ldi r24,lo8(v2) ; , ldi r25,hi8(v2) ; , call void f<A volatile>(A volatile const&) ; ldi r24,lo8(n2) ; , ldi r25,hi8(n2) ; , call void f<A>(A const&) ; ldi r25,0 ; ldi r24,0 ; ret .size main, .-main .section .bss .type n2, @object .size n2, 1 n2: .zero 1