1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4; Test all integer predicates with bool types and true/false constants, 5; with not on LHS (icmp pred not(X), true|false). 6; Use vectors to provide test coverage that is not duplicated in other folds. 7 8define <2 x i1> @eq_t_not(<2 x i1> %a) { 9; CHECK-LABEL: @eq_t_not( 10; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 11; CHECK-NEXT: ret <2 x i1> [[NOT]] 12; 13 %not = xor <2 x i1> %a, <i1 true, i1 true> 14 %r = icmp eq <2 x i1> %not, <i1 true, i1 true> 15 ret <2 x i1> %r 16} 17 18define <2 x i1> @eq_f_not(<2 x i1> %a) { 19; CHECK-LABEL: @eq_f_not( 20; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 21; 22 %not = xor <2 x i1> %a, <i1 true, i1 true> 23 %r = icmp eq <2 x i1> %not, <i1 false, i1 false> 24 ret <2 x i1> %r 25} 26 27define <2 x i1> @eq_f_not_swap(<2 x i1> %a) { 28; CHECK-LABEL: @eq_f_not_swap( 29; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 30; 31 %not = xor <2 x i1> <i1 true, i1 true>, %a 32 %r = icmp eq <2 x i1> %not, <i1 false, i1 false> 33 ret <2 x i1> %r 34} 35 36define <2 x i1> @eq_f_not_poison(<2 x i1> %a) { 37; CHECK-LABEL: @eq_f_not_poison( 38; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 39; 40 %not = xor <2 x i1> %a, <i1 poison, i1 true> 41 %r = icmp eq <2 x i1> %not, <i1 false, i1 false> 42 ret <2 x i1> %r 43} 44 45define <2 x i1> @ne_t_not(<2 x i1> %a) { 46; CHECK-LABEL: @ne_t_not( 47; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 48; 49 %not = xor <2 x i1> %a, <i1 true, i1 true> 50 %r = icmp ne <2 x i1> %not, <i1 true, i1 true> 51 ret <2 x i1> %r 52} 53 54define <2 x i1> @ne_t_not_swap(<2 x i1> %a) { 55; CHECK-LABEL: @ne_t_not_swap( 56; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 57; 58 %not = xor <2 x i1> <i1 true, i1 true>, %a 59 %r = icmp ne <2 x i1> %not, <i1 true, i1 true> 60 ret <2 x i1> %r 61} 62 63define <2 x i1> @ne_t_not_poison(<2 x i1> %a) { 64; CHECK-LABEL: @ne_t_not_poison( 65; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 66; 67 %not = xor <2 x i1> %a, <i1 poison, i1 true> 68 %r = icmp ne <2 x i1> %not, <i1 true, i1 true> 69 ret <2 x i1> %r 70} 71 72define <2 x i1> @ne_f_not(<2 x i1> %a) { 73; CHECK-LABEL: @ne_f_not( 74; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 75; CHECK-NEXT: ret <2 x i1> [[NOT]] 76; 77 %not = xor <2 x i1> %a, <i1 true, i1 true> 78 %r = icmp ne <2 x i1> %not, <i1 false, i1 false> 79 ret <2 x i1> %r 80} 81 82define <2 x i1> @ugt_t_not(<2 x i1> %a) { 83; CHECK-LABEL: @ugt_t_not( 84; CHECK-NEXT: ret <2 x i1> zeroinitializer 85; 86 %not = xor <2 x i1> %a, <i1 true, i1 true> 87 %r = icmp ugt <2 x i1> %not, <i1 true, i1 true> 88 ret <2 x i1> %r 89} 90 91define <2 x i1> @ugt_f_not(<2 x i1> %a) { 92; CHECK-LABEL: @ugt_f_not( 93; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 94; CHECK-NEXT: ret <2 x i1> [[NOT]] 95; 96 %not = xor <2 x i1> %a, <i1 true, i1 true> 97 %r = icmp ugt <2 x i1> %not, <i1 false, i1 false> 98 ret <2 x i1> %r 99} 100 101define <2 x i1> @ult_t_not(<2 x i1> %a) { 102; CHECK-LABEL: @ult_t_not( 103; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 104; 105 %not = xor <2 x i1> %a, <i1 true, i1 true> 106 %r = icmp ult <2 x i1> %not, <i1 true, i1 true> 107 ret <2 x i1> %r 108} 109 110define <2 x i1> @ult_t_not_swap(<2 x i1> %a) { 111; CHECK-LABEL: @ult_t_not_swap( 112; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 113; 114 %not = xor <2 x i1> <i1 true, i1 true>, %a 115 %r = icmp ult <2 x i1> %not, <i1 true, i1 true> 116 ret <2 x i1> %r 117} 118 119define <2 x i1> @ult_t_not_poison(<2 x i1> %a) { 120; CHECK-LABEL: @ult_t_not_poison( 121; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 122; 123 %not = xor <2 x i1> %a, <i1 poison, i1 true> 124 %r = icmp ult <2 x i1> %not, <i1 true, i1 true> 125 ret <2 x i1> %r 126} 127 128define <2 x i1> @ult_f_not(<2 x i1> %a) { 129; CHECK-LABEL: @ult_f_not( 130; CHECK-NEXT: ret <2 x i1> zeroinitializer 131; 132 %not = xor <2 x i1> %a, <i1 true, i1 true> 133 %r = icmp ult <2 x i1> %not, <i1 false, i1 false> 134 ret <2 x i1> %r 135} 136 137define <2 x i1> @sgt_t_not(<2 x i1> %a) { 138; CHECK-LABEL: @sgt_t_not( 139; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 140; 141 %not = xor <2 x i1> %a, <i1 true, i1 true> 142 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true> 143 ret <2 x i1> %r 144} 145 146define <2 x i1> @sgt_t_not_swap(<2 x i1> %a) { 147; CHECK-LABEL: @sgt_t_not_swap( 148; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 149; 150 %not = xor <2 x i1> <i1 true, i1 true>, %a 151 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true> 152 ret <2 x i1> %r 153} 154 155define <2 x i1> @sgt_t_not_poison(<2 x i1> %a) { 156; CHECK-LABEL: @sgt_t_not_poison( 157; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 158; 159 %not = xor <2 x i1> %a, <i1 poison, i1 true> 160 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true> 161 ret <2 x i1> %r 162} 163 164define <2 x i1> @sgt_f_not(<2 x i1> %a) { 165; CHECK-LABEL: @sgt_f_not( 166; CHECK-NEXT: ret <2 x i1> zeroinitializer 167; 168 %not = xor <2 x i1> %a, <i1 true, i1 true> 169 %r = icmp sgt <2 x i1> %not, <i1 false, i1 false> 170 ret <2 x i1> %r 171} 172 173define <2 x i1> @slt_t_not(<2 x i1> %a) { 174; CHECK-LABEL: @slt_t_not( 175; CHECK-NEXT: ret <2 x i1> zeroinitializer 176; 177 %not = xor <2 x i1> %a, <i1 true, i1 true> 178 %r = icmp slt <2 x i1> %not, <i1 true, i1 true> 179 ret <2 x i1> %r 180} 181 182define <2 x i1> @slt_f_not(<2 x i1> %a) { 183; CHECK-LABEL: @slt_f_not( 184; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 185; CHECK-NEXT: ret <2 x i1> [[NOT]] 186; 187 %not = xor <2 x i1> %a, <i1 true, i1 true> 188 %r = icmp slt <2 x i1> %not, <i1 false, i1 false> 189 ret <2 x i1> %r 190} 191 192define <2 x i1> @uge_t_not(<2 x i1> %a) { 193; CHECK-LABEL: @uge_t_not( 194; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 195; CHECK-NEXT: ret <2 x i1> [[NOT]] 196; 197 %not = xor <2 x i1> %a, <i1 true, i1 true> 198 %r = icmp uge <2 x i1> %not, <i1 true, i1 true> 199 ret <2 x i1> %r 200} 201 202define <2 x i1> @uge_f_not(<2 x i1> %a) { 203; CHECK-LABEL: @uge_f_not( 204; CHECK-NEXT: ret <2 x i1> splat (i1 true) 205; 206 %not = xor <2 x i1> %a, <i1 true, i1 true> 207 %r = icmp uge <2 x i1> %not, <i1 false, i1 false> 208 ret <2 x i1> %r 209} 210 211define <2 x i1> @ule_t_not(<2 x i1> %a) { 212; CHECK-LABEL: @ule_t_not( 213; CHECK-NEXT: ret <2 x i1> splat (i1 true) 214; 215 %not = xor <2 x i1> %a, <i1 true, i1 true> 216 %r = icmp ule <2 x i1> %not, <i1 true, i1 true> 217 ret <2 x i1> %r 218} 219 220define <2 x i1> @ule_f_not(<2 x i1> %a) { 221; CHECK-LABEL: @ule_f_not( 222; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 223; 224 %not = xor <2 x i1> %a, <i1 true, i1 true> 225 %r = icmp ule <2 x i1> %not, <i1 false, i1 false> 226 ret <2 x i1> %r 227} 228 229define <2 x i1> @ule_f_not_swap(<2 x i1> %a) { 230; CHECK-LABEL: @ule_f_not_swap( 231; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 232; 233 %not = xor <2 x i1> <i1 true, i1 true>, %a 234 %r = icmp ule <2 x i1> %not, <i1 false, i1 false> 235 ret <2 x i1> %r 236} 237 238define <2 x i1> @ule_f_not_poison(<2 x i1> %a) { 239; CHECK-LABEL: @ule_f_not_poison( 240; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 241; 242 %not = xor <2 x i1> %a, <i1 poison, i1 true> 243 %r = icmp ule <2 x i1> %not, <i1 false, i1 false> 244 ret <2 x i1> %r 245} 246 247define <2 x i1> @sge_t_not(<2 x i1> %a) { 248; CHECK-LABEL: @sge_t_not( 249; CHECK-NEXT: ret <2 x i1> splat (i1 true) 250; 251 %not = xor <2 x i1> %a, <i1 true, i1 true> 252 %r = icmp sge <2 x i1> %not, <i1 true, i1 true> 253 ret <2 x i1> %r 254} 255 256define <2 x i1> @sge_f_not(<2 x i1> %a) { 257; CHECK-LABEL: @sge_f_not( 258; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 259; 260 %not = xor <2 x i1> %a, <i1 true, i1 true> 261 %r = icmp sge <2 x i1> %not, <i1 false, i1 false> 262 ret <2 x i1> %r 263} 264 265define <2 x i1> @sge_f_not_swap(<2 x i1> %a) { 266; CHECK-LABEL: @sge_f_not_swap( 267; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 268; 269 %not = xor <2 x i1> <i1 true, i1 true>, %a 270 %r = icmp sge <2 x i1> %not, <i1 false, i1 false> 271 ret <2 x i1> %r 272} 273 274define <2 x i1> @sge_f_not_poison(<2 x i1> %a) { 275; CHECK-LABEL: @sge_f_not_poison( 276; CHECK-NEXT: ret <2 x i1> [[A:%.*]] 277; 278 %not = xor <2 x i1> %a, <i1 poison, i1 true> 279 %r = icmp sge <2 x i1> %not, <i1 false, i1 false> 280 ret <2 x i1> %r 281} 282 283define <2 x i1> @sle_t_not(<2 x i1> %a) { 284; CHECK-LABEL: @sle_t_not( 285; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true) 286; CHECK-NEXT: ret <2 x i1> [[NOT]] 287; 288 %not = xor <2 x i1> %a, <i1 true, i1 true> 289 %r = icmp sle <2 x i1> %not, <i1 true, i1 true> 290 ret <2 x i1> %r 291} 292 293define <2 x i1> @sle_f_not(<2 x i1> %a) { 294; CHECK-LABEL: @sle_f_not( 295; CHECK-NEXT: ret <2 x i1> splat (i1 true) 296; 297 %not = xor <2 x i1> %a, <i1 true, i1 true> 298 %r = icmp sle <2 x i1> %not, <i1 false, i1 false> 299 ret <2 x i1> %r 300} 301