Hi! We have in rs6000-protos.h extern bool legitimate_indirect_address_p (rtx, int); and in rs6000.c inline bool legitimate_indirect_address_p (rtx x, int strict) { ... } and in predicates.md call this function. That works fine in C (both -fgnu89-inline mode and C99), the function is inlined within rs6000.c but an out of line copy is still emitted and predicates.md can thus reference it. But in C++, if compiled with optimizations, without -fkeep-inline-functions and the compiler inlines all calls to that function, it doesn't have to emit anything. Thus, either we have the option to move the definition of legitimate_indirect_address_p into a header (but rs6000-protos.h doesn't look like a correct spot to define inline functions), or we need to drop inline keyword and force that way an out of line copy. Ok for trunk?
2012-11-08 Jakub Jelinek <ja...@redhat.com> PR target/54308 * config/rs6000/rs6000.c (legitimate_indirect_address_p): Remove inline keyword. --- gcc/config/rs6000/rs6000.c.jj 2012-10-31 09:20:44.000000000 +0100 +++ gcc/config/rs6000/rs6000.c 2012-11-08 18:33:34.950408593 +0100 @@ -5465,7 +5465,7 @@ avoiding_indexed_address_p (enum machine return (TARGET_AVOID_XFORM && VECTOR_MEM_NONE_P (mode)); } -inline bool +bool legitimate_indirect_address_p (rtx x, int strict) { return GET_CODE (x) == REG && INT_REG_OK_FOR_BASE_P (x, strict); Jakub