// RUN: cir-opt -cir-canonicalize -cir-simplify -o %t.cir %s
// RUN: FileCheck --input-file=%t.cir %s

!s32i = !cir.int<s, 32>

module {
  cir.func @fold_true(%arg0 : !s32i, %arg1 : !s32i) -> !s32i {
    %0 = cir.const #cir.bool<true> : !cir.bool
    %1 = cir.select if %0 then %arg0 else %arg1 : (!cir.bool, !s32i, !s32i) -> !s32i
    cir.return %1 : !s32i
  }

  //      CHECK: cir.func{{.*}} @fold_true(%[[ARG0:.+]]: !s32i, %[[ARG1:.+]]: !s32i) -> !s32i {
  // CHECK-NEXT:   cir.return %[[ARG0]] : !s32i
  // CHECK-NEXT: }

  cir.func @fold_false(%arg0 : !s32i, %arg1 : !s32i) -> !s32i {
    %0 = cir.const #cir.bool<false> : !cir.bool
    %1 = cir.select if %0 then %arg0 else %arg1 : (!cir.bool, !s32i, !s32i) -> !s32i
    cir.return %1 : !s32i
  }

  //      CHECK: cir.func{{.*}} @fold_false(%[[ARG0:.+]]: !s32i, %[[ARG1:.+]]: !s32i) -> !s32i {
  // CHECK-NEXT:   cir.return %[[ARG1]] : !s32i
  // CHECK-NEXT: }

  cir.func @fold_to_const(%arg0 : !cir.bool) -> !s32i {
    %0 = cir.const #cir.int<42> : !s32i
    %1 = cir.select if %arg0 then %0 else %0 : (!cir.bool, !s32i, !s32i) -> !s32i
    cir.return %1 : !s32i
  }

  //      CHECK: cir.func{{.*}} @fold_to_const(%{{.+}}: !cir.bool) -> !s32i {
  // CHECK-NEXT:   %[[#A:]] = cir.const #cir.int<42> : !s32i
  // CHECK-NEXT:   cir.return %[[#A]] : !s32i
  // CHECK-NEXT: }

  cir.func @simplify_1(%arg0 : !cir.bool) -> !cir.bool {
    %0 = cir.const #cir.bool<true> : !cir.bool
    %1 = cir.const #cir.bool<false> : !cir.bool
    %2 = cir.select if %arg0 then %0 else %1 : (!cir.bool, !cir.bool, !cir.bool) -> !cir.bool
    cir.return %2 : !cir.bool
  }

  //      CHECK: cir.func{{.*}} @simplify_1(%[[ARG0:.+]]: !cir.bool) -> !cir.bool {
  // CHECK-NEXT:   cir.return %[[ARG0]] : !cir.bool
  // CHECK-NEXT: }

  cir.func @simplify_2(%arg0 : !cir.bool) -> !cir.bool {
    %0 = cir.const #cir.bool<false> : !cir.bool
    %1 = cir.const #cir.bool<true> : !cir.bool
    %2 = cir.select if %arg0 then %0 else %1 : (!cir.bool, !cir.bool, !cir.bool) -> !cir.bool
    cir.return %2 : !cir.bool
  }

  //      CHECK: cir.func{{.*}} @simplify_2(%[[ARG0:.+]]: !cir.bool) -> !cir.bool {
  // CHECK-NEXT:   %[[#A:]] = cir.unary(not, %[[ARG0]]) : !cir.bool, !cir.bool
  // CHECK-NEXT:   cir.return %[[#A]] : !cir.bool
  // CHECK-NEXT: }
}
