reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    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
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instcombine -S | FileCheck %s

; No selects should remain.

define i41 @zext(i1 %C) {
; CHECK-LABEL: @zext(
; CHECK-NEXT:    [[V:%.*]] = zext i1 %C to i41
; CHECK-NEXT:    ret i41 [[V]]
;
  %V = select i1 %C, i41 1, i41 0
  ret i41 %V
}

define i41 @sext(i1 %C) {
; CHECK-LABEL: @sext(
; CHECK-NEXT:    [[V:%.*]] = sext i1 %C to i41
; CHECK-NEXT:    ret i41 [[V]]
;
  %V = select i1 %C, i41 -1, i41 0
  ret i41 %V
}

define i999 @not_zext(i1 %C) {
; CHECK-LABEL: @not_zext(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor i1 %C, true
; CHECK-NEXT:    [[V:%.*]] = zext i1 [[NOT_C]] to i999
; CHECK-NEXT:    ret i999 [[V]]
;
  %V = select i1 %C, i999 0, i999 1
  ret i999 %V
}

define i999 @not_sext(i1 %C) {
; CHECK-LABEL: @not_sext(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor i1 %C, true
; CHECK-NEXT:    [[V:%.*]] = sext i1 [[NOT_C]] to i999
; CHECK-NEXT:    ret i999 [[V]]
;
  %V = select i1 %C, i999 0, i999 -1
  ret i999 %V
}

; Vector selects of vector splat constants match APInt too.

define <2 x i41> @zext_vec(<2 x i1> %C) {
; CHECK-LABEL: @zext_vec(
; CHECK-NEXT:    [[V:%.*]] = zext <2 x i1> %C to <2 x i41>
; CHECK-NEXT:    ret <2 x i41> [[V]]
;
  %V = select <2 x i1> %C, <2 x i41> <i41 1, i41 1>, <2 x i41> <i41 0, i41 0>
  ret <2 x i41> %V
}

define <2 x i32> @sext_vec(<2 x i1> %C) {
; CHECK-LABEL: @sext_vec(
; CHECK-NEXT:    [[V:%.*]] = sext <2 x i1> %C to <2 x i32>
; CHECK-NEXT:    ret <2 x i32> [[V]]
;
  %V = select <2 x i1> %C, <2 x i32> <i32 -1, i32 -1>, <2 x i32> <i32 0, i32 0>
  ret <2 x i32> %V
}

define <2 x i999> @not_zext_vec(<2 x i1> %C) {
; CHECK-LABEL: @not_zext_vec(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true>
; CHECK-NEXT:    [[V:%.*]] = zext <2 x i1> [[NOT_C]] to <2 x i999>
; CHECK-NEXT:    ret <2 x i999> [[V]]
;
  %V = select <2 x i1> %C, <2 x i999> <i999 0, i999 0>, <2 x i999> <i999 1, i999 1>
  ret <2 x i999> %V
}

define <2 x i64> @not_sext_vec(<2 x i1> %C) {
; CHECK-LABEL: @not_sext_vec(
; CHECK-NEXT:    [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true>
; CHECK-NEXT:    [[V:%.*]] = sext <2 x i1> [[NOT_C]] to <2 x i64>
; CHECK-NEXT:    ret <2 x i64> [[V]]
;
  %V = select <2 x i1> %C, <2 x i64> <i64 0, i64 0>, <2 x i64> <i64 -1, i64 -1>
  ret <2 x i64> %V
}

; But don't touch this - we would need 3 instructions to extend and splat the scalar select condition.

define <2 x i32> @scalar_select_of_vectors(i1 %c) {
; CHECK-LABEL: @scalar_select_of_vectors(
; CHECK-NEXT:    [[V:%.*]] = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
; CHECK-NEXT:    ret <2 x i32> [[V]]
;
  %V = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer
  ret <2 x i32> %V
}

;; (x <s 0) ? -1 : 0 -> ashr x, 31

define i41 @test3(i41 %X) {
; CHECK-LABEL: @test3(
; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i41 %X, 40
; CHECK-NEXT:    ret i41 [[X_LOBIT]]
;
  %t = icmp slt i41 %X, 0
  %V = select i1 %t, i41 -1, i41 0
  ret i41 %V
}

;; (x <s 0) ? -1 : 0 -> ashr x, 31

define i1023 @test4(i1023 %X) {
; CHECK-LABEL: @test4(
; CHECK-NEXT:    [[X_LOBIT:%.*]] = ashr i1023 %X, 1022
; CHECK-NEXT:    ret i1023 [[X_LOBIT]]
;
  %t = icmp slt i1023 %X, 0
  %V = select i1 %t, i1023 -1, i1023 0
  ret i1023 %V
}