File: associate-construct.f90

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (95 lines) | stat: -rw-r--r-- 2,805 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
! RUN: bbc -emit-fir -o - %s | FileCheck %s

! CHECK-LABEL: func @_QQmain
program p
  ! CHECK-DAG: [[I:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEi"}
  ! CHECK-DAG: [[N:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEn"}
  ! CHECK: [[T:%[0-9]+]] = fir.alloca !fir.array<3xi32> {bindc_name = "t", uniq_name = "_QFEt"}
  integer :: n, foo, t(3)
  ! CHECK: [[N]]
  ! CHECK-COUNT-3: fir.coordinate_of [[T]]
  n = 100; t(1) = 111; t(2) = 222; t(3) = 333
  ! CHECK: fir.load [[N]]
  ! CHECK: addi {{.*}} %c5
  ! CHECK: fir.store %{{[0-9]*}} to [[B:%[0-9]+]]
  ! CHECK: [[C:%[0-9]+]] = fir.coordinate_of [[T]]
  ! CHECK: fir.call @_QPfoo
  ! CHECK: fir.store %{{[0-9]*}} to [[D:%[0-9]+]]
  associate (a => n, b => n+5, c => t(2), d => foo(7))
    ! CHECK: fir.load [[N]]
    ! CHECK: addi %{{[0-9]*}}, %c1
    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
    a = a + 1
    ! CHECK: fir.load [[C]]
    ! CHECK: addi %{{[0-9]*}}, %c1
    ! CHECK: fir.store %{{[0-9]*}} to [[C]]
    c = c + 1
    ! CHECK: fir.load [[N]]
    ! CHECK: addi %{{[0-9]*}}, %c1
    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
    n = n + 1
    ! CHECK: fir.load [[N]]
    ! CHECK: fir.embox [[T]]
    ! CHECK: fir.load [[N]]
    ! CHECK: fir.load [[B]]
    ! CHECK: fir.load [[C]]
    ! CHECK: fir.load [[D]]
    print*, n, t, a, b, c, d ! expect: 102 111 223 333 102 105 223 7
  end associate

  call nest

  do i=1,4
    associate (x=>i)
      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
      ! CHECK: [[TWO:%.*]] = arith.constant 2 : i32
      ! CHECK: arith.cmpi eq, [[IVAL]], [[TWO]] : i32
      ! CHECK: ^bb
      if (x==2) goto 9
      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
      ! CHECK: [[THREE:%.*]] = arith.constant 3 : i32
      ! CHECK: arith.cmpi eq, [[IVAL]], [[THREE]] : i32
      ! CHECK: ^bb
      ! CHECK: fir.call @_FortranAStopStatementText
      ! CHECK: fir.unreachable
      ! CHECK: ^bb
      if (x==3) stop 'Halt'
      ! CHECK: fir.call @_FortranAioOutputAscii
      print*, "ok"
  9 end associate
  enddo
end

! CHECK-LABEL: func @_QPfoo
integer function foo(x)
  integer x
  integer, save :: i = 0
  i = i + x
  foo = i
end function foo

! CHECK-LABEL: func @_QPnest(
subroutine nest
  integer, parameter :: n = 10
  integer :: a(5), b(n)
  associate (s => sequence(size(a)))
    a = s
    associate(t => sequence(n))
      b = t
      ! CHECK:   cond_br %{{.*}}, [[BB1:\^bb[0-9]]], [[BB2:\^bb[0-9]]]
      ! CHECK: [[BB1]]:
      ! CHECK:   br [[BB3:\^bb[0-9]]]
      ! CHECK: [[BB2]]:
      if (a(1) > b(1)) goto 9
    end associate
    a = a * a
  end associate
  ! CHECK:   br [[BB3]]
  ! CHECK: [[BB3]]:
9 print *, sum(a), sum(b) ! expect: 55 55
contains
  function sequence(n)
    integer sequence(n)
    sequence = [(i,i=1,n)]
  end function
end subroutine nest