xref: /llvm-project/flang/test/Transforms/constant-argument-globalisation-2.fir (revision de528ffb17ebce96e0bc4dde1749146c41ca1d0d)
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