1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 ; RUN: opt < %s -instsimplify -S | FileCheck %s 3 4 ; Test all integer predicates with bool types and true/false constants. 5 ; Use vectors to provide test coverage that is not duplicated in other folds. 6 7 define <2 x i1> @eq_t(<2 x i1> %a) { 8 ; CHECK-LABEL: @eq_t( 9 ; CHECK-NEXT: ret <2 x i1> %a 10 ; 11 %r = icmp eq <2 x i1> %a, <i1 true, i1 true> 12 ret <2 x i1> %r 13 } 14 15 define <2 x i1> @eq_t_undef_elt(<2 x i1> %a) { 16 ; CHECK-LABEL: @eq_t_undef_elt( 17 ; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 18 ; 19 %r = icmp eq <2 x i1> %a, <i1 undef, i1 true> 20 ret <2 x i1> %r 21 } 22 23 define <2 x i1> @eq_f(<2 x i1> %a) { 24 ; CHECK-LABEL: @eq_f( 25 ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i1> %a, zeroinitializer 26 ; CHECK-NEXT: ret <2 x i1> [[R]] 27 ; 28 %r = icmp eq <2 x i1> %a, <i1 false, i1 false> 29 ret <2 x i1> %r 30 } 31 32 define <2 x i1> @ne_t(<2 x i1> %a) { 33 ; CHECK-LABEL: @ne_t( 34 ; CHECK-NEXT: [[R:%.*]] = icmp ne <2 x i1> %a, <i1 true, i1 true> 35 ; CHECK-NEXT: ret <2 x i1> [[R]] 36 ; 37 %r = icmp ne <2 x i1> %a, <i1 true, i1 true> 38 ret <2 x i1> %r 39 } 40 41 define <2 x i1> @ne_f(<2 x i1> %a) { 42 ; CHECK-LABEL: @ne_f( 43 ; CHECK-NEXT: ret <2 x i1> %a 44 ; 45 %r = icmp ne <2 x i1> %a, <i1 false, i1 false> 46 ret <2 x i1> %r 47 } 48 49 define <2 x i1> @ugt_t(<2 x i1> %a) { 50 ; CHECK-LABEL: @ugt_t( 51 ; CHECK-NEXT: ret <2 x i1> zeroinitializer 52 ; 53 %r = icmp ugt <2 x i1> %a, <i1 true, i1 true> 54 ret <2 x i1> %r 55 } 56 57 define <2 x i1> @ugt_t_undef_elt(<2 x i1> %a) { 58 ; CHECK-LABEL: @ugt_t_undef_elt( 59 ; CHECK-NEXT: ret <2 x i1> zeroinitializer 60 ; 61 %r = icmp ugt <2 x i1> %a, <i1 true, i1 undef> 62 ret <2 x i1> %r 63 } 64 65 define <2 x i1> @ugt_f(<2 x i1> %a) { 66 ; CHECK-LABEL: @ugt_f( 67 ; CHECK-NEXT: ret <2 x i1> %a 68 ; 69 %r = icmp ugt <2 x i1> %a, <i1 false, i1 false> 70 ret <2 x i1> %r 71 } 72 73 define <2 x i1> @ult_t(<2 x i1> %a) { 74 ; CHECK-LABEL: @ult_t( 75 ; CHECK-NEXT: [[R:%.*]] = icmp ult <2 x i1> %a, <i1 true, i1 true> 76 ; CHECK-NEXT: ret <2 x i1> [[R]] 77 ; 78 %r = icmp ult <2 x i1> %a, <i1 true, i1 true> 79 ret <2 x i1> %r 80 } 81 82 define <2 x i1> @ult_f(<2 x i1> %a) { 83 ; CHECK-LABEL: @ult_f( 84 ; CHECK-NEXT: ret <2 x i1> zeroinitializer 85 ; 86 %r = icmp ult <2 x i1> %a, <i1 false, i1 false> 87 ret <2 x i1> %r 88 } 89 90 define <2 x i1> @sgt_t(<2 x i1> %a) { 91 ; CHECK-LABEL: @sgt_t( 92 ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i1> %a, <i1 true, i1 true> 93 ; CHECK-NEXT: ret <2 x i1> [[R]] 94 ; 95 %r = icmp sgt <2 x i1> %a, <i1 true, i1 true> 96 ret <2 x i1> %r 97 } 98 99 define <2 x i1> @sgt_f(<2 x i1> %a) { 100 ; CHECK-LABEL: @sgt_f( 101 ; CHECK-NEXT: ret <2 x i1> zeroinitializer 102 ; 103 %r = icmp sgt <2 x i1> %a, <i1 false, i1 false> 104 ret <2 x i1> %r 105 } 106 107 define <2 x i1> @slt_t(<2 x i1> %a) { 108 ; CHECK-LABEL: @slt_t( 109 ; CHECK-NEXT: ret <2 x i1> zeroinitializer 110 ; 111 %r = icmp slt <2 x i1> %a, <i1 true, i1 true> 112 ret <2 x i1> %r 113 } 114 115 define <2 x i1> @slt_f(<2 x i1> %a) { 116 ; CHECK-LABEL: @slt_f( 117 ; CHECK-NEXT: ret <2 x i1> %a 118 ; 119 %r = icmp slt <2 x i1> %a, <i1 false, i1 false> 120 ret <2 x i1> %r 121 } 122 123 define <2 x i1> @uge_t(<2 x i1> %a) { 124 ; CHECK-LABEL: @uge_t( 125 ; CHECK-NEXT: ret <2 x i1> %a 126 ; 127 %r = icmp uge <2 x i1> %a, <i1 true, i1 true> 128 ret <2 x i1> %r 129 } 130 131 define <2 x i1> @uge_f(<2 x i1> %a) { 132 ; CHECK-LABEL: @uge_f( 133 ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 134 ; 135 %r = icmp uge <2 x i1> %a, <i1 false, i1 false> 136 ret <2 x i1> %r 137 } 138 139 define <2 x i1> @ule_t(<2 x i1> %a) { 140 ; CHECK-LABEL: @ule_t( 141 ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 142 ; 143 %r = icmp ule <2 x i1> %a, <i1 true, i1 true> 144 ret <2 x i1> %r 145 } 146 147 define <2 x i1> @ule_f(<2 x i1> %a) { 148 ; CHECK-LABEL: @ule_f( 149 ; CHECK-NEXT: [[R:%.*]] = icmp ule <2 x i1> %a, zeroinitializer 150 ; CHECK-NEXT: ret <2 x i1> [[R]] 151 ; 152 %r = icmp ule <2 x i1> %a, <i1 false, i1 false> 153 ret <2 x i1> %r 154 } 155 156 define <2 x i1> @sge_t(<2 x i1> %a) { 157 ; CHECK-LABEL: @sge_t( 158 ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 159 ; 160 %r = icmp sge <2 x i1> %a, <i1 true, i1 true> 161 ret <2 x i1> %r 162 } 163 164 define <2 x i1> @sge_t_undef_elt(<2 x i1> %a) { 165 ; CHECK-LABEL: @sge_t_undef_elt( 166 ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 167 ; 168 %r = icmp sge <2 x i1> %a, <i1 true, i1 undef> 169 ret <2 x i1> %r 170 } 171 172 define <2 x i1> @sge_f(<2 x i1> %a) { 173 ; CHECK-LABEL: @sge_f( 174 ; CHECK-NEXT: [[R:%.*]] = icmp sge <2 x i1> %a, zeroinitializer 175 ; CHECK-NEXT: ret <2 x i1> [[R]] 176 ; 177 %r = icmp sge <2 x i1> %a, <i1 false, i1 false> 178 ret <2 x i1> %r 179 } 180 181 define <2 x i1> @sle_t(<2 x i1> %a) { 182 ; CHECK-LABEL: @sle_t( 183 ; CHECK-NEXT: ret <2 x i1> %a 184 ; 185 %r = icmp sle <2 x i1> %a, <i1 true, i1 true> 186 ret <2 x i1> %r 187 } 188 189 define <2 x i1> @sle_f(<2 x i1> %a) { 190 ; CHECK-LABEL: @sle_f( 191 ; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 192 ; 193 %r = icmp sle <2 x i1> %a, <i1 false, i1 false> 194 ret <2 x i1> %r 195 } 196 197