1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4declare void @llvm.assume(i1) 5define <2 x i1> @select_v_ne_z(<2 x i8> %v, <2 x i8> %yy) { 6; CHECK-LABEL: @select_v_ne_z( 7; CHECK-NEXT: ret <2 x i1> zeroinitializer 8; 9 %y = or <2 x i8> %yy, <i8 1, i8 1> 10 %cmp = icmp ne <2 x i8> %v, zeroinitializer 11 %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y 12 %r = icmp eq <2 x i8> %s, zeroinitializer 13 ret <2 x i1> %r 14} 15 16define i1 @select_v_ne_fail(i8 %v, i8 %y) { 17; CHECK-LABEL: @select_v_ne_fail( 18; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 19; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 20; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[V:%.*]], 1 21; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 22; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 23; CHECK-NEXT: ret i1 [[R]] 24; 25 %ynz = icmp ne i8 %y, 0 26 call void @llvm.assume(i1 %ynz) 27 %cmp = icmp ne i8 %v, 1 28 %s = select i1 %cmp, i8 %v, i8 %y 29 %r = icmp eq i8 %s, 0 30 ret i1 %r 31} 32 33define i1 @select_v_eq_nz(i8 %v, i8 %y) { 34; CHECK-LABEL: @select_v_eq_nz( 35; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 36; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 37; CHECK-NEXT: ret i1 false 38; 39 %ynz = icmp ne i8 %y, 0 40 call void @llvm.assume(i1 %ynz) 41 %cmp = icmp eq i8 44, %v 42 %s = select i1 %cmp, i8 %v, i8 %y 43 %r = icmp eq i8 %s, 0 44 ret i1 %r 45} 46 47define i1 @inv_select_v_ugt_nz(i8 %v, i8 %C, i8 %y) { 48; CHECK-LABEL: @inv_select_v_ugt_nz( 49; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 50; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 51; CHECK-NEXT: ret i1 false 52; 53 %ynz = icmp ne i8 %y, 0 54 call void @llvm.assume(i1 %ynz) 55 %cmp = icmp ugt i8 14, %v 56 %s = select i1 %cmp, i8 %y, i8 %v 57 %r = icmp eq i8 %s, 0 58 ret i1 %r 59} 60 61define i1 @inv_select_v_ugt_fail(i8 %v, i8 %C, i8 %y) { 62; CHECK-LABEL: @inv_select_v_ugt_fail( 63; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 64; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 65; CHECK-NEXT: ret i1 false 66; 67 %ynz = icmp ne i8 %y, 0 68 call void @llvm.assume(i1 %ynz) 69 %cmp = icmp ugt i8 -2, %v 70 %s = select i1 %cmp, i8 %y, i8 %v 71 %r = icmp eq i8 %s, 0 72 ret i1 %r 73} 74 75define <2 x i1> @select_v_ult(<2 x i8> %v, <2 x i8> %C, <2 x i8> %yy) { 76; CHECK-LABEL: @select_v_ult( 77; CHECK-NEXT: ret <2 x i1> zeroinitializer 78; 79 %y = or <2 x i8> %yy, <i8 1, i8 1> 80 %cmp = icmp ult <2 x i8> %C, %v 81 %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y 82 %r = icmp eq <2 x i8> %s, zeroinitializer 83 ret <2 x i1> %r 84} 85 86define <2 x i1> @select_v_uge_nz(<2 x i8> %v, <2 x i8> %yy) { 87; CHECK-LABEL: @select_v_uge_nz( 88; CHECK-NEXT: ret <2 x i1> zeroinitializer 89; 90 %y = or <2 x i8> %yy, <i8 1, i8 1> 91 %cmp = icmp uge <2 x i8> %v, <i8 1, i8 1> 92 %s = select <2 x i1> %cmp, <2 x i8> %v, <2 x i8> %y 93 %r = icmp eq <2 x i8> %s, zeroinitializer 94 ret <2 x i1> %r 95} 96 97define i1 @inv_select_v_ule(i8 %v, i8 %y) { 98; CHECK-LABEL: @inv_select_v_ule( 99; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 100; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 101; CHECK-NEXT: ret i1 false 102; 103 %ynz = icmp ne i8 %y, 0 104 call void @llvm.assume(i1 %ynz) 105 %cmp = icmp ule i8 %v, 4 106 %s = select i1 %cmp, i8 %y, i8 %v 107 %r = icmp eq i8 %s, 0 108 ret i1 %r 109} 110 111define i1 @select_v_sgt_nonneg(i8 %v, i8 %y) { 112; CHECK-LABEL: @select_v_sgt_nonneg( 113; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 114; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 115; CHECK-NEXT: ret i1 false 116; 117 %ynz = icmp ne i8 %y, 0 118 call void @llvm.assume(i1 %ynz) 119 %cmp = icmp sgt i8 %v, 0 120 %s = select i1 %cmp, i8 %v, i8 %y 121 %r = icmp eq i8 %s, 0 122 ret i1 %r 123} 124 125define i1 @select_v_sgt_fail(i8 %v, i8 %y) { 126; CHECK-LABEL: @select_v_sgt_fail( 127; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 128; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 129; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[V:%.*]], -1 130; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 131; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 132; CHECK-NEXT: ret i1 [[R]] 133; 134 %ynz = icmp ne i8 %y, 0 135 call void @llvm.assume(i1 %ynz) 136 %cmp = icmp sgt i8 %v, -1 137 %s = select i1 %cmp, i8 %v, i8 %y 138 %r = icmp eq i8 %s, 0 139 ret i1 %r 140} 141 142define i1 @inv_select_v_sgt_neg(i8 %v, i8 %y) { 143; CHECK-LABEL: @inv_select_v_sgt_neg( 144; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 145; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 146; CHECK-NEXT: ret i1 false 147; 148 %ynz = icmp ne i8 %y, 0 149 call void @llvm.assume(i1 %ynz) 150 %cmp = icmp sgt i8 %v, -1 151 %s = select i1 %cmp, i8 %y, i8 %v 152 %r = icmp eq i8 %s, 0 153 ret i1 %r 154} 155 156define i1 @inv_select_v_sgt_nonneg_nz(i8 %v, i8 %C, i8 %y) { 157; CHECK-LABEL: @inv_select_v_sgt_nonneg_nz( 158; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 159; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 160; CHECK-NEXT: ret i1 false 161; 162 %ynz = icmp ne i8 %y, 0 163 call void @llvm.assume(i1 %ynz) 164 %cmp = icmp sgt i8 99, %v 165 %s = select i1 %cmp, i8 %y, i8 %v 166 %r = icmp eq i8 %s, 0 167 ret i1 %r 168} 169 170define i1 @select_v_slt_nonneg(i8 %v, i8 %y) { 171; CHECK-LABEL: @select_v_slt_nonneg( 172; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 173; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 174; CHECK-NEXT: ret i1 false 175; 176 %ynz = icmp ne i8 %y, 0 177 call void @llvm.assume(i1 %ynz) 178 %cmp = icmp slt i8 0, %v 179 %s = select i1 %cmp, i8 %v, i8 %y 180 %r = icmp eq i8 %s, 0 181 ret i1 %r 182} 183 184define i1 @select_v_slt_nonneg_fail(i8 %v, i8 %C, i8 %y) { 185; CHECK-LABEL: @select_v_slt_nonneg_fail( 186; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 187; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 188; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 -1, [[V:%.*]] 189; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 190; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 191; CHECK-NEXT: ret i1 [[R]] 192; 193 %ynz = icmp ne i8 %y, 0 194 call void @llvm.assume(i1 %ynz) 195 %cmp = icmp slt i8 -1, %v 196 %s = select i1 %cmp, i8 %v, i8 %y 197 %r = icmp eq i8 %s, 0 198 ret i1 %r 199} 200 201define i1 @select_v_slt_neg(i8 %v, i8 %y) { 202; CHECK-LABEL: @select_v_slt_neg( 203; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 204; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 205; CHECK-NEXT: ret i1 false 206; 207 %ynz = icmp ne i8 %y, 0 208 call void @llvm.assume(i1 %ynz) 209 %cmp = icmp slt i8 %v, -1 210 %s = select i1 %cmp, i8 %v, i8 %y 211 %r = icmp eq i8 %s, 0 212 ret i1 %r 213} 214 215define i1 @select_v_sge_nonneg_nz(i8 %v, i8 %y) { 216; CHECK-LABEL: @select_v_sge_nonneg_nz( 217; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 218; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 219; CHECK-NEXT: ret i1 false 220; 221 %ynz = icmp ne i8 %y, 0 222 call void @llvm.assume(i1 %ynz) 223 %cmp = icmp sge i8 %v, 1 224 %s = select i1 %cmp, i8 %v, i8 %y 225 %r = icmp eq i8 %s, 0 226 ret i1 %r 227} 228 229define i1 @select_v_sge_neg(i8 %v, i8 %y) { 230; CHECK-LABEL: @select_v_sge_neg( 231; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 232; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 233; CHECK-NEXT: ret i1 false 234; 235 %ynz = icmp ne i8 %y, 0 236 call void @llvm.assume(i1 %ynz) 237 %cmp = icmp sge i8 -3, %v 238 %s = select i1 %cmp, i8 %v, i8 %y 239 %r = icmp eq i8 %s, 0 240 ret i1 %r 241} 242 243define i1 @inv_select_v_sge_z(i8 %v, i8 %y) { 244; CHECK-LABEL: @inv_select_v_sge_z( 245; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 246; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 247; CHECK-NEXT: ret i1 false 248; 249 %ynz = icmp ne i8 %y, 0 250 call void @llvm.assume(i1 %ynz) 251 %cmp = icmp sge i8 %v, 0 252 %s = select i1 %cmp, i8 %y, i8 %v 253 %r = icmp eq i8 %s, 0 254 ret i1 %r 255} 256 257define i1 @inv_select_v_sge_fail(i8 %v, i8 %C, i8 %y) { 258; CHECK-LABEL: @inv_select_v_sge_fail( 259; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 260; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 261; CHECK-NEXT: ret i1 false 262; 263 %ynz = icmp ne i8 %y, 0 264 call void @llvm.assume(i1 %ynz) 265 %cmp = icmp sge i8 %v, -44 266 %s = select i1 %cmp, i8 %y, i8 %v 267 %r = icmp eq i8 %s, 0 268 ret i1 %r 269} 270 271define i1 @select_v_sle_neg(i8 %v, i8 %y) { 272; CHECK-LABEL: @select_v_sle_neg( 273; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 274; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 275; CHECK-NEXT: ret i1 false 276; 277 %ynz = icmp ne i8 %y, 0 278 call void @llvm.assume(i1 %ynz) 279 %cmp = icmp sle i8 %v, -1 280 %s = select i1 %cmp, i8 %v, i8 %y 281 %r = icmp eq i8 %s, 0 282 ret i1 %r 283} 284 285define i1 @select_v_sle_nonneg_nz(i8 %v, i8 %y) { 286; CHECK-LABEL: @select_v_sle_nonneg_nz( 287; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 288; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 289; CHECK-NEXT: ret i1 false 290; 291 %ynz = icmp ne i8 %y, 0 292 call void @llvm.assume(i1 %ynz) 293 %cmp = icmp sle i8 1, %v 294 %s = select i1 %cmp, i8 %v, i8 %y 295 %r = icmp eq i8 %s, 0 296 ret i1 %r 297} 298 299define i1 @select_v_sle_fail(i8 %v, i8 %y) { 300; CHECK-LABEL: @select_v_sle_fail( 301; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 302; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 303; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 0, [[V:%.*]] 304; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[V]], i8 [[Y]] 305; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[S]], 0 306; CHECK-NEXT: ret i1 [[R]] 307; 308 %ynz = icmp ne i8 %y, 0 309 call void @llvm.assume(i1 %ynz) 310 %cmp = icmp sle i8 0, %v 311 %s = select i1 %cmp, i8 %v, i8 %y 312 %r = icmp eq i8 %s, 0 313 ret i1 %r 314} 315 316define i1 @inv_select_v_sle_nonneg(i8 %v, i8 %y) { 317; CHECK-LABEL: @inv_select_v_sle_nonneg( 318; CHECK-NEXT: [[YNZ:%.*]] = icmp ne i8 [[Y:%.*]], 0 319; CHECK-NEXT: call void @llvm.assume(i1 [[YNZ]]) 320; CHECK-NEXT: ret i1 false 321; 322 %ynz = icmp ne i8 %y, 0 323 call void @llvm.assume(i1 %ynz) 324 %cmp = icmp sle i8 %v, 0 325 %s = select i1 %cmp, i8 %y, i8 %v 326 %r = icmp eq i8 %s, 0 327 ret i1 %r 328} 329