https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77493
Bug ID: 77493 Summary: [6 Regression] -fcrossjumping (-O2) on ppc64le causes segfaults (jump to 0x0) (first bad r230091) Product: gcc Version: 6.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: david.abdurachmanov at gmail dot com Target Milestone: --- Created attachment 39568 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39568&action=edit pre-processed source code Finally I moved our PPC64LE builds to GCC 6.2.0 from 5.3.0 and quickly found that majority of workflows are segfaulting in a similar strange manner. Quickly noticed that this starts happening with -O2, works fine with -O1. Started bisection of GCC -O2 flags and it -fcrossjumping is the causing it. Found that most issues are caused by MuonTrajectoryUpdator.o. Then started hunting for the function causing regression. Found that it was boost/smart_ptr/intrusive_ptr.hpp (from 1.57.0 version). Doing the following resolves the issue: 165 #pragma GCC push_options 166 #pragma GCC optimize ("no-crossjumping") 167 168 T & operator*() const 169 { 170 BOOST_ASSERT( px != 0 ); 171 return *px; 172 } 173 174 #pragma GCC pop_options Started GCC bisection and did it twice with the same result. First bad commit r230091 or b873d7f7eba25120074b3d74add21224e860df43 Last good commit r230090 or 79a77fee9f8eebf5bdd2b4868a0ba18b3ad3b74d Does not happen on x86_64 and I still didn't move AArch64 to GCC 6.2.0. This is quick look into GDB: Dump of assembler code for function Chi2MeasurementEstimator::estimate(TrajectoryStateOnSurface const&, TrackingRecHit const&) const: 0x00003fff985a7e40 <+0>: addis r2,r12,4 0x00003fff985a7e44 <+4>: addi r2,r2,-320 => 0x00003fff985a7e48 <+8>: mflr r0 0x00003fff985a7e4c <+12>: std r27,-40(r1) 0x00003fff985a7e50 <+16>: std r28,-32(r1) 0x00003fff985a7e54 <+20>: mr r28,r4 0x00003fff985a7e58 <+24>: std r30,-16(r1) 0x00003fff985a7e5c <+28>: std r31,-8(r1) 0x00003fff985a7e60 <+32>: mr r27,r3 0x00003fff985a7e64 <+36>: mr r3,r5 0x00003fff985a7e68 <+40>: std r29,-24(r1) 0x00003fff985a7e6c <+44>: mr r31,r5 0x00003fff985a7e70 <+48>: std r0,16(r1) 0x00003fff985a7e74 <+52>: stdu r1,-288(r1) 0x00003fff985a7e78 <+56>: ld r9,0(r5) // beginning of TrackingRecHit 0x00003fff985a7e7c <+60>: ld r4,88(r9) // we load 0x0 (loading function address from vtable?) 0x00003fff985a7e80 <+64>: std r2,24(r1) 0x00003fff985a7e84 <+68>: mtctr r4 // we load CTR with 0x0 0x00003fff985a7e88 <+72>: mr r12,r4 0x00003fff985a7e8c <+76>: bctrl // ucondition branch to CTR with is 0x0 0x00003fff985a7e90 <+80>: ld r2,24(r1) 0x00003fff985a7e94 <+84>: li r5,21 0x00003fff985a7e98 <+88>: mr r30,r3 Code looks like: 34 std::pair<bool,double> 35 Chi2MeasurementEstimator::estimate(const TrajectoryStateOnSurface& tsos, 36 const TrackingRecHit& aRecHit) const { 37 switch (aRecHit.dimension()) { 38 case 1: return returnIt(lestimate<1>(tsos,aRecHit)); 39 case 2: return returnIt(lestimate<2>(tsos,aRecHit)); 40 case 3: return returnIt(lestimate<3>(tsos,aRecHit)); 41 case 4: return returnIt(lestimate<4>(tsos,aRecHit)); 42 case 5: return returnIt(lestimate<5>(tsos,aRecHit)); 43 } 44 throw cms::Exception("RecHit of invalid size (not 1,2,3,4,5)"); 45 } We are failing trying to make this call: aRecHit.dimension() [line 37].