g++ not using ipa-sra for small struct / class

Wilhelm Meier wilhelm.meier@hs-kl.de
Wed Jun 28 08:56:00 GMT 2017


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



More information about the Gcc-help mailing list