// RUN: %target-sil-opt -test-constant-evaluator %s 2>&1 | %FileCheck %s

/// Tests for the skip functionality of the constant evaluator which is
/// available in the stepwise evaluation mode. The evaluator will be run on
/// every function defined below whose name starts with `interpret` prefix and
/// will output the constant value returned by the function or diagnostics
/// if the evaluation fails. In addition, the evaluator will "skip" evaluating
/// any call to a function whose name starts with `skip`. Skipping a function
/// call will conservatively make all operands modified by the call as
/// unknown symbolic values.

sil_stage canonical

import Builtin
import Swift

sil @skipNoopFunction : $@convention(thin) (Int32) -> ()

// CHECK-LABEL: @interpretCallNoopFunction
sil @interpretCallNoopFunction : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %1 = integer_literal $Builtin.Int32, 13
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  %5 = function_ref @skipNoopFunction : $@convention(thin) (Int32) -> ()
  %6 = apply %5(%2) : $@convention(thin) (Int32) -> ()
  %8 = struct_extract %2 : $Int32, #Int32._value
  return %8 : $Builtin.Int32
} // CHECK: Returns int: 13

sil @skipGetInt : $@convention(thin) () -> Int32

// CHECK-LABEL: @interpretSkipFunctionReturningValue
sil hidden @interpretSkipFunctionReturningValue : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %1 = function_ref @skipGetInt : $@convention(thin) () -> Int32
  %2 = apply %1() : $@convention(thin) () -> Int32
  %3 = struct_extract %2 : $Int32, #Int32._value
  return %3 : $Builtin.Int32
} // CHECK: Returns unknown

sil @skipIncrement : $@convention(thin) (@inout Int32) -> ()

// CHECK-LABEL: @interpretSkipEffectfulFunction
sil hidden @interpretSkipEffectfulFunction : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %0 = alloc_stack $Int32, var, name "i"
  %1 = integer_literal $Builtin.Int32, 13
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  store %2 to %0 : $*Int32
  %4 = begin_access [modify] [static] %0 : $*Int32
  %5 = function_ref @skipIncrement : $@convention(thin) (@inout Int32) -> ()
  %6 = apply %5(%4) : $@convention(thin) (@inout Int32) -> ()
  end_access %4 : $*Int32

  %7 = load %0 : $*Int32
  %8 = struct_extract %7 : $Int32, #Int32._value
  dealloc_stack %0 : $*Int32
  return %8 : $Builtin.Int32
} // CHECK: Returns unknown

// CHECK-LABEL: @interpretSkipFunctionNotAffectingResult
sil hidden @interpretSkipFunctionNotAffectingResult : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %0 = alloc_stack $Int32, var, name "i"
  %1 = integer_literal $Builtin.Int32, 32
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  store %2 to %0 : $*Int32
  %3 = load %0 : $*Int32
  %4 = begin_access [modify] [static] %0 : $*Int32
  %5 = function_ref @skipIncrement : $@convention(thin) (@inout Int32) -> ()
  %6 = apply %5(%4) : $@convention(thin) (@inout Int32) -> ()
  end_access %4 : $*Int32
  %8 = struct_extract %3 : $Int32, #Int32._value
  dealloc_stack %0 : $*Int32
  return %8 : $Builtin.Int32
} // CHECK: Returns int: 32

// CHECK-LABEL: @interpretSkipFunctionInfluencingBranch
sil hidden @interpretSkipFunctionInfluencingBranch : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %0 = alloc_stack $Int32, var, name "i"
  %1 = integer_literal $Builtin.Int32, 32
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  store %2 to %0 : $*Int32
  %4 = begin_access [modify] [static] %0 : $*Int32
  %5 = function_ref @skipIncrement : $@convention(thin) (@inout Int32) -> ()
  %6 = apply %5(%4) : $@convention(thin) (@inout Int32) -> ()
  end_access %4 : $*Int32

  %7 = load %0 : $*Int32
  %8 = struct_extract %7 : $Int32, #Int32._value
  %9 = integer_literal $Builtin.Int32, 0
  %10 = builtin "cmp_slt_Int32"(%8 : $Builtin.Int32, %9 : $Builtin.Int32) : $Builtin.Int1
  cond_br %10, bb2, bb3
    // CHECK: {{.*}}:[[@LINE-1]]:{{.*}}: note: branch depends on non-constant value produced by an unevaluated instructions
    // CHECK: {{.*}}: note: value mutable by an unevaluated instruction is not a constant
bb2:
  br bb4

bb3:
  br bb4

bb4:
  dealloc_stack %0 : $*Int32
  return %8 : $Builtin.Int32
}

// Test skipping struct inits and methods

struct S {
  var first: Int64
  var second: Int64
}

sil @skipInitStruct : $@convention(method) (@thin S.Type) -> S

sil @skipAddToFirstProperty : $@convention(method) (Int64, @inout S) -> ()

// CHECK-LABEL: @interpretMutatingMethod
sil hidden @interpretMutatingMethod : $@convention(thin) (Int64) -> Builtin.Int64 {
bb0(%0 : $Int64):
  %2 = alloc_stack $S, var, name "s"
  %3 = metatype $@thin S.Type
  %4 = function_ref @skipInitStruct : $@convention(method) (@thin S.Type) -> S
  %5 = apply %4(%3) : $@convention(method) (@thin S.Type) -> S
  store %5 to %2 : $*S
  %7 = begin_access [modify] [static] %2 : $*S
  %8 = function_ref @skipAddToFirstProperty : $@convention(method) (Int64, @inout S) -> ()
  %9 = apply %8(%0, %7) : $@convention(method) (Int64, @inout S) -> ()
  end_access %7 : $*S
  %11 = begin_access [read] [static] %2 : $*S
  %12 = struct_element_addr %11 : $*S, #S.second
  %13 = load %12 : $*Int64
  end_access %11 : $*S
  %14 = struct_extract %13 : $Int64, #Int64._value
  dealloc_stack %2 : $*S
  return %14 : $Builtin.Int64
} // CHECK: Returns unknown

sil hidden @initStruct : $@convention(method) (@thin S.Type) -> S {
bb0(%0 : $@thin S.Type):
  %1 = alloc_stack $S, var, name "self"
  %2 = integer_literal $Builtin.Int64, 11
  %3 = struct $Int64 (%2 : $Builtin.Int64)
  %4 = begin_access [modify] [static] %1 : $*S
  %5 = struct_element_addr %4 : $*S, #S.first
  store %3 to %5 : $*Int64
  end_access %4 : $*S
  %8 = integer_literal $Builtin.Int64, 102
  %9 = struct $Int64 (%8 : $Builtin.Int64)
  %10 = begin_access [modify] [static] %1 : $*S
  %11 = struct_element_addr %10 : $*S, #S.second
  store %9 to %11 : $*Int64
  end_access %10 : $*S
  %14 = struct $S (%3 : $Int64, %9 : $Int64)
  dealloc_stack %1 : $*S
  return %14 : $S
}

sil @skipGetInt64 : $@convention(thin) () -> Int64

// CHECK-LABEL: @interpretInlinePropertyMutation
sil hidden @interpretInlinePropertyMutation : $@convention(thin) () -> Builtin.Int64 {
bb0:
  %0 = alloc_stack $S, var, name "s"

  // Initialize struct.
  %1 = metatype $@thin S.Type
  %2 = function_ref @initStruct : $@convention(method) (@thin S.Type) -> S
  %3 = apply %2(%1) : $@convention(method) (@thin S.Type) -> S
  store %3 to %0 : $*S

  // The first property is assigned an unknown value.
  %10 = begin_access [modify] [static] %0 : $*S
  %11 = struct_element_addr %10 : $*S, #S.first
  %12 = function_ref @skipGetInt64 : $@convention(thin) () -> Int64
  %13 = apply %12() : $@convention(thin) () -> Int64
  store %13 to %11 : $*Int64
  end_access %10 : $*S

  // Read the second property which must be a constant.
  %23 = load %0 : $*S
  %24 = struct_extract %23 : $S, #S.second
  %25 = struct_extract %24 : $Int64, #Int64._value
  dealloc_stack %0 : $*S
  return %25 : $Builtin.Int64
} // CHECK: Returns int: 102

// Test struct initialization where some properties are unknown due to skipped
// instructions.

struct Inner {
  var x: Int64
}

struct Outer {
  var first: Int64
  var second: Inner
}

sil @skipInitInner : $@convention(thin) () -> Inner

// CHECK-LABEL: @interpretStructWithUnknownArgs
sil @interpretStructWithUnknownArgs: $@convention(thin) () -> Builtin.Int64 {
bb0:
  %1 = integer_literal $Builtin.Int64, 1005
  %2 = struct $Int64 (%1 : $Builtin.Int64)
  %3 = function_ref @skipInitInner : $@convention(thin) () -> Inner
  %4 = apply %3() : $@convention(thin) () -> Inner
  %5 = struct $Outer (%2 : $Int64, %4 : $Inner)

  %6 = struct_extract %5 : $Outer, #Outer.first
  %7 = struct_extract %6 : $Int64, #Int64._value
  return %7 : $Builtin.Int64
} // CHECK: Returns int: 1005

// CHECK-LABEL: @interpretPiecewiseStructConstruction
sil @interpretPiecewiseStructConstruction: $@convention(thin) () -> Builtin.Int64 {
bb0:
  %0 = alloc_stack $Outer, var, name "outer"
  %1 = integer_literal $Builtin.Int64, 101
  %2 = struct $Int64 (%1 : $Builtin.Int64)
  %5 = struct_element_addr %0 : $*Outer, #Outer.first
  store %2 to %5 : $*Int64

  %6 = function_ref @skipInitInner : $@convention(thin) () -> Inner
  %7 = apply %6() : $@convention(thin) () -> Inner
  %8 = struct_element_addr %0 : $*Outer, #Outer.second
  store %7 to %8 : $*Inner

  %9 = load %0 : $*Outer
  %10 = struct_extract %9 : $Outer, #Outer.first
  %11 = struct_extract %10 : $Int64, #Int64._value
  dealloc_stack %0 : $*Outer
  return %11 : $Builtin.Int64
} // CHECK: Returns int: 101

protocol InnerProto {
  var x: Int64 { get }
}

struct OuterWithProto {
  var first: Int64
  var second: InnerProto
}

sil @skipConstructInnerProto : $@convention(thin) () -> @out InnerProto

// CHECK-LABEL: @interpretStructConstructionWithCopyAddr
sil @interpretStructConstructionWithCopyAddr: $@convention(thin) () -> Builtin.Int64 {
bb0:
  %1 = alloc_stack $OuterWithProto
  %2 = integer_literal $Builtin.Int64, 201
  %3 = struct $Int64 (%2 : $Builtin.Int64)
  %5 = struct_element_addr %1 : $*OuterWithProto, #OuterWithProto.first
  store %3 to %5 : $*Int64
  %8 = alloc_stack $InnerProto
  %9 = function_ref @skipConstructInnerProto : $@convention(thin) () -> @out InnerProto
  %10 = apply %9(%8) : $@convention(thin) () -> @out InnerProto
  %12 = struct_element_addr %1 : $*OuterWithProto, #OuterWithProto.second
  copy_addr [take] %8 to [initialization] %12 : $*InnerProto
  dealloc_stack %8 : $*InnerProto
  %19 = struct_element_addr %1 : $*OuterWithProto, #OuterWithProto.first
  %20 = load %19 : $*Int64
  destroy_addr %1 : $*OuterWithProto
  dealloc_stack %1 : $*OuterWithProto
  %21 = struct_extract %20 : $Int64, #Int64._value
  return %21 : $Builtin.Int64
} // CHECK: Returns int: 201

// Test the interpreter on an interleaving of skippable and interpretable
// instructions that mimics the implementation of os log.

sil @skipAppendInner : $@convention(method) (@inout Inner) -> ()

sil hidden @increment : $@convention(thin) (@inout Int64) -> () {
bb0(%0 : $*Int64):
  %2 = integer_literal $Builtin.Int64, 1
  %3 = begin_access [modify] [static] %0 : $*Int64
  %4 = struct_element_addr %3 : $*Int64, #Int64._value
  %5 = load %4 : $*Builtin.Int64
  %6 = integer_literal $Builtin.Int1, -1
  %7 = builtin "sadd_with_overflow_Int64"(%5 : $Builtin.Int64, %2 : $Builtin.Int64, %6 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
  %8 = tuple_extract %7 : $(Builtin.Int64, Builtin.Int1), 0
  %9 = tuple_extract %7 : $(Builtin.Int64, Builtin.Int1), 1
  cond_fail %9 : $Builtin.Int1
  %11 = struct $Int64 (%8 : $Builtin.Int64)
  store %11 to %3 : $*Int64
  %13 = tuple ()
  end_access %3 : $*Int64
  %15 = tuple ()
  return %15 : $()
}

// CHECK-LABEL: @interpretInteleavedSkipAndNonSkip
sil @interpretInteleavedSkipAndNonSkip : $@convention(thin) () -> Builtin.Int64 {
bb0:
  %0 = alloc_stack $Outer, var, name "outer"
  %1 = integer_literal $Builtin.Int64, 101
  %2 = struct $Int64 (%1 : $Builtin.Int64)
  %5 = struct_element_addr %0 : $*Outer, #Outer.first
  store %2 to %5 : $*Int64
  %6 = function_ref @skipInitInner : $@convention(thin) () -> Inner
  %7 = apply %6() : $@convention(thin) () -> Inner
  %8 = struct_element_addr %0 : $*Outer, #Outer.second
  store %7 to %8 : $*Inner

  // Mutate the first component and second compoennt in an interleaved way.
  %9 = struct_element_addr %0: $*Outer, #Outer.first
  %10 = function_ref @increment : $@convention(thin) (@inout Int64) -> ()
  %11 = apply %10(%9) : $@convention(thin) (@inout Int64) -> ()

  %12 = struct_element_addr %0: $*Outer, #Outer.second
  %13 = function_ref @skipAppendInner : $@convention(method) (@inout Inner) -> ()
  %14 = apply %13(%12) : $@convention(method) (@inout Inner) -> ()

  // Mutate the components once more.
  %15 = struct_element_addr %0: $*Outer, #Outer.first
  %16 = function_ref @increment : $@convention(thin) (@inout Int64) -> ()
  %17 = apply %16(%15) : $@convention(thin) (@inout Int64) -> ()

  %18 = struct_element_addr %0: $*Outer, #Outer.second
  %19 = function_ref @skipAppendInner : $@convention(method) (@inout Inner) -> ()
  %20 = apply %19(%18) : $@convention(method) (@inout Inner) -> ()

  // Return the first property which should be a constant.
  %30 = load %0 : $*Outer
  %31 = struct_extract %30 : $Outer, #Outer.first
  %32 = struct_extract %31 : $Int64, #Int64._value
  dealloc_stack %0 : $*Outer
  return %32 : $Builtin.Int64
} // CHECK: Returns int: 103
