llvm/flang/test/Fir/omp-reduction-embox-codegen.fir

// RUN: tco %s | FileCheck %s

// the fir.embox in the init region is turned into an alloca for the box. Test
// that CodeGen.cpp knows where to place an alloca when it is inside of an
// omp.declare_reduction

// regretably this has to be nonsense IR because we need the subsequent patches
// to process anything useful

omp.declare_reduction @test_reduction : !fir.ref<!fir.box<i32>> init {
^bb0(%arg0: !fir.ref<!fir.box<i32>>):
  %0 = fir.alloca !fir.box<i32>
  %1 = fir.alloca i32
  %2 = fir.embox %1 : (!fir.ref<i32>) -> !fir.box<i32>

  // use the embox for something so it isn't removed
  fir.store %2 to %0 : !fir.ref<!fir.box<i32>>

  omp.yield(%0 : !fir.ref<!fir.box<i32>>)
} combiner {
^bb0(%arg0: !fir.ref<!fir.box<i32>>, %arg1: !fir.ref<!fir.box<i32>>):
  %0 = fir.undefined !fir.ref<!fir.box<i32>>
  omp.yield(%0 : !fir.ref<!fir.box<i32>>)
}

func.func @_QQmain() attributes {fir.bindc_name = "reduce"} {
  %4 = fir.alloca !fir.box<i32>
  omp.parallel reduction(byref @test_reduction %4 -> %arg0 : !fir.ref<!fir.box<i32>>) {
    omp.terminator
  }
  return
}

// basically we are testing that there isn't a crash
// CHECK-LABEL: define void @_QQmain
// CHECK-NEXT:    alloca { ptr, i64, i32, i8, i8, i8, i8 }, i64 1, align 8