xref: /llvm-project/flang/test/Fir/cse.fir (revision a8308020ac2fce5ad7d616b2dbdbe7ccae0585a4)
1// RUN: fir-opt --cse -split-input-file %s | FileCheck %s
2
3// Check that the redundant fir.load is removed.
4func.func @fun(%arg0: !fir.ref<i64>) -> i64 {
5    %0 = fir.load %arg0 : !fir.ref<i64>
6    %1 = fir.load %arg0 : !fir.ref<i64>
7    %2 = arith.addi %0, %1 : i64
8    return %2 : i64
9}
10
11// CHECK-LABEL: func @fun
12// CHECK-NEXT:    %[[LOAD:.*]] = fir.load %{{.*}} : !fir.ref<i64>
13// CHECK-NEXT:    %{{.*}} = arith.addi %[[LOAD]], %[[LOAD]] : i64
14
15// -----
16
17// CHECK-LABEL: func @fun(
18// CHECK-SAME:            %[[A:.*]]: !fir.ref<i64>
19func.func @fun(%a : !fir.ref<i64>) -> i64 {
20  // CHECK: %[[LOAD:.*]] = fir.load %[[A]] : !fir.ref<i64>
21  %1 = fir.load %a : !fir.ref<i64>
22  %2 = fir.load %a : !fir.ref<i64>
23  // CHECK-NEXT: %{{.*}} = arith.addi %[[LOAD]], %[[LOAD]] : i64
24  %3 = arith.addi %1, %2 : i64
25  %4 = fir.load %a : !fir.ref<i64>
26  // CHECK-NEXT: %{{.*}} = arith.addi
27  %5 = arith.addi %3, %4 : i64
28  %6 = fir.load %a : !fir.ref<i64>
29  // CHECK-NEXT: %{{.*}} = arith.addi
30  %7 = arith.addi %5, %6 : i64
31  %8 = fir.load %a : !fir.ref<i64>
32  // CHECK-NEXT: %{{.*}} = arith.addi
33  %9 = arith.addi %7, %8 : i64
34  %10 = fir.load %a : !fir.ref<i64>
35  // CHECK-NEXT: %{{.*}} = arith.addi
36  %11 = arith.addi %10, %9 : i64
37  %12 = fir.load %a : !fir.ref<i64>
38  // CHECK-NEXT: %{{.*}} = arith.addi
39  %13 = arith.addi %11, %12 : i64
40  // CHECK-NEXT: return %{{.*}} : i64
41  return %13 : i64
42}
43
44// -----
45
46func.func @fun(%a : !fir.ref<i64>) -> i64 {
47  cf.br ^bb1
48^bb1:
49  %1 = fir.load %a : !fir.ref<i64>
50  %2 = fir.load %a : !fir.ref<i64>
51  %3 = arith.addi %1, %2 : i64
52  cf.br ^bb2
53^bb2:
54  %4 = fir.load %a : !fir.ref<i64>
55  %5 = arith.subi %4, %4 : i64
56  return %5 : i64
57}
58