https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65240
Bug ID: 65240 Summary: [5 Regression] ICE (insn does not satisfy its constraints) on powerpc64le-linux-gnu Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: doko at gcc dot gnu.org trunk r221042 $ g++ -c -g -O3 -ffast-math modules_mod.ii modules_mod.ii: In member function 'uint32_t D::m_fn3()': modules_mod.ii:69:1: error: insn does not satisfy its constraints: } ^ (insn 279 463 432 2 (set (reg:DF 98 21 [360]) (mem/u/c:DF (lo_sum:DI (reg:DI 10 10) (unspec:DI [ (symbol_ref/u:DI ("*.LC7") [flags 0x82]) (reg:DI 2 2) ] UNSPEC_TOCREL)) [1 S8 A64])) modules_mod.ii:64 499 {*movdf_hardfloat64} (expr_list:REG_EQUIV (const_double:DF -5.0e-1 [-0x0.8p+0]) (nil))) modules_mod.ii:69:1: internal compiler error: in extract_constrain_insn, at recog.c:2246 Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions. $ cat modules_mod.ii typedef int uint32_t; extern "C" double atan(double); template <typename T, typename U> T lerp(T p1, T p2, U p3) { return p1 + (p2 - p1) * p3; } template <class> class audio_module { public: float *ins[]; }; struct A { double w1; double w2; double process___trans_tmp_7; double process___trans_tmp_6; void m_fn1(double p1) { double &a = w1; if (process___trans_tmp_6 < process___trans_tmp_7) a = 0.0; double b = p1 - w1 - w2; w1 = b; } }; class B { public: float &operator[](int) {} }; struct C { B data; int get_interp_1616_ppos; int get_interp_1616_pppos; float m_fn2(int p1) { float c(p1); return lerp(data[get_interp_1616_ppos], data[get_interp_1616_pppos], c); } }; struct rotary_speaker_metadata; class D : audio_module<rotary_speaker_metadata> { uint32_t phase_l, phase_h, dphase_h; C delay; A crossover1r, crossover2l, damper1l, damper1r; uint32_t m_fn3(); }; double d, e, f, g, h; int j; float k; uint32_t D::m_fn3() { int l; for (int i;; i++) { double m = atan(ins[1][i]); int n = phase_l, o(phase_h), p = l; double v = n / 32768.0; j = 8 + phase_l / 32768.0; l = 8 + 8 * v - 0.3849; float q = delay.m_fn2(o) - g * k * delay.m_fn2(o), r = g * delay.m_fn2(o) + k * delay.m_fn2(p); damper1l.m_fn1(q); f = lerp(0.5, phase_h / 65536.0, h); float s = f; damper1r.m_fn1(r); e = lerp(0.5, j / 65536.0, h); d = m * e; float t = d; crossover2l.m_fn1(s); crossover1r.m_fn1(t); phase_l = phase_h = dphase_h; } }