;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.

;; RUN: foreach %s %t wasm-opt --log-execution -S -o - | filecheck %s

(module
  ;; CHECK:      (type $0 (func))

  ;; CHECK:      (type $1 (func (result i32)))

  ;; CHECK:      (type $2 (func (param i32)))

  ;; CHECK:      (import "env" "func" (func $import))
  (import "env" "func" (func $import))
  ;; CHECK:      (import "env" "log_execution" (func $log_execution (param i32)))

  ;; CHECK:      (func $nopp
  ;; CHECK-NEXT:  (call $log_execution
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (nop)
  ;; CHECK-NEXT: )
  (func $nopp
    (nop)
  )
  ;; CHECK:      (func $intt (result i32)
  ;; CHECK-NEXT:  (call $log_execution
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 10)
  ;; CHECK-NEXT: )
  (func $intt (result i32)
    (i32.const 10)
  )
  ;; CHECK:      (func $workk
  ;; CHECK-NEXT:  (call $log_execution
  ;; CHECK-NEXT:   (i32.const 3)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (call $log_execution
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $workk
    (if (i32.const 0) (then (nop)))
    (drop (i32.const 1))
  )
  ;; CHECK:      (func $loops
  ;; CHECK-NEXT:  (call $log_execution
  ;; CHECK-NEXT:   (i32.const 8)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block
  ;; CHECK-NEXT:   (loop $x
  ;; CHECK-NEXT:    (call $log_execution
  ;; CHECK-NEXT:     (i32.const 4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (call $intt)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (loop $y
  ;; CHECK-NEXT:      (call $log_execution
  ;; CHECK-NEXT:       (i32.const 5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (call $loops)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (call $log_execution
  ;; CHECK-NEXT:     (i32.const 7)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (loop
  ;; CHECK-NEXT:     (call $log_execution
  ;; CHECK-NEXT:      (i32.const 6)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (block
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 10)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 20)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 30)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $loops
    (loop $x
      (call $loops)
      (br $x)
    )
    (if (call $intt)
      (then
        (loop $y
          (call $loops)
        )
      )
    )
    (loop
      (drop (i32.const 10))
      (drop (i32.const 20))
      (drop (i32.const 30))
    )
  )
  ;; CHECK:      (func $loops-similar
  ;; CHECK-NEXT:  (call $log_execution
  ;; CHECK-NEXT:   (i32.const 10)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $x
  ;; CHECK-NEXT:   (call $log_execution
  ;; CHECK-NEXT:    (i32.const 9)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (call $loops)
  ;; CHECK-NEXT:    (br $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $loops-similar
    (loop $x
      (call $loops)
      (br $x)
    )
  )
)