https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98265
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> --- We do not inline CwiseNullaryOp because it uses comdat local symbols. This is because we do split the function and the .part stays local. At least we should recompute if function calls comdat local after comdat local function is inlined. IPA function summary for Eigen::Matrix<float, 3, 1> should_inline(float, float, float, float)/2 inlinable fp_expression global time: 36.000000 self size: 21 global size: 29 min size: 24 self stack: 16 global stack: 20 size:19.000000, time:18.500000 size:4.500000, time:3.500000, executed if:(not inlined) calls: operator*.isra/90 inlined freq:1.00 Stack frame offset 16, callee self size 4 Eigen::CwiseNullaryOp< <template-parameter-1-1>, <template-parameter-1-2> >::CwiseNullaryOp(long int, long int, Eigen::scalar_constant_op<float>) [with <template-parameter-1-1> = Eigen::scalar_constant_op<float>; PlainObjectType = Eigen::Matrix<float, 4, 5, 6, 4, 5>]/20 callee refers to comdat-local symbols freq:1.00 loop depth: 0 size: 5 time: 14 callee size: 6 stack: 0 op0 is compile time invariant op0 points to local or readonly memory op1 is compile time invariant op2 is compile time invariant op2 points to local or readonly memory