https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81331

--- Comment #2 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
The wrong code is triggered by partitioning.  The function is somewhat odd by
requiring an EH edge to finish properly while we predict EH edges are unlikely.
This is however partly undone by the hack in bb-reorder that tries to sanitize
profile insanities.   Terminate is called from cxa_throw because of:

  // Some sort of unwinding error.  Note that terminate is a handler.
  __cxa_begin_catch (&header->exc.unwindHeader);
  std::terminate ();

I am not quite sure why unwinding fails. I have tracked down the particular BB
movement that triggers the wrong code.
It is moving bb 23 from cold to hot triggers also conssequently promoting of bb
24 because it is a landing pad that is only reached from bb 23.
Either disabling movement of bb 23 or changing also partition of BB 25 solves
the problem. Perhas cxa_begin_catch and cxa_end_catch should not cross
partitions?

cxa_* code is not very well commented to say at least...

I am attaching good.s that is without problematic parittioning bad.s which is
one triggering failure and hacked.s that is the one with fixed movement of bb
25.  It would be great to know why bad.s fails.

;; basic block 22, loop depth 0, count 0, freq 0, probably never executed
;;  prev block 64, next block 23, flags: (REACHABLE, COLD_PARTITION, RTL,
MODIFIED)
;;  pred:       64 [always]  count:0 (CROSSING)
;; bb 22 artificial_defs: { }
;; bb 22 artificial_uses: { u-1(6){ }u-1(7){ }u-1(16){ }u-1(20){ }}
;; lr  in        6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179
;; lr  use       6 [bp] 7 [sp] 16 [argp] 20 [frame] 178 179
;; lr  def       0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 8 [st] 9 [st(1)] 10 [st(2)]
11 [st(3)] 12 [st(4)] 13 [st(5)] 14 [st(6)] 15 [st(7)] 17 [flags] 18 [fpsr] 19
[fpcr] 21 [xmm0] 22 [xmm1] 23 [xmm2] 24 [xmm3] 25 [xmm4] 26 [xmm5] 27 [xmm6] 28
[xmm7] 29 [mm0] 30 [mm1] 31 [mm2] 32 [mm3] 33 [mm4] 34 [mm5] 35 [mm6] 36 [mm7]
37 [r8] 38 [r9] 39 [r10] 40 [r11] 45 [xmm8] 46 [xmm9] 47 [xmm10] 48 [xmm11] 49
[xmm12] 50 [xmm13] 51 [xmm14] 52 [xmm15] 53 [] 54 [] 55 [] 56 [] 57 [] 58 [] 59
[] 60 [] 61 [] 62 [] 63 [] 64 [] 65 [] 66 [] 67 [] 68 [] 69 [] 70 [] 71 [] 72
[] 73 [] 74 [] 75 [] 76 [] 77 [] 78 [] 79 [] 80 [] 138 139
;; live  in      6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179
;; live  gen     0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 37 [r8] 138 139
;; live  kill    17 [flags]
(code_label 466 480 156 22 58 (nil) [1 uses])
(note 156 466 157 22 [bb 22] NOTE_INSN_BASIC_BLOCK)
(insn 157 156 158 22 (set (reg:DI 139 [ MEM[(const struct basic_string *)&str02
+ 8B] ])
        (mem/c:DI (plus:DI (reg/f:DI 20 frame)
                (const_int -88 [0xffffffffffffffa8])) [0 MEM[(const struct
basic_string *)&str02 + 8B]+0 S8 A64]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (nil))
(insn 158 157 161 22 (parallel [
            (set (reg:DI 138)
                (plus:DI (reg:DI 139 [ MEM[(const struct basic_string *)&str02
+ 8B] ])
                    (const_int 1 [0x1])))
            (clobber (reg:CC 17 flags))
        ])
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
218 {*adddi_1}
     (expr_list:REG_DEAD (reg:DI 139 [ MEM[(const struct basic_string *)&str02
+ 8B] ])
        (expr_list:REG_UNUSED (reg:CC 17 flags)
            (expr_list:REG_EQUAL (plus:DI (mem/c:DI (plus:DI (reg/f:DI 20
frame)
                            (const_int -88 [0xffffffffffffffa8])) [0 MEM[(const
struct basic_string *)&str02 + 8B]+0 S8 A64])
                    (const_int 1 [0x1]))
                (nil)))))
(insn 161 158 162 22 (set (reg:DI 37 r8)
        (const_int 5 [0x5]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (nil))
(insn 162 161 163 22 (set (reg:DI 2 cx)
        (reg:DI 138))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (expr_list:REG_DEAD (reg:DI 138)
        (nil)))
(insn 163 162 164 22 (set (reg:DI 1 dx)
        (reg/f:DI 178))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (expr_list:REG_EQUAL (plus:DI (reg/f:DI 20 frame)
            (const_int -96 [0xffffffffffffffa0]))
        (nil)))
(insn 164 163 165 22 (set (reg:DI 4 si)
        (const_int 0 [0]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (nil))
(insn 165 164 166 22 (set (reg:DI 5 di)
        (reg/f:DI 179))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
81 {*movdi_internal}
     (expr_list:REG_EQUAL (plus:DI (reg/f:DI 20 frame)
            (const_int -64 [0xffffffffffffffc0]))
        (nil)))
(call_insn 166 165 465 22 (set (reg:DI 0 ax)
        (call (mem:QI (symbol_ref:DI
("_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4_mm")
[flags 0x41]  <function_decl 0x7f3e7d90ee00 insert>) [0 insert S1 A8])
            (const_int 0 [0])))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":67
666 {*call_value}
     (expr_list:REG_DEAD (reg:DI 37 r8)
        (expr_list:REG_DEAD (reg:DI 5 di)
            (expr_list:REG_DEAD (reg:DI 4 si)
                (expr_list:REG_DEAD (reg:DI 2 cx)
                    (expr_list:REG_DEAD (reg:DI 1 dx)
                        (expr_list:REG_UNUSED (reg:DI 0 ax)
                            (expr_list:REG_EH_REGION (const_int 11 [0xb])
                                (expr_list:REG_CALL_DECL (symbol_ref:DI
("_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4_mm")
[flags 0x41]  <function_decl 0x7f3e7d90ee00 insert>)
                                    (nil)))))))))
    (expr_list:DI (use (reg:DI 5 di))
        (expr_list:DI (use (reg:DI 4 si))
            (expr_list:DI (use (reg:DI 1 dx))
                (expr_list:DI (use (reg:DI 2 cx))
                    (expr_list:DI (use (reg:DI 37 r8))
                        (nil)))))))
;;  succ:       26 [never]  count:0 (ABNORMAL,ABNORMAL_CALL,EH)
;;              9 [always (guessed)]  count:0 (FALLTHRU)
;; lr  out       6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179
;; live  out     6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179

;; basic block 23, loop depth 0, count 0, freq 0, probably never executed
;;  prev block 22, next block 65, flags: (REACHABLE, COLD_PARTITION, RTL,
MODIFIED)
;;  pred:       20 [50.0% (guessed)]  count:0 (CROSSING)
;; bb 23 artificial_defs: { }
;; bb 23 artificial_uses: { u-1(6){ }u-1(7){ }u-1(16){ }u-1(20){ }}
;; lr  in        6 [bp] 7 [sp] 16 [argp] 20 [frame] 135 177 178 179
;; lr  use       6 [bp] 7 [sp] 16 [argp] 20 [frame] 135
;; lr  def       0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 8 [st] 9 [st(1)] 10 [st(2)]
11 [st(3)] 12 [st(4)] 13 [st(5)] 14 [st(6)] 15 [st(7)] 17 [flags] 18 [fpsr] 19
[fpcr] 21 [xmm0] 22 [xmm1] 23 [xmm2] 24 [xmm3] 25 [xmm4] 26 [xmm5] 27 [xmm6] 28
[xmm7] 29 [mm0] 30 [mm1] 31 [mm2] 32 [mm3] 33 [mm4] 34 [mm5] 35 [mm6] 36 [mm7]
37 [r8] 38 [r9] 39 [r10] 40 [r11] 45 [xmm8] 46 [xmm9] 47 [xmm10] 48 [xmm11] 49
[xmm12] 50 [xmm13] 51 [xmm14] 52 [xmm15] 53 [] 54 [] 55 [] 56 [] 57 [] 58 [] 59
[] 60 [] 61 [] 62 [] 63 [] 64 [] 65 [] 66 [] 67 [] 68 [] 69 [] 70 [] 71 [] 72
[] 73 [] 74 [] 75 [] 76 [] 77 [] 78 [] 79 [] 80 []
;; live  in      6 [bp] 7 [sp] 16 [argp] 20 [frame] 135 177 178 179
;; live  gen     0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 37 [r8]
;; live  kill   
(code_label 465 166 171 23 57 (nil) [1 uses])
(note 171 465 172 23 [bb 23] NOTE_INSN_BASIC_BLOCK)
(insn 172 171 173 23 (set (reg:DI 5 di)
        (reg:DI 135))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":59
81 {*movdi_internal}
     (expr_list:REG_DEAD (reg:DI 135)
        (nil)))
(call_insn 173 172 174 23 (set (reg:DI 0 ax)
        (call (mem:QI (symbol_ref:DI ("__cxa_begin_catch") [flags 0x41] 
<function_decl 0x7f3e7d7abc00 __cxa_begin_catch>) [0 __cxa_begin_catch S1 A8])
            (const_int 0 [0])))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":59
666 {*call_value}
     (expr_list:REG_DEAD (reg:DI 5 di)
        (expr_list:REG_UNUSED (reg:DI 0 ax)
            (expr_list:REG_CALL_DECL (symbol_ref:DI ("__cxa_begin_catch")
[flags 0x41]  <function_decl 0x7f3e7d7abc00 __cxa_begin_catch>)
                (expr_list:REG_EH_REGION (const_int 0 [0])
                    (nil)))))
    (expr_list:DI (use (reg:DI 5 di))
        (nil)))
(insn 174 173 175 23 (set (reg:DI 37 r8)
        (symbol_ref/f:DI ("*.LC4") [flags 0x2]  <var_decl 0x7f3e7886d1b0
*.LC4>))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
81 {*movdi_internal}
     (nil))
(insn 175 174 176 23 (set (reg:DI 2 cx)
        (symbol_ref:DI ("_ZZ6test01vE19__PRETTY_FUNCTION__") [flags 0x2] 
<var_decl 0x7f3e7968f480 __PRETTY_FUNCTION__>))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
81 {*movdi_internal}
     (nil))
(insn 176 175 177 23 (set (reg:SI 1 dx)
        (const_int 60 [0x3c]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
82 {*movsi_internal}
     (nil))
(insn 177 176 178 23 (set (reg:DI 4 si)
        (symbol_ref/f:DI ("*.LC5") [flags 0x2]  <var_decl 0x7f3e7886d240
*.LC5>))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
81 {*movdi_internal}
     (nil))
(insn 178 177 179 23 (set (reg:DI 5 di)
        (symbol_ref/f:DI ("*.LC6") [flags 0x2]  <var_decl 0x7f3e7886d2d0
*.LC6>))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
81 {*movdi_internal}
     (nil))
(insn 179 178 180 23 (set (reg:QI 0 ax)
        (const_int 0 [0]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
84 {*movqi_internal}
     (nil))
(call_insn 180 179 483 23 (set (reg:SI 0 ax)
        (call (mem:QI (symbol_ref:DI ("printf") [flags 0x41]  <function_decl
0x7f3e7f0afd00 __builtin_printf>) [0 __builtin_printf S1 A8])
            (const_int 0 [0])))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":60
666 {*call_value}
     (expr_list:REG_DEAD (reg:DI 37 r8)
        (expr_list:REG_DEAD (reg:DI 5 di)
            (expr_list:REG_DEAD (reg:DI 4 si)
                (expr_list:REG_DEAD (reg:DI 2 cx)
                    (expr_list:REG_DEAD (reg:SI 1 dx)
                        (expr_list:REG_UNUSED (reg:SI 0 ax)
                            (expr_list:REG_EH_REGION (const_int 10 [0xa])
                                (expr_list:REG_CALL_DECL (symbol_ref:DI
("printf") [flags 0x41]  <function_decl 0x7f3e7f0afd00 __builtin_printf>)
                                    (nil)))))))))
    (expr_list (use (reg:QI 0 ax))
        (expr_list:DI (use (reg:DI 5 di))
            (expr_list:DI (use (reg:DI 4 si))
                (expr_list:SI (use (reg:SI 1 dx))
                    (expr_list:DI (use (reg:DI 2 cx))
                        (expr_list:DI (use (reg:DI 37 r8))
                            (nil))))))))
;;  succ:       24 [never]  count:0 (ABNORMAL,ABNORMAL_CALL,EH)
;;              65 [always (guessed)]  count:0 (FALLTHRU)
;; lr  out       6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179
;; live  out     6 [bp] 7 [sp] 16 [argp] 20 [frame] 177 178 179


Block 25 is:

;; basic block 25, loop depth 0, count 0, freq 0, probably never executed
;;  prev block 24, next block 26, flags: (REACHABLE, COLD_PARTITION, RTL,
MODIFIED)
;;  pred:       24 [always]  count:0 (CROSSING)
;; bb 25 artificial_defs: { }
;; bb 25 artificial_uses: { u-1(6){ }u-1(7){ }u-1(16){ }u-1(20){ }}
;; lr  in        6 [bp] 7 [sp] 16 [argp] 20 [frame] 143 177 178 179
;; lr  use       6 [bp] 7 [sp] 16 [argp] 20 [frame] 143
;; lr  def       0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 8 [st] 9 [st(1)] 10 [st(2)]
11 [st(3)] 12 [st(4)] 13 [st(5)] 14 [st(6)] 15 [st(7)] 17 [flags] 18 [fpsr] 19
[fpcr] 21 [xmm0] 22 [xmm1] 23 [xmm2] 24 [xmm3] 25 [xmm4] 26 [xmm5] 27 [xmm6] 28
[xmm7] 29 [mm0] 30 [mm1] 31 [mm2] 32 [mm3] 33 [mm4] 34 [mm5] 35 [mm6] 36 [mm7]
37 [r8] 38 [r9] 39 [r10] 40 [r11] 45 [xmm8] 46 [xmm9] 47 [xmm10] 48 [xmm11] 49
[xmm12] 50 [xmm13] 51 [xmm14] 52 [xmm15] 53 [] 54 [] 55 [] 56 [] 57 [] 58 [] 59
[] 60 [] 61 [] 62 [] 63 [] 64 [] 65 [] 66 [] 67 [] 68 [] 69 [] 70 [] 71 [] 72
[] 73 [] 74 [] 75 [] 76 [] 77 [] 78 [] 79 [] 80 [] 142
;; live  in      6 [bp] 7 [sp] 16 [argp] 20 [frame] 143 177 178 179
;; live  gen     142
;; live  kill   
(code_label 183 466 184 25 22 (nil) [1 uses])
(note 184 183 185 25 [bb 25] NOTE_INSN_BASIC_BLOCK)
(call_insn 185 184 186 25 (call (mem:QI (symbol_ref:DI ("__cxa_end_catch")
[flags 0x41]  <function_decl 0x7f5737fcfb00 __cxa_end_catch>) [0
__cxa_end_catch S1 A8])
        (const_int 0 [0]))
"/home/jan/trunk/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc":59
655 {*call}
     (expr_list:REG_EH_REGION (const_int -19 [0xffffffffffffffed])
        (expr_list:REG_CALL_DECL (symbol_ref:DI ("__cxa_end_catch") [flags
0x41]  <function_decl 0x7f5737fcfb00 __cxa_end_catch>)
            (nil)))
    (nil))
(insn 186 185 411 25 (set (reg:DI 142)
        (reg:DI 143)) 81 {*movdi_internal}
     (expr_list:REG_DEAD (reg:DI 143)
        (nil)))

Reply via email to