llvm-project/flang/test/Fir/omp-reduction-embox-codegen.fir
Tom Eccles 74a87548e5
[flang][MLIR][OpenMP] make reduction by-ref toggled per variable (#92244)
Fixes #88935

Toggling reduction by-ref broke when multiple reduction clauses were
used. Decisions made for the by-ref status for later clauses could then
invalidate decisions for earlier clauses. For example,

```
reduction(+:scalar,scalar2) reduction(+:array)
```

The first clause would choose by value reduction and generate by-value
reduction regions, but then after this the second clause would force
by-ref to support the array argument. But by the time the second clause
is processed, the first clause has already had the wrong kind of
reduction regions generated.

This is solved by toggling whether a variable should be reduced by
reference per variable. In the above example, this allows only `array`
to be reduced by ref.
2024-05-16 15:27:59 +01:00

37 lines
1.2 KiB
Plaintext

// 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