1// RUN: fir-opt --split-input-file --constant-argument-globalisation-opt < %s | FileCheck %s 2 3module { 4// Test for "two conditional writes to the same alloca doesn't get replaced." 5 func.func @func(%arg0: i32, %arg1: i1) { 6 %c2_i32 = arith.constant 2 : i32 7 %addr = fir.alloca i32 {adapt.valuebyref} 8 fir.if %arg1 { 9 fir.store %c2_i32 to %addr : !fir.ref<i32> 10 } else { 11 fir.store %arg0 to %addr : !fir.ref<i32> 12 } 13 fir.call @sub2(%addr) : (!fir.ref<i32>) -> () 14 return 15 } 16 func.func private @sub2(!fir.ref<i32>) 17 18// CHECK-LABEL: func.func @func 19// CHECK-SAME: [[ARG0:%.*]]: i32 20// CHECK-SAME: [[ARG1:%.*]]: i1) 21// CHECK: [[CONST:%.*]] = arith.constant 22// CHECK: [[ADDR:%.*]] = fir.alloca i32 23// CHECK: fir.if [[ARG1]] 24// CHECK: fir.store [[CONST]] to [[ADDR]] 25// CHECK: } else { 26// CHECK: fir.store [[ARG0]] to [[ADDR]] 27// CHECK: fir.call @sub2([[ADDR]]) 28// CHECK: return 29 30} 31 32// ----- 33 34module { 35// Test for "two writes to the same alloca doesn't get replaced." 36 func.func @func() { 37 %c1_i32 = arith.constant 1 : i32 38 %c2_i32 = arith.constant 2 : i32 39 %addr = fir.alloca i32 {adapt.valuebyref} 40 fir.store %c1_i32 to %addr : !fir.ref<i32> 41 fir.store %c2_i32 to %addr : !fir.ref<i32> 42 fir.call @sub2(%addr) : (!fir.ref<i32>) -> () 43 return 44 } 45 func.func private @sub2(!fir.ref<i32>) 46 47// CHECK-LABEL: func.func @func 48// CHECK: [[CONST1:%.*]] = arith.constant 49// CHECK: [[CONST2:%.*]] = arith.constant 50// CHECK: [[ADDR:%.*]] = fir.alloca i32 51// CHECK: fir.store [[CONST1]] to [[ADDR]] 52// CHECK: fir.store [[CONST2]] to [[ADDR]] 53// CHECK: fir.call @sub2([[ADDR]]) 54// CHECK: return 55 56} 57 58// ----- 59 60module { 61// Test for "one write to the the alloca gets replaced." 62 func.func @func() { 63 %c1_i32 = arith.constant 1 : i32 64 %addr = fir.alloca i32 {adapt.valuebyref} 65 fir.store %c1_i32 to %addr : !fir.ref<i32> 66 fir.call @sub2(%addr) : (!fir.ref<i32>) -> () 67 return 68 } 69 func.func private @sub2(!fir.ref<i32>) 70 71// CHECK-LABEL: func.func @func 72// CHECK: [[ADDR:%.*]] = fir.address_of([[EXTR:@.*]]) : !fir.ref<i32> 73// CHECK: fir.call @sub2([[ADDR]]) 74// CHECK: return 75// CHECK: fir.global internal [[EXTR]] constant : i32 { 76// CHECK: %{{.*}} = arith.constant 1 : i32 77// CHECK: fir.has_value %{{.*}} : i32 78// CHECK: } 79 80} 81 82// ----- 83// Check that same argument used twice is converted. 84module { 85 func.func @func(%arg0: !fir.ref<i32>, %arg1: i1) { 86 %c2_i32 = arith.constant 2 : i32 87 %addr1 = fir.alloca i32 {adapt.valuebyref} 88 fir.store %c2_i32 to %addr1 : !fir.ref<i32> 89 fir.call @sub1(%addr1, %addr1) : (!fir.ref<i32>, !fir.ref<i32>) -> () 90 return 91 } 92} 93 94// CHECK-LABEL: func.func @func 95// CHECK-NEXT: %[[ARG1:.*]] = fir.address_of([[CONST1:@.*]]) : !fir.ref<i32> 96// CHECK-NEXT: %[[ARG2:.*]] = fir.address_of([[CONST2:@.*]]) : !fir.ref<i32> 97// CHECK-NEXT: fir.call @sub1(%[[ARG1]], %[[ARG2]]) 98// CHECK-NEXT: return 99