// Test code generation of hlfir.where/hflir.elsewhere when an // "impure" mask is used and several runs are needed. The mask // must be saved so that the impure function is only evaluated once. // RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s func.func private @impure() -> !fir.heap>> func.func @test_elsewhere_impure_mask(%x: !fir.ref>, %y: !fir.ref>, %z: !fir.ref>, %mask: !fir.ref>>) { %c-1 = arith.constant -1 : index %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %1 = fir.shape %c10 : (index) -> !fir.shape<1> hlfir.where { hlfir.yield %mask : !fir.ref>> } do { hlfir.elsewhere mask { %mask2 = fir.call @impure() : () -> !fir.heap>> hlfir.yield %mask2 : !fir.heap>> cleanup { fir.freemem %mask2 : !fir.heap>> } } do { hlfir.region_assign { hlfir.yield %y : !fir.ref> } to { hlfir.yield %x : !fir.ref> } hlfir.region_assign { hlfir.yield %x : !fir.ref> } to { hlfir.yield %z : !fir.ref> } } } return } // CHECK-LABEL: func.func @test_elsewhere_impure_mask( // CHECK: %[[VAL_12:.*]] = fir.call @impure() : () -> !fir.heap>> // CHECK: %[[VAL_21:.*]] = fir.allocmem !fir.array>, %[[extent:[^ ]*]] // CHECK: %[[VAL_22:.*]] = fir.shape %[[extent]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_23:.*]]:2 = hlfir.declare %[[VAL_21]](%{{.*}}) {uniq_name = ".tmp.where"} // CHECK: fir.do_loop // CHECK: fir.if {{.*}} { // CHECK: } else { // CHECK: %[[VAL_28:.*]] = hlfir.designate %[[VAL_12]] (%{{.*}}) // CHECK: %[[VAL_29:.*]] = fir.load %[[VAL_28]] : !fir.ref> // CHECK: %[[VAL_32:.*]] = hlfir.designate %[[VAL_23]]#0 (%{{.*}}) : (!fir.box>>, index) -> !fir.ref> // CHECK: hlfir.assign %[[VAL_29]] to %[[VAL_32]] : !fir.logical<4>, !fir.ref> // CHECK: } // CHECK: } // CHECK-NOT: fir.call @impure // CHECK: fir.do_loop // CHECK: fir.if {{.*}} { // CHECK: } else { // CHECK: %[[VAL_42:.*]] = hlfir.designate %[[VAL_23]]#0 (%{{.*}}) : (!fir.box>>, index) -> !fir.ref> // CHECK: %[[VAL_43:.*]] = fir.load %[[VAL_42]] : !fir.ref> // CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_43]] : (!fir.logical<4>) -> i1 // CHECK: fir.if %[[VAL_44]] { // CHECK: } // CHECK: } // CHECK: } // CHECK-NOT: fir.call @impure // CHECK: fir.do_loop // CHECK: fir.if {{.*}} { // CHECK: } else { // CHECK: %[[VAL_52:.*]] = hlfir.designate %[[VAL_23]]#0 (%{{.*}}) : (!fir.box>>, index) -> !fir.ref> // CHECK: %[[VAL_53:.*]] = fir.load %[[VAL_52]] : !fir.ref> // CHECK: %[[VAL_54:.*]] = fir.convert %[[VAL_53]] : (!fir.logical<4>) -> i1 // CHECK: fir.if %[[VAL_54]] { // CHECK: } // CHECK: } // CHECK: } // CHECK: fir.freemem %[[VAL_21]] : !fir.heap>> // CHECK: fir.freemem %[[VAL_12]] : !fir.heap>> // CHECK: return // CHECK: }