Following r315984, one of our internal tests started to fail with the following error from the compiler: Offset not zero at the point of scalar access %2 = load float, float* %india, align 4, !tbaa !6 !6 = !{!7, !9, i64 4} 4 fatal error: error in backend: Broken function found, compilation aborted! You can reproduce this by compiling the following code with optimization’s enabled: Clang -cc1 -emit-obj -O2 reduced.cpp Where reduced.cpp is the following code: /* reduced.cpp */ class alpha; namespace bravo { namespace charlie { void delta(alpha* element, char* name, float var); } namespace foxtrot { class gulf { public: float hotel; float india; }; class juliet { public: gulf kilo[4]; }; } namespace charlie { class lima { public: bravo::foxtrot::juliet mike; }; void november( alpha* oscar, lima * papa ) { alpha* quebec ; delta(quebec, "romeo", papa->mike.kilo->india); } } } Thanks to Sunil for helping reduce this test for me.
A minimized test: struct A { int x; }; struct B { A a[1]; }; int bar(B *b) { return b->a->x; } Apparently the problem is how we handle array-to-pointer decays.
The patch: https://reviews.llvm.org/D39083
Resolved in: [CodeGen] Fix generation of TBAA info for array-to-pointer conversions https://reviews.llvm.org/rL316211
Douglas, can you please confirm the fix works for you?
(In reply to Ivan Kosarev from comment #4) > Douglas, can you please confirm the fix works for you? Hi Ivam, I can confirm that this fixes the internal test that uncovered the issue. Thanks for fixing it!