| ! Regression test for https://github.com/llvm/llvm-project/issues/178821 |
| |
| ! Verify that the stack-arrays pass does not move a stack allocation |
| ! for a temporary outside its stacksave/stackrestore scope when the |
| ! size operand is shared across scopes (e.g. due to ConvertHLFIRtoFIR |
| ! reusing a single size value, or CSE merging duplicates). |
| |
| ! RUN: %flang_fc1 -emit-fir -fstack-arrays %s -o - \ |
| ! RUN: | fir-opt --stack-arrays \ |
| ! RUN: | FileCheck %s |
| |
| subroutine ss1(a) |
| character*(*) a(1) |
| character*1 t_s |
| call u(t_s() // '?' // a) |
| call u(t_s() // '?' // a) |
| end subroutine |
| |
| ! CHECK-LABEL: func.func @_QPss1 |
| ! |
| ! First scope: |
| ! CHECK: llvm.intr.stacksave |
| ! CHECK: fir.alloca !fir.array<1x!fir.char<1,?>> |
| ! CHECK-SAME: {bindc_name = ".tmp.array"} |
| ! CHECK: fir.call @_QPu( |
| ! CHECK: llvm.intr.stackrestore |
| ! |
| ! Second scope (the second alloca must be AFTER the first stackrestore): |
| ! CHECK: llvm.intr.stacksave |
| ! CHECK: fir.alloca !fir.array<1x!fir.char<1,?>> |
| ! CHECK-SAME: {bindc_name = ".tmp.array"} |
| ! CHECK: fir.call @_QPu( |
| ! CHECK: llvm.intr.stackrestore |