; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 6
; RUN: opt < %s -passes=instcombine -S | FileCheck %s

define i32 @LHSBin(i1 %C) !prof !0 {
; CHECK-LABEL: define i32 @LHSBin(
; CHECK-SAME: i1 [[C:%.*]]) !prof [[PROF0:![0-9]+]] {
; CHECK-NEXT:    [[V:%.*]] = select i1 [[C]], i32 1010, i32 20, !prof [[PROF1:![0-9]+]]
; CHECK-NEXT:    ret i32 [[V]]
;
  %A = select i1 %C, i32 1000, i32 10, !prof !1
  %V = add i32 %A, 10
  ret i32 %V
}

define i32 @RHSBin(i1 %C) !prof !0 {
; CHECK-LABEL: define i32 @RHSBin(
; CHECK-SAME: i1 [[C:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[V:%.*]] = select i1 [[C]], i32 1010, i32 20, !prof [[PROF1]]
; CHECK-NEXT:    ret i32 [[V]]
;
  %A = select i1 %C, i32 1000, i32 10, !prof !1
  %V = add i32 10, %A
  ret i32 %V;
}

define i32 @BothBin(i1 %C) !prof !0 {
; CHECK-LABEL: define i32 @BothBin(
; CHECK-SAME: i1 [[C:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[V:%.*]] = select i1 [[C]], i32 2000, i32 20, !prof [[PROF1]]
; CHECK-NEXT:    ret i32 [[V]]
;
  %A = select i1 %C, i32 1000, i32 10, !prof !1
  %B = select i1 %C, i32 1000, i32 10, !prof !1
  %V = add i32 %A, %B
  ret i32 %V;
}

define i32 @NegBin(i1 %C) !prof !0 {
; CHECK-LABEL: define i32 @NegBin(
; CHECK-SAME: i1 [[C:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[V:%.*]] = select i1 [[C]], i32 1010, i32 0, !prof [[PROF1]]
; CHECK-NEXT:    ret i32 [[V]]
;
  %A = select i1 %C, i32 1000, i32 -10, !prof !1
  %V = add i32 %A, 10
  ret i32 %V
}

define i32 @select_C_minus_1_or_C_from_bool(i1 %x) !prof !0 {
; CHECK-LABEL: define i32 @select_C_minus_1_or_C_from_bool(
; CHECK-SAME: i1 [[X:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[ADD:%.*]] = select i1 [[X]], i32 41, i32 42, !prof [[PROF2:![0-9]+]]
; CHECK-NEXT:    ret i32 [[ADD]]
;
  %ext = sext i1 %x to i32
  %add = add i32 %ext, 42
  ret i32 %add
}

define i5 @and_add(i1 %x, i1 %y) !prof !0 {
; CHECK-LABEL: define i5 @and_add(
; CHECK-SAME: i1 [[X:%.*]], i1 [[Y:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[TMP1:%.*]] = xor i1 [[X]], true
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[Y]], [[TMP1]]
; CHECK-NEXT:    [[R:%.*]] = select i1 [[TMP2]], i5 -2, i5 0, !prof [[PROF2]]
; CHECK-NEXT:    ret i5 [[R]]
;
  %xz = zext i1 %x to i5
  %ys = sext i1 %y to i5
  %sub = add i5 %xz, %ys
  %r = and i5 %sub, 30
  ret i5 %r
}

define i32 @add_zext_zext_i1(i1 %a) !prof !0 {
; CHECK-LABEL: define i32 @add_zext_zext_i1(
; CHECK-SAME: i1 [[A:%.*]]) !prof [[PROF0]] {
; CHECK-NEXT:    [[ADD:%.*]] = select i1 [[A]], i32 2, i32 0, !prof [[PROF2]]
; CHECK-NEXT:    ret i32 [[ADD]]
;
  %zext = zext i1 %a to i32
  %add = add i32 %zext, %zext
  ret i32 %add
}

define i32 @no_count_no_branch_weights(i1 %a) {
; CHECK-LABEL: define i32 @no_count_no_branch_weights(
; CHECK-SAME: i1 [[A:%.*]]) {
; CHECK-NEXT:    [[ADD:%.*]] = select i1 [[A]], i32 2, i32 0
; CHECK-NEXT:    ret i32 [[ADD]]
;
  %zext = zext i1 %a to i32
  %add = add i32 %zext, %zext
  ret i32 %add
}


!0 = !{!"function_entry_count", i64 1000}
!1 = !{!"branch_weights", i32 2, i32 3}
;.
; CHECK: [[PROF0]] = !{!"function_entry_count", i64 1000}
; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}
; CHECK: [[PROF2]] = !{!"unknown", !"instcombine"}
;.
