Break circular dependency between FIR dialect and utilities
[llvm-project.git] / flang / test / Fir / cse.fir
blob8813b7c411f5080a9461711a144132415b55722a
1 // RUN: fir-opt --cse -split-input-file %s | FileCheck %s
3 // Check that the redundant fir.load is removed.
4 func.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
11 // CHECK-LABEL: func @fun
12 // CHECK-NEXT:    %[[LOAD:.*]] = fir.load %{{.*}} : !fir.ref<i64>
13 // CHECK-NEXT:    %{{.*}} = arith.addi %[[LOAD]], %[[LOAD]] : i64
15 // -----
17 // CHECK-LABEL: func @fun(
18 // CHECK-SAME:            %[[A:.*]]: !fir.ref<i64>
19 func.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
44 // -----
46 func.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