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

            Bug ID: 119210
           Summary: [SME] 'smstart za' seems not to dominate the block
                    that uses za register
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xiezhiheng at huawei dot com
  Target Milestone: ---

For this test case,
https://godbolt.org/z/ceW9vPxz8


.L12:
        ldr     d1, [x21, x19, lsl 3]
        mov     w1, w19
        ldr     d0, [x20, x19, lsl 3]
        mov     x0, x23
        add     x19, x19, 1
        bl      printf
        cmp     x19, 64
        bne     .L12
        mov     x1, x21
        add     x3, x29, 128
        mrs     x16, tpidr2_el0
        cbnz    x16, .L22  <== it will branch to .L22, and miss 'smstart za'
        mov     x0, x3
        smstart za
        bl      __arm_tpidr2_restore
.L22:
        adrp    x23, .LC1
        add     x23, x23, :lo12:.LC1
        msr     tpidr2_el0, xzr
        mov     x19, 0
        mov     x0, x20
        smstart sm
        bl      example(double*, double*)
        smstop  sm
        mov     x0, x22
        smstart sm
        bl      example0(double*)
        smstop  sm
        smstop  za

And in my test machine, it will cause an 'Illegal instruction' runtime error.

Reply via email to