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

--- Comment #7 from Manolis Tsamis <tsamismanolis at gmail dot com> ---
This looks to be the same issue with
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116405. The transformation:

insn 1:
  (insn 12 31 13 3 (parallel [
            (set (reg:DI 67 [ y_4 ])
                (plus:DI (reg:DI 67 [ y_4 ])
                    (const_int -1 [0xffffffffffffffff])))
            (clobber (reg:CC 33 %cc))
        ]) "a.c":5:8 1857 {*adddi3}
     (expr_list:REG_UNUSED (reg:CC 33 %cc)
        (nil)))

noce_convert_multiple_sets_1 sequence for insn 1:
  insn 0 (insn 52 0 53 (parallel [
            (set (reg:DI 78)
                (plus:DI (reg:DI 67 [ y_4 ])
                    (const_int -1 [0xffffffffffffffff])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 1 (insn 53 52 54 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 2 (insn 54 53 0 (set (reg:DI 77)
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 78)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))

insn 2:
  (insn 13 12 14 3 (parallel [
            (set (reg:DI 67 [ y_4 ])
                (ior:DI (reg:DI 67 [ y_4 ])
                    (const_int -16 [0xfffffffffffffff0])))
            (clobber (reg:CC 33 %cc))
        ]) "a.c":5:8 2022 {*iordi3}
     (expr_list:REG_UNUSED (reg:CC 33 %cc)
        (nil)))

noce_convert_multiple_sets_1 sequence for insn 2:
  insn 0 (insn 59 0 60 (parallel [
            (set (reg:DI 81)
                (ior:DI (reg:DI 77)
                    (const_int -16 [0xfffffffffffffff0])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 1 (insn 60 59 61 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 2 (insn 61 60 0 (set (reg:DI 80)
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 81)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))

insn 3:
  (insn 14 13 15 3 (parallel [
            (set (reg:DI 67 [ y_4 ])
                (plus:DI (reg:DI 67 [ y_4 ])
                    (const_int 1 [0x1])))
            (clobber (reg:CC 33 %cc))
        ]) "a.c":5:8 1857 {*adddi3}
     (expr_list:REG_UNUSED (reg:CC 33 %cc)
        (nil)))

noce_convert_multiple_sets_1 sequence for insn 3:
  insn 0 (insn 64 0 65 (parallel [
            (set (reg:DI 82)
                (plus:DI (reg:DI 80)
                    (const_int 1 [0x1])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 1 (insn 65 64 66 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 2 (insn 66 65 0 (set (reg:DI 67 [ y_4 ])
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 82)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))

noce_convert_multiple_sets final sequence:
  insn 0 (insn 52 0 53 (parallel [
            (set (reg:DI 78)
                (plus:DI (reg:DI 67 [ y_4 ])
                    (const_int -1 [0xffffffffffffffff])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 1 (insn 53 52 54 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 2 (insn 54 53 59 (set (reg:DI 77)
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 78)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))
  insn 3 (insn 59 54 60 (parallel [
            (set (reg:DI 81)
                (ior:DI (reg:DI 77)
                    (const_int -16 [0xfffffffffffffff0])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 4 (insn 60 59 61 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 5 (insn 61 60 64 (set (reg:DI 80)
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 81)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))
  insn 6 (insn 64 61 65 (parallel [
            (set (reg:DI 82)
                (plus:DI (reg:DI 80)
                    (const_int 1 [0x1])))
            (clobber (reg:CC 33 %cc))
        ]) -1
     (nil))
  insn 7 (insn 65 64 66 (set (reg:CCS 33 %cc)
        (compare:CCS (reg:DI 67 [ y_4 ])
            (const_int 0 [0]))) -1
     (nil))
  insn 8 (insn 66 65 67 (set (reg:DI 67 [ y_4 ])
        (if_then_else:DI (lt (reg:CCS 33 %cc)
                (const_int 0 [0]))
            (reg:DI 82)
            (reg:DI 67 [ y_4 ]))) -1
     (nil))
  insn 9 (insn 67 66 68 (set (reg:DI 67 [ y_4 ])
        (reg:DI 77)) 1503 {*movdi_64}
     (nil))
  insn 10 (insn 68 67 0 (set (reg:DI 67 [ y_4 ])
        (reg:DI 80)) 1503 {*movdi_64}
     (nil))

Where it can be seen that the last two instructions in the final sequence (insn
9 and 10) overwrite the result register reg:DI 67. Due to that and similarly to
PR116405 some calculations are then incorrectly optimized away.

Reply via email to