1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -passes='print<scalar-evolution>' < %s -disable-output 2>&1 | FileCheck %s 3 4@constant = dso_local global i8 0, align 4 5@another_constant = dso_local global i8 0, align 4 6 7define i1 @binary_or.i1(i1 %x, i1 %y) { 8; CHECK-LABEL: 'binary_or.i1' 9; CHECK-NEXT: Classifying expressions for: @binary_or.i1 10; CHECK-NEXT: %r = or i1 %x, %y 11; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 12; CHECK-NEXT: Determining loop execution counts for: @binary_or.i1 13; 14 %r = or i1 %x, %y 15 ret i1 %r 16} 17 18define i2 @binary_or.i2(i2 %x, i2 %y) { 19; CHECK-LABEL: 'binary_or.i2' 20; CHECK-NEXT: Classifying expressions for: @binary_or.i2 21; CHECK-NEXT: %r = or i2 %x, %y 22; CHECK-NEXT: --> %r U: full-set S: full-set 23; CHECK-NEXT: Determining loop execution counts for: @binary_or.i2 24; 25 %r = or i2 %x, %y 26 ret i2 %r 27} 28 29define i1 @binary_or.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) { 30; CHECK-LABEL: 'binary_or.4ops.i1' 31; CHECK-NEXT: Classifying expressions for: @binary_or.4ops.i1 32; CHECK-NEXT: %t0 = or i1 %x, %y 33; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 34; CHECK-NEXT: %t1 = or i1 %z, %a 35; CHECK-NEXT: --> (%z umax %a) U: full-set S: full-set 36; CHECK-NEXT: %r = or i1 %t0, %t1 37; CHECK-NEXT: --> (%x umax %y umax %z umax %a) U: full-set S: full-set 38; CHECK-NEXT: Determining loop execution counts for: @binary_or.4ops.i1 39; 40 %t0 = or i1 %x, %y 41 %t1 = or i1 %z, %a 42 %r = or i1 %t0, %t1 43 ret i1 %r 44} 45 46define i1 @binary_and.i1(i1 %x, i1 %y) { 47; CHECK-LABEL: 'binary_and.i1' 48; CHECK-NEXT: Classifying expressions for: @binary_and.i1 49; CHECK-NEXT: %r = and i1 %x, %y 50; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 51; CHECK-NEXT: Determining loop execution counts for: @binary_and.i1 52; 53 %r = and i1 %x, %y 54 ret i1 %r 55} 56 57define i2 @binary_and.i2(i2 %x, i2 %y) { 58; CHECK-LABEL: 'binary_and.i2' 59; CHECK-NEXT: Classifying expressions for: @binary_and.i2 60; CHECK-NEXT: %r = and i2 %x, %y 61; CHECK-NEXT: --> %r U: full-set S: full-set 62; CHECK-NEXT: Determining loop execution counts for: @binary_and.i2 63; 64 %r = and i2 %x, %y 65 ret i2 %r 66} 67 68define i1 @binary_and.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) { 69; CHECK-LABEL: 'binary_and.4ops.i1' 70; CHECK-NEXT: Classifying expressions for: @binary_and.4ops.i1 71; CHECK-NEXT: %t0 = and i1 %x, %y 72; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 73; CHECK-NEXT: %t1 = and i1 %z, %a 74; CHECK-NEXT: --> (%z umin %a) U: full-set S: full-set 75; CHECK-NEXT: %r = and i1 %t0, %t1 76; CHECK-NEXT: --> (%x umin %y umin %z umin %a) U: full-set S: full-set 77; CHECK-NEXT: Determining loop execution counts for: @binary_and.4ops.i1 78; 79 %t0 = and i1 %x, %y 80 %t1 = and i1 %z, %a 81 %r = and i1 %t0, %t1 82 ret i1 %r 83} 84 85define i1 @binary_xor.i1(i1 %x, i1 %y) { 86; CHECK-LABEL: 'binary_xor.i1' 87; CHECK-NEXT: Classifying expressions for: @binary_xor.i1 88; CHECK-NEXT: %r = xor i1 %x, %y 89; CHECK-NEXT: --> (%x + %y) U: full-set S: full-set 90; CHECK-NEXT: Determining loop execution counts for: @binary_xor.i1 91; 92 %r = xor i1 %x, %y 93 ret i1 %r 94} 95 96define i2 @binary_xor.i2(i2 %x, i2 %y) { 97; CHECK-LABEL: 'binary_xor.i2' 98; CHECK-NEXT: Classifying expressions for: @binary_xor.i2 99; CHECK-NEXT: %r = xor i2 %x, %y 100; CHECK-NEXT: --> %r U: full-set S: full-set 101; CHECK-NEXT: Determining loop execution counts for: @binary_xor.i2 102; 103 %r = xor i2 %x, %y 104 ret i2 %r 105} 106 107define i1 @binary_xor.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) { 108; CHECK-LABEL: 'binary_xor.4ops.i1' 109; CHECK-NEXT: Classifying expressions for: @binary_xor.4ops.i1 110; CHECK-NEXT: %t0 = xor i1 %x, %y 111; CHECK-NEXT: --> (%x + %y) U: full-set S: full-set 112; CHECK-NEXT: %t1 = xor i1 %z, %a 113; CHECK-NEXT: --> (%z + %a) U: full-set S: full-set 114; CHECK-NEXT: %r = xor i1 %t0, %t1 115; CHECK-NEXT: --> (%x + %y + %z + %a) U: full-set S: full-set 116; CHECK-NEXT: Determining loop execution counts for: @binary_xor.4ops.i1 117; 118 %t0 = xor i1 %x, %y 119 %t1 = xor i1 %z, %a 120 %r = xor i1 %t0, %t1 121 ret i1 %r 122} 123 124define i1 @logical_or(i1 %x, i1 %y) { 125; CHECK-LABEL: 'logical_or' 126; CHECK-NEXT: Classifying expressions for: @logical_or 127; CHECK-NEXT: %r = select i1 %x, i1 true, i1 %y 128; CHECK-NEXT: --> (true + ((true + %x) umin_seq (true + %y))) U: full-set S: full-set 129; CHECK-NEXT: Determining loop execution counts for: @logical_or 130; 131 %r = select i1 %x, i1 true, i1 %y 132 ret i1 %r 133} 134 135define i1 @logical_and(i1 %x, i1 %y) { 136; CHECK-LABEL: 'logical_and' 137; CHECK-NEXT: Classifying expressions for: @logical_and 138; CHECK-NEXT: %r = select i1 %x, i1 %y, i1 false 139; CHECK-NEXT: --> (%x umin_seq %y) U: full-set S: full-set 140; CHECK-NEXT: Determining loop execution counts for: @logical_and 141; 142 %r = select i1 %x, i1 %y, i1 false 143 ret i1 %r 144} 145 146define i1 @select_x_or_false(i1 %c, i1 %x) { 147; CHECK-LABEL: 'select_x_or_false' 148; CHECK-NEXT: Classifying expressions for: @select_x_or_false 149; CHECK-NEXT: %r = select i1 %c, i1 %x, i1 false 150; CHECK-NEXT: --> (%c umin_seq %x) U: full-set S: full-set 151; CHECK-NEXT: Determining loop execution counts for: @select_x_or_false 152; 153 %r = select i1 %c, i1 %x, i1 false 154 ret i1 %r 155} 156 157define i1 @select_false_or_x(i1 %c, i1 %x) { 158; CHECK-LABEL: 'select_false_or_x' 159; CHECK-NEXT: Classifying expressions for: @select_false_or_x 160; CHECK-NEXT: %r = select i1 %c, i1 false, i1 %x 161; CHECK-NEXT: --> ((true + %c) umin_seq %x) U: full-set S: full-set 162; CHECK-NEXT: Determining loop execution counts for: @select_false_or_x 163; 164 %r = select i1 %c, i1 false, i1 %x 165 ret i1 %r 166} 167 168define i1 @select_x_or_true(i1 %c, i1 %x) { 169; CHECK-LABEL: 'select_x_or_true' 170; CHECK-NEXT: Classifying expressions for: @select_x_or_true 171; CHECK-NEXT: %r = select i1 %c, i1 %x, i1 true 172; CHECK-NEXT: --> (true + (%c umin_seq (true + %x))) U: full-set S: full-set 173; CHECK-NEXT: Determining loop execution counts for: @select_x_or_true 174; 175 %r = select i1 %c, i1 %x, i1 true 176 ret i1 %r 177} 178 179define i1 @select_true_or_x(i1 %c, i1 %x) { 180; CHECK-LABEL: 'select_true_or_x' 181; CHECK-NEXT: Classifying expressions for: @select_true_or_x 182; CHECK-NEXT: %r = select i1 %c, i1 true, i1 %x 183; CHECK-NEXT: --> (true + ((true + %c) umin_seq (true + %x))) U: full-set S: full-set 184; CHECK-NEXT: Determining loop execution counts for: @select_true_or_x 185; 186 %r = select i1 %c, i1 true, i1 %x 187 ret i1 %r 188} 189 190define i32 @select_x_or_zero(i1 %c, i32 %x) { 191; CHECK-LABEL: 'select_x_or_zero' 192; CHECK-NEXT: Classifying expressions for: @select_x_or_zero 193; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 0 194; CHECK-NEXT: --> %r U: full-set S: full-set 195; CHECK-NEXT: Determining loop execution counts for: @select_x_or_zero 196; 197 %r = select i1 %c, i32 %x, i32 0 198 ret i32 %r 199} 200 201define i32 @select_zero_or_x(i1 %c, i32 %x) { 202; CHECK-LABEL: 'select_zero_or_x' 203; CHECK-NEXT: Classifying expressions for: @select_zero_or_x 204; CHECK-NEXT: %r = select i1 %c, i32 0, i32 %x 205; CHECK-NEXT: --> %r U: full-set S: full-set 206; CHECK-NEXT: Determining loop execution counts for: @select_zero_or_x 207; 208 %r = select i1 %c, i32 0, i32 %x 209 ret i32 %r 210} 211 212define i32 @select_x_or_allones(i1 %c, i32 %x) { 213; CHECK-LABEL: 'select_x_or_allones' 214; CHECK-NEXT: Classifying expressions for: @select_x_or_allones 215; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 -1 216; CHECK-NEXT: --> %r U: full-set S: full-set 217; CHECK-NEXT: Determining loop execution counts for: @select_x_or_allones 218; 219 %r = select i1 %c, i32 %x, i32 -1 220 ret i32 %r 221} 222 223define i32 @select_allones_or_x(i1 %c, i32 %x) { 224; CHECK-LABEL: 'select_allones_or_x' 225; CHECK-NEXT: Classifying expressions for: @select_allones_or_x 226; CHECK-NEXT: %r = select i1 %c, i32 -1, i32 %x 227; CHECK-NEXT: --> %r U: full-set S: full-set 228; CHECK-NEXT: Determining loop execution counts for: @select_allones_or_x 229; 230 %r = select i1 %c, i32 -1, i32 %x 231 ret i32 %r 232} 233 234define i32 @select_x_or_intmax(i1 %c, i32 %x) { 235; CHECK-LABEL: 'select_x_or_intmax' 236; CHECK-NEXT: Classifying expressions for: @select_x_or_intmax 237; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 2147483647 238; CHECK-NEXT: --> %r U: full-set S: full-set 239; CHECK-NEXT: Determining loop execution counts for: @select_x_or_intmax 240; 241 %r = select i1 %c, i32 %x, i32 2147483647 242 ret i32 %r 243} 244 245define i32 @select_intmax_or_x(i1 %c, i32 %x) { 246; CHECK-LABEL: 'select_intmax_or_x' 247; CHECK-NEXT: Classifying expressions for: @select_intmax_or_x 248; CHECK-NEXT: %r = select i1 %c, i32 2147483647, i32 %x 249; CHECK-NEXT: --> %r U: full-set S: full-set 250; CHECK-NEXT: Determining loop execution counts for: @select_intmax_or_x 251; 252 %r = select i1 %c, i32 2147483647, i32 %x 253 ret i32 %r 254} 255 256define i32 @select_x_or_intmin(i1 %c, i32 %x) { 257; CHECK-LABEL: 'select_x_or_intmin' 258; CHECK-NEXT: Classifying expressions for: @select_x_or_intmin 259; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 -2147483648 260; CHECK-NEXT: --> %r U: full-set S: full-set 261; CHECK-NEXT: Determining loop execution counts for: @select_x_or_intmin 262; 263 %r = select i1 %c, i32 %x, i32 -2147483648 264 ret i32 %r 265} 266 267define i32 @select_intmin_or_x(i1 %c, i32 %x) { 268; CHECK-LABEL: 'select_intmin_or_x' 269; CHECK-NEXT: Classifying expressions for: @select_intmin_or_x 270; CHECK-NEXT: %r = select i1 %c, i32 -2147483648, i32 %x 271; CHECK-NEXT: --> %r U: full-set S: full-set 272; CHECK-NEXT: Determining loop execution counts for: @select_intmin_or_x 273; 274 %r = select i1 %c, i32 -2147483648, i32 %x 275 ret i32 %r 276} 277 278define i32 @select_x_or_constant(i1 %c, i32 %x) { 279; CHECK-LABEL: 'select_x_or_constant' 280; CHECK-NEXT: Classifying expressions for: @select_x_or_constant 281; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 42 282; CHECK-NEXT: --> %r U: full-set S: full-set 283; CHECK-NEXT: Determining loop execution counts for: @select_x_or_constant 284; 285 %r = select i1 %c, i32 %x, i32 42 286 ret i32 %r 287} 288 289define i32 @select_constant_or_x(i1 %c, i32 %y) { 290; CHECK-LABEL: 'select_constant_or_x' 291; CHECK-NEXT: Classifying expressions for: @select_constant_or_x 292; CHECK-NEXT: %r = select i1 %c, i32 42, i32 %y 293; CHECK-NEXT: --> %r U: full-set S: full-set 294; CHECK-NEXT: Determining loop execution counts for: @select_constant_or_x 295; 296 %r = select i1 %c, i32 42, i32 %y 297 ret i32 %r 298} 299 300define i32 @select_between_constants(i1 %c, i32 %y) { 301; CHECK-LABEL: 'select_between_constants' 302; CHECK-NEXT: Classifying expressions for: @select_between_constants 303; CHECK-NEXT: %r = select i1 %c, i32 42, i32 24 304; CHECK-NEXT: --> %r U: [8,59) S: [8,59) 305; CHECK-NEXT: Determining loop execution counts for: @select_between_constants 306; 307 %r = select i1 %c, i32 42, i32 24 308 ret i32 %r 309} 310 311define i32 @select_x_or_y(i1 %c, i32 %x, i32 %y) { 312; CHECK-LABEL: 'select_x_or_y' 313; CHECK-NEXT: Classifying expressions for: @select_x_or_y 314; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 %y 315; CHECK-NEXT: --> %r U: full-set S: full-set 316; CHECK-NEXT: Determining loop execution counts for: @select_x_or_y 317; 318 %r = select i1 %c, i32 %x, i32 %y 319 ret i32 %r 320} 321 322define i32 @select_x_or_y__noundef(i1 %c, i32 noundef %x, i32 noundef %y) { 323; CHECK-LABEL: 'select_x_or_y__noundef' 324; CHECK-NEXT: Classifying expressions for: @select_x_or_y__noundef 325; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 %y 326; CHECK-NEXT: --> %r U: full-set S: full-set 327; CHECK-NEXT: Determining loop execution counts for: @select_x_or_y__noundef 328; 329 %r = select i1 %c, i32 %x, i32 %y 330 ret i32 %r 331} 332 333define i32 @select_x_or_constantexpr(i1 %c, i32 %x) { 334; CHECK-LABEL: 'select_x_or_constantexpr' 335; CHECK-NEXT: Classifying expressions for: @select_x_or_constantexpr 336; CHECK-NEXT: %r = select i1 %c, i32 %x, i32 ptrtoint (ptr @constant to i32) 337; CHECK-NEXT: --> %r U: full-set S: full-set 338; CHECK-NEXT: Determining loop execution counts for: @select_x_or_constantexpr 339; 340 %r = select i1 %c, i32 %x, i32 ptrtoint (ptr @constant to i32) 341 ret i32 %r 342} 343 344define i32 @select_constantexpr_or_x(i1 %c, i32 %x) { 345; CHECK-LABEL: 'select_constantexpr_or_x' 346; CHECK-NEXT: Classifying expressions for: @select_constantexpr_or_x 347; CHECK-NEXT: %r = select i1 %c, i32 ptrtoint (ptr @constant to i32), i32 %x 348; CHECK-NEXT: --> %r U: full-set S: full-set 349; CHECK-NEXT: Determining loop execution counts for: @select_constantexpr_or_x 350; 351 %r = select i1 %c, i32 ptrtoint (ptr @constant to i32), i32 %x 352 ret i32 %r 353} 354 355define ptr @select_x_or_nullptr(i1 %c, ptr %x) { 356; CHECK-LABEL: 'select_x_or_nullptr' 357; CHECK-NEXT: Classifying expressions for: @select_x_or_nullptr 358; CHECK-NEXT: %r = select i1 %c, ptr %x, ptr null 359; CHECK-NEXT: --> %r U: full-set S: full-set 360; CHECK-NEXT: Determining loop execution counts for: @select_x_or_nullptr 361; 362 %r = select i1 %c, ptr %x, ptr null 363 ret ptr %r 364} 365 366define ptr @select_null_or_x(i1 %c, ptr %x) { 367; CHECK-LABEL: 'select_null_or_x' 368; CHECK-NEXT: Classifying expressions for: @select_null_or_x 369; CHECK-NEXT: %r = select i1 %c, ptr null, ptr %x 370; CHECK-NEXT: --> %r U: full-set S: full-set 371; CHECK-NEXT: Determining loop execution counts for: @select_null_or_x 372; 373 %r = select i1 %c, ptr null, ptr %x 374 ret ptr %r 375} 376 377define ptr @select_x_or_constantptr(i1 %c, ptr %x) { 378; CHECK-LABEL: 'select_x_or_constantptr' 379; CHECK-NEXT: Classifying expressions for: @select_x_or_constantptr 380; CHECK-NEXT: %r = select i1 %c, ptr %x, ptr @constant 381; CHECK-NEXT: --> %r U: full-set S: full-set 382; CHECK-NEXT: Determining loop execution counts for: @select_x_or_constantptr 383; 384 %r = select i1 %c, ptr %x, ptr @constant 385 ret ptr %r 386} 387 388define ptr @select_constantptr_or_x(i1 %c, ptr %x) { 389; CHECK-LABEL: 'select_constantptr_or_x' 390; CHECK-NEXT: Classifying expressions for: @select_constantptr_or_x 391; CHECK-NEXT: %r = select i1 %c, ptr @constant, ptr %x 392; CHECK-NEXT: --> %r U: full-set S: full-set 393; CHECK-NEXT: Determining loop execution counts for: @select_constantptr_or_x 394; 395 %r = select i1 %c, ptr @constant, ptr %x 396 ret ptr %r 397} 398 399define ptr @select_between_constantptrs(i1 %c, ptr %x) { 400; CHECK-LABEL: 'select_between_constantptrs' 401; CHECK-NEXT: Classifying expressions for: @select_between_constantptrs 402; CHECK-NEXT: %r = select i1 %c, ptr @constant, ptr @another_constant 403; CHECK-NEXT: --> %r U: [0,-3) S: [-9223372036854775808,9223372036854775805) 404; CHECK-NEXT: Determining loop execution counts for: @select_between_constantptrs 405; 406 %r = select i1 %c, ptr @constant, ptr @another_constant 407 ret ptr %r 408} 409 410define ptr @tautological_select() { 411; CHECK-LABEL: 'tautological_select' 412; CHECK-NEXT: Classifying expressions for: @tautological_select 413; CHECK-NEXT: %s = select i1 true, ptr @constant, ptr @another_constant 414; CHECK-NEXT: --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805) 415; CHECK-NEXT: %r = getelementptr i8, ptr %s 416; CHECK-NEXT: --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805) 417; CHECK-NEXT: Determining loop execution counts for: @tautological_select 418; 419 %s = select i1 true, ptr @constant, ptr @another_constant 420 %r = getelementptr i8, ptr %s 421 ret ptr %r 422} 423 424define ptr @tautological_select_like_phi(i32 %tc) { 425; CHECK-LABEL: 'tautological_select_like_phi' 426; CHECK-NEXT: Classifying expressions for: @tautological_select_like_phi 427; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 428; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,101) S: [0,101) Exits: 100 LoopDispositions: { %loop: Computable } 429; CHECK-NEXT: %r = phi ptr [ @constant, %truebb ], [ @another_constant, %falsebb ] 430; CHECK-NEXT: --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: @constant LoopDispositions: { %loop: Invariant } 431; CHECK-NEXT: %iv.next = add i32 %iv, 1 432; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,102) S: [1,102) Exits: 101 LoopDispositions: { %loop: Computable } 433; CHECK-NEXT: Determining loop execution counts for: @tautological_select_like_phi 434; CHECK-NEXT: Loop %loop: backedge-taken count is i32 100 435; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 100 436; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i32 100 437; CHECK-NEXT: Loop %loop: Trip multiple is 101 438; 439entry: 440 br label %loop 441 442loop: 443 %iv = phi i32[ 0, %entry ], [ %iv.next, %latch ] 444 br i1 true, label %truebb, label %falsebb 445 446truebb: 447 br label %latch 448 449falsebb: 450 br label %latch 451 452latch: 453 %r = phi ptr [ @constant, %truebb], [ @another_constant, %falsebb] 454 %iv.next = add i32 %iv, 1 455 %done = icmp eq i32 %iv, 100 456 br i1 %done, label %end, label %loop 457 458end: 459 ret ptr %r 460} 461 462define i32 @umin_seq_x_y(i32 %x, i32 %y) { 463; CHECK-LABEL: 'umin_seq_x_y' 464; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y 465; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 466; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 467; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 468; CHECK-NEXT: --> (%x umin_seq %y) U: full-set S: full-set 469; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y 470; 471 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 472 %x.is.zero = icmp eq i32 %x, 0 473 %r = select i1 %x.is.zero, i32 0, i32 %umin 474 ret i32 %r 475} 476 477define i32 @umin_seq_x_y_tautological(i32 %x, i32 %y) { 478; CHECK-LABEL: 'umin_seq_x_y_tautological' 479; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_tautological 480; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 481; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 482; CHECK-NEXT: %r = select i1 %umin.is.zero, i32 0, i32 %umin 483; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 484; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_tautological 485; 486 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 487 %umin.is.zero = icmp eq i32 %umin, 0 488 %r = select i1 %umin.is.zero, i32 0, i32 %umin 489 ret i32 %r 490} 491define i32 @umin_seq_x_y_tautological_wrongtype(i32 %x, i32 %y) { 492; CHECK-LABEL: 'umin_seq_x_y_tautological_wrongtype' 493; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_tautological_wrongtype 494; CHECK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %y, i32 %x) 495; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 496; CHECK-NEXT: %r = select i1 %umax.is.zero, i32 0, i32 %umax 497; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 498; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_tautological_wrongtype 499; 500 %umax = call i32 @llvm.umax(i32 %y, i32 %x) 501 %umax.is.zero = icmp eq i32 %umax, 0 502 %r = select i1 %umax.is.zero, i32 0, i32 %umax 503 ret i32 %r 504} 505 506define i32 @umin_seq_x_y_wrongtype0(i32 %x, i32 %y) { 507; CHECK-LABEL: 'umin_seq_x_y_wrongtype0' 508; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_wrongtype0 509; CHECK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %y, i32 %x) 510; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 511; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umax 512; CHECK-NEXT: --> %r U: full-set S: full-set 513; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_wrongtype0 514; 515 %umax = call i32 @llvm.umax(i32 %y, i32 %x) 516 %x.is.zero = icmp eq i32 %x, 0 517 %r = select i1 %x.is.zero, i32 0, i32 %umax 518 ret i32 %r 519} 520define i32 @umin_seq_x_y_wrongtype1(i32 %x, i32 %y) { 521; CHECK-LABEL: 'umin_seq_x_y_wrongtype1' 522; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_wrongtype1 523; CHECK-NEXT: %smax = call i32 @llvm.smax.i32(i32 %y, i32 %x) 524; CHECK-NEXT: --> (%x smax %y) U: full-set S: full-set 525; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %smax 526; CHECK-NEXT: --> %r U: full-set S: full-set 527; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_wrongtype1 528; 529 %smax = call i32 @llvm.smax(i32 %y, i32 %x) 530 %x.is.zero = icmp eq i32 %x, 0 531 %r = select i1 %x.is.zero, i32 0, i32 %smax 532 ret i32 %r 533} 534define i32 @umin_seq_x_y_wrongtype2(i32 %x, i32 %y) { 535; CHECK-LABEL: 'umin_seq_x_y_wrongtype2' 536; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_wrongtype2 537; CHECK-NEXT: %smin = call i32 @llvm.smin.i32(i32 %y, i32 %x) 538; CHECK-NEXT: --> (%x smin %y) U: full-set S: full-set 539; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %smin 540; CHECK-NEXT: --> %r U: full-set S: full-set 541; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_wrongtype2 542; 543 %smin = call i32 @llvm.smin(i32 %y, i32 %x) 544 %x.is.zero = icmp eq i32 %x, 0 545 %r = select i1 %x.is.zero, i32 0, i32 %smin 546 ret i32 %r 547} 548 549define i32 @umin_seq_x_y_wrongtype3(i32 %x, i32 %y, i32 %z) { 550; CHECK-LABEL: 'umin_seq_x_y_wrongtype3' 551; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_wrongtype3 552; CHECK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %x, i32 %z) 553; CHECK-NEXT: --> (%x umax %z) U: full-set S: full-set 554; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %umax, i32 %y) 555; CHECK-NEXT: --> ((%x umax %z) umin %y) U: full-set S: full-set 556; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 557; CHECK-NEXT: --> %r U: full-set S: full-set 558; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_wrongtype3 559; 560 %umax = call i32 @llvm.umax(i32 %x, i32 %z) 561 %umin = call i32 @llvm.umin(i32 %umax, i32 %y) 562 %x.is.zero = icmp eq i32 %x, 0 563 %r = select i1 %x.is.zero, i32 0, i32 %umin 564 ret i32 %r 565} 566 567define i32 @umin_seq_y_x(i32 %x, i32 %y) { 568; CHECK-LABEL: 'umin_seq_y_x' 569; CHECK-NEXT: Classifying expressions for: @umin_seq_y_x 570; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %x, i32 %y) 571; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 572; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 573; CHECK-NEXT: --> (%y umin_seq %x) U: full-set S: full-set 574; CHECK-NEXT: Determining loop execution counts for: @umin_seq_y_x 575; 576 %umin = call i32 @llvm.umin(i32 %x, i32 %y) 577 %x.is.zero = icmp eq i32 %y, 0 578 %r = select i1 %x.is.zero, i32 0, i32 %umin 579 ret i32 %r 580} 581 582define i32 @umin_seq_x_x_y_z(i32 %x, i32 %y, i32 %z) { 583; CHECK-LABEL: 'umin_seq_x_x_y_z' 584; CHECK-NEXT: Classifying expressions for: @umin_seq_x_x_y_z 585; CHECK-NEXT: %umin0 = call i32 @llvm.umin.i32(i32 %z, i32 %x) 586; CHECK-NEXT: --> (%x umin %z) U: full-set S: full-set 587; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %y) 588; CHECK-NEXT: --> (%x umin %y umin %z) U: full-set S: full-set 589; CHECK-NEXT: %r0 = select i1 %x.is.zero, i32 0, i32 %umin 590; CHECK-NEXT: --> (%x umin_seq (%y umin %z)) U: full-set S: full-set 591; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %r0 592; CHECK-NEXT: --> (%x umin_seq (%y umin %z)) U: full-set S: full-set 593; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_x_y_z 594; 595 %umin0 = call i32 @llvm.umin(i32 %z, i32 %x) 596 %umin = call i32 @llvm.umin(i32 %umin0, i32 %y) 597 %x.is.zero = icmp eq i32 %x, 0 598 %r0 = select i1 %x.is.zero, i32 0, i32 %umin 599 %r = select i1 %x.is.zero, i32 0, i32 %r0 600 ret i32 %r 601} 602 603define i32 @umin_seq_x_y_z(i32 %x, i32 %y, i32 %z) { 604; CHECK-LABEL: 'umin_seq_x_y_z' 605; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_z 606; CHECK-NEXT: %umin0 = call i32 @llvm.umin.i32(i32 %z, i32 %x) 607; CHECK-NEXT: --> (%x umin %z) U: full-set S: full-set 608; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %y) 609; CHECK-NEXT: --> (%x umin %y umin %z) U: full-set S: full-set 610; CHECK-NEXT: %r0 = select i1 %y.is.zero, i32 0, i32 %umin 611; CHECK-NEXT: --> (%y umin_seq (%x umin %z)) U: full-set S: full-set 612; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %r0 613; CHECK-NEXT: --> (%x umin_seq %y umin_seq %z) U: full-set S: full-set 614; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_z 615; 616 %umin0 = call i32 @llvm.umin(i32 %z, i32 %x) 617 %umin = call i32 @llvm.umin(i32 %umin0, i32 %y) 618 %x.is.zero = icmp eq i32 %x, 0 619 %y.is.zero = icmp eq i32 %y, 0 620 %r0 = select i1 %y.is.zero, i32 0, i32 %umin 621 %r = select i1 %x.is.zero, i32 0, i32 %r0 622 ret i32 %r 623} 624 625define i32 @umin_seq_a_b_c_d(i32 %a, i32 %b, i32 %c, i32 %d) { 626; CHECK-LABEL: 'umin_seq_a_b_c_d' 627; CHECK-NEXT: Classifying expressions for: @umin_seq_a_b_c_d 628; CHECK-NEXT: %umin1 = call i32 @llvm.umin.i32(i32 %c, i32 %d) 629; CHECK-NEXT: --> (%c umin %d) U: full-set S: full-set 630; CHECK-NEXT: %r1 = select i1 %c.is.zero, i32 0, i32 %umin1 631; CHECK-NEXT: --> (%c umin_seq %d) U: full-set S: full-set 632; CHECK-NEXT: %umin0 = call i32 @llvm.umin.i32(i32 %a, i32 %b) 633; CHECK-NEXT: --> (%a umin %b) U: full-set S: full-set 634; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %r1) 635; CHECK-NEXT: --> ((%c umin_seq %d) umin %a umin %b) U: full-set S: full-set 636; CHECK-NEXT: %r = select i1 %d.is.zero, i32 0, i32 %umin 637; CHECK-NEXT: --> (%d umin_seq (%a umin %b umin %c)) U: full-set S: full-set 638; CHECK-NEXT: Determining loop execution counts for: @umin_seq_a_b_c_d 639; 640 %umin1 = call i32 @llvm.umin(i32 %c, i32 %d) 641 %c.is.zero = icmp eq i32 %c, 0 642 %r1 = select i1 %c.is.zero, i32 0, i32 %umin1 643 644 %umin0 = call i32 @llvm.umin(i32 %a, i32 %b) 645 %umin = call i32 @llvm.umin(i32 %umin0, i32 %r1) 646 %d.is.zero = icmp eq i32 %d, 0 647 %r = select i1 %d.is.zero, i32 0, i32 %umin 648 ret i32 %r 649} 650 651define i32 @umin_seq_x_y_zext_both(i8 %x.narrow, i32 %y) { 652; CHECK-LABEL: 'umin_seq_x_y_zext_both' 653; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_zext_both 654; CHECK-NEXT: %x = zext i8 %x.narrow to i32 655; CHECK-NEXT: --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256) 656; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 657; CHECK-NEXT: --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256) 658; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 659; CHECK-NEXT: --> ((zext i8 %x.narrow to i32) umin_seq %y) U: [0,256) S: [0,256) 660; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_zext_both 661; 662 %x = zext i8 %x.narrow to i32 663 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 664 %x.is.zero = icmp eq i32 %x, 0 665 %r = select i1 %x.is.zero, i32 0, i32 %umin 666 ret i32 %r 667} 668 669define i32 @umin_seq_x_y_zext_in_umin(i8 %x.narrow, i32 %y) { 670; CHECK-LABEL: 'umin_seq_x_y_zext_in_umin' 671; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_zext_in_umin 672; CHECK-NEXT: %x = zext i8 %x.narrow to i32 673; CHECK-NEXT: --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256) 674; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 675; CHECK-NEXT: --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256) 676; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 677; CHECK-NEXT: --> ((zext i8 %x.narrow to i32) umin_seq %y) U: [0,256) S: [0,256) 678; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_zext_in_umin 679; 680 %x = zext i8 %x.narrow to i32 681 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 682 %x.is.zero = icmp eq i8 %x.narrow, 0 683 %r = select i1 %x.is.zero, i32 0, i32 %umin 684 ret i32 %r 685} 686 687define i8 @umin_seq_x_y_zext_in_iszero(i8 %x, i8 %y) { 688; CHECK-LABEL: 'umin_seq_x_y_zext_in_iszero' 689; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_zext_in_iszero 690; CHECK-NEXT: %x.wide = zext i8 %x to i32 691; CHECK-NEXT: --> (zext i8 %x to i32) U: [0,256) S: [0,256) 692; CHECK-NEXT: %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x) 693; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 694; CHECK-NEXT: %r = select i1 %x.is.zero, i8 0, i8 %umin 695; CHECK-NEXT: --> (%x umin_seq %y) U: full-set S: full-set 696; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_zext_in_iszero 697; 698 %x.wide = zext i8 %x to i32 699 %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x) 700 %x.is.zero = icmp eq i32 %x.wide, 0 701 %r = select i1 %x.is.zero, i8 0, i8 %umin 702 ret i8 %r 703} 704 705define i32 @umin_seq_x_y_zext_of_umin(i8 %x, i8 %y) { 706; CHECK-LABEL: 'umin_seq_x_y_zext_of_umin' 707; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_zext_of_umin 708; CHECK-NEXT: %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x) 709; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 710; CHECK-NEXT: %umin = zext i8 %umin.narrow to i32 711; CHECK-NEXT: --> ((zext i8 %x to i32) umin (zext i8 %y to i32)) U: [0,256) S: [0,256) 712; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 713; CHECK-NEXT: --> ((zext i8 %x to i32) umin_seq (zext i8 %y to i32)) U: [0,256) S: [0,256) 714; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_zext_of_umin 715; 716 %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x) 717 %umin = zext i8 %umin.narrow to i32 718 %x.is.zero = icmp eq i8 %x, 0 719 %r = select i1 %x.is.zero, i32 0, i32 %umin 720 ret i32 %r 721} 722 723define i32 @umin_seq_x_y_sext_both(i8 %x.narrow, i32 %y) { 724; CHECK-LABEL: 'umin_seq_x_y_sext_both' 725; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_sext_both 726; CHECK-NEXT: %x = sext i8 %x.narrow to i32 727; CHECK-NEXT: --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128) 728; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 729; CHECK-NEXT: --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set 730; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 731; CHECK-NEXT: --> ((sext i8 %x.narrow to i32) umin_seq %y) U: full-set S: full-set 732; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_sext_both 733; 734 %x = sext i8 %x.narrow to i32 735 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 736 %x.is.zero = icmp eq i32 %x, 0 737 %r = select i1 %x.is.zero, i32 0, i32 %umin 738 ret i32 %r 739} 740 741define i32 @umin_seq_x_y_sext_in_umin(i8 %x.narrow, i32 %y) { 742; CHECK-LABEL: 'umin_seq_x_y_sext_in_umin' 743; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_sext_in_umin 744; CHECK-NEXT: %x = sext i8 %x.narrow to i32 745; CHECK-NEXT: --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128) 746; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x) 747; CHECK-NEXT: --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set 748; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 749; CHECK-NEXT: --> %r U: full-set S: full-set 750; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_sext_in_umin 751; 752 %x = sext i8 %x.narrow to i32 753 %umin = call i32 @llvm.umin(i32 %y, i32 %x) 754 %x.is.zero = icmp eq i8 %x.narrow, 0 755 %r = select i1 %x.is.zero, i32 0, i32 %umin 756 ret i32 %r 757} 758 759define i8 @umin_seq_x_y_sext_in_iszero(i8 %x, i8 %y) { 760; CHECK-LABEL: 'umin_seq_x_y_sext_in_iszero' 761; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_sext_in_iszero 762; CHECK-NEXT: %x.wide = sext i8 %x to i32 763; CHECK-NEXT: --> (sext i8 %x to i32) U: [-128,128) S: [-128,128) 764; CHECK-NEXT: %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x) 765; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 766; CHECK-NEXT: %r = select i1 %x.is.zero, i8 0, i8 %umin 767; CHECK-NEXT: --> %r U: full-set S: full-set 768; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_sext_in_iszero 769; 770 %x.wide = sext i8 %x to i32 771 %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x) 772 %x.is.zero = icmp eq i32 %x.wide, 0 773 %r = select i1 %x.is.zero, i8 0, i8 %umin 774 ret i8 %r 775} 776 777define i32 @umin_seq_x_y_sext_of_umin(i8 %x, i8 %y) { 778; CHECK-LABEL: 'umin_seq_x_y_sext_of_umin' 779; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_sext_of_umin 780; CHECK-NEXT: %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x) 781; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 782; CHECK-NEXT: %umin = sext i8 %umin.narrow to i32 783; CHECK-NEXT: --> (sext i8 (%x umin %y) to i32) U: [-128,128) S: [-128,128) 784; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 785; CHECK-NEXT: --> %r U: [-128,128) S: [-128,128) 786; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_sext_of_umin 787; 788 %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x) 789 %umin = sext i8 %umin.narrow to i32 790 %x.is.zero = icmp eq i8 %x, 0 791 %r = select i1 %x.is.zero, i32 0, i32 %umin 792 ret i32 %r 793} 794 795define i32 @umin_seq_x_y_zext_vs_sext(i8 %x.narrow, i32 %y) { 796; CHECK-LABEL: 'umin_seq_x_y_zext_vs_sext' 797; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_zext_vs_sext 798; CHECK-NEXT: %x.zext = zext i8 %x.narrow to i32 799; CHECK-NEXT: --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256) 800; CHECK-NEXT: %x.sext = sext i8 %x.narrow to i32 801; CHECK-NEXT: --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128) 802; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.zext) 803; CHECK-NEXT: --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256) 804; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 805; CHECK-NEXT: --> %r U: [0,256) S: [0,256) 806; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_zext_vs_sext 807; 808 %x.zext = zext i8 %x.narrow to i32 809 %x.sext = sext i8 %x.narrow to i32 810 %umin = call i32 @llvm.umin(i32 %y, i32 %x.zext) 811 %x.is.zero = icmp eq i32 %x.sext, 0 812 %r = select i1 %x.is.zero, i32 0, i32 %umin 813 ret i32 %r 814} 815define i32 @umin_seq_x_y_sext_vs_zext(i8 %x.narrow, i32 %y) { 816; CHECK-LABEL: 'umin_seq_x_y_sext_vs_zext' 817; CHECK-NEXT: Classifying expressions for: @umin_seq_x_y_sext_vs_zext 818; CHECK-NEXT: %x.zext = zext i8 %x.narrow to i32 819; CHECK-NEXT: --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256) 820; CHECK-NEXT: %x.sext = sext i8 %x.narrow to i32 821; CHECK-NEXT: --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128) 822; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.sext) 823; CHECK-NEXT: --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set 824; CHECK-NEXT: %r = select i1 %x.is.zero, i32 0, i32 %umin 825; CHECK-NEXT: --> %r U: full-set S: full-set 826; CHECK-NEXT: Determining loop execution counts for: @umin_seq_x_y_sext_vs_zext 827; 828 %x.zext = zext i8 %x.narrow to i32 829 %x.sext = sext i8 %x.narrow to i32 830 %umin = call i32 @llvm.umin(i32 %y, i32 %x.sext) 831 %x.is.zero = icmp eq i32 %x.zext, 0 832 %r = select i1 %x.is.zero, i32 0, i32 %umin 833 ret i32 %r 834} 835 836define i32 @select_x_or_zero_expanded(i1 %c, i32 %x) { 837; CHECK-LABEL: 'select_x_or_zero_expanded' 838; CHECK-NEXT: Classifying expressions for: @select_x_or_zero_expanded 839; CHECK-NEXT: %c.splat = sext i1 %c to i32 840; CHECK-NEXT: --> (sext i1 %c to i32) U: [-1,1) S: [-1,1) 841; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c.splat, i32 %x) 842; CHECK-NEXT: --> ((sext i1 %c to i32) umin %x) U: full-set S: full-set 843; CHECK-NEXT: %r = select i1 %v0.is.zero, i32 0, i32 %umin 844; CHECK-NEXT: --> ((sext i1 %c to i32) umin_seq %x) U: full-set S: full-set 845; CHECK-NEXT: Determining loop execution counts for: @select_x_or_zero_expanded 846; 847 %c.splat = sext i1 %c to i32 848 %umin = call i32 @llvm.umin(i32 %c.splat, i32 %x) 849 %v0.is.zero = icmp eq i32 %c.splat, 0 850 %r = select i1 %v0.is.zero, i32 0, i32 %umin 851 ret i32 %r 852} 853 854define i32 @select_zero_or_x_expanded(i1 %c, i32 %y) { 855; CHECK-LABEL: 'select_zero_or_x_expanded' 856; CHECK-NEXT: Classifying expressions for: @select_zero_or_x_expanded 857; CHECK-NEXT: %c.splat = sext i1 %c to i32 858; CHECK-NEXT: --> (sext i1 %c to i32) U: [-1,1) S: [-1,1) 859; CHECK-NEXT: %c.splat.not = xor i32 %c.splat, -1 860; CHECK-NEXT: --> (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> U: [-1,1) S: [-1,1) 861; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c.splat.not, i32 %y) 862; CHECK-NEXT: --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin %y) U: full-set S: full-set 863; CHECK-NEXT: %r = select i1 %v0.is.zero, i32 0, i32 %umin 864; CHECK-NEXT: --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq %y) U: full-set S: full-set 865; CHECK-NEXT: Determining loop execution counts for: @select_zero_or_x_expanded 866; 867 %c.splat = sext i1 %c to i32 868 %c.splat.not = xor i32 %c.splat, -1 869 %umin = call i32 @llvm.umin(i32 %c.splat.not, i32 %y) 870 %v0.is.zero = icmp eq i32 %c.splat.not, 0 871 %r = select i1 %v0.is.zero, i32 0, i32 %umin 872 ret i32 %r 873} 874define i32 @select_zero_or_x_expanded2(i1 %c, i32 %y) { 875; CHECK-LABEL: 'select_zero_or_x_expanded2' 876; CHECK-NEXT: Classifying expressions for: @select_zero_or_x_expanded2 877; CHECK-NEXT: %c.not = xor i1 %c, true 878; CHECK-NEXT: --> (true + %c) U: full-set S: full-set 879; CHECK-NEXT: %c.not.splat = sext i1 %c.not to i32 880; CHECK-NEXT: --> (sext i1 (true + %c) to i32) U: [-1,1) S: [-1,1) 881; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c.not.splat, i32 %y) 882; CHECK-NEXT: --> ((sext i1 (true + %c) to i32) umin %y) U: full-set S: full-set 883; CHECK-NEXT: %r = select i1 %v0.is.zero, i32 0, i32 %umin 884; CHECK-NEXT: --> ((sext i1 (true + %c) to i32) umin_seq %y) U: full-set S: full-set 885; CHECK-NEXT: Determining loop execution counts for: @select_zero_or_x_expanded2 886; 887 %c.not = xor i1 %c, -1 888 %c.not.splat = sext i1 %c.not to i32 889 %umin = call i32 @llvm.umin(i32 %c.not.splat, i32 %y) 890 %v0.is.zero = icmp eq i32 %c.not.splat, 0 891 %r = select i1 %v0.is.zero, i32 0, i32 %umin 892 ret i32 %r 893} 894 895define i32 @select_x_or_constant_expanded(i1 %c, i32 %x) { 896; CHECK-LABEL: 'select_x_or_constant_expanded' 897; CHECK-NEXT: Classifying expressions for: @select_x_or_constant_expanded 898; CHECK-NEXT: %c.splat = sext i1 %c to i32 899; CHECK-NEXT: --> (sext i1 %c to i32) U: [-1,1) S: [-1,1) 900; CHECK-NEXT: %x.off = sub i32 %x, 42 901; CHECK-NEXT: --> (-42 + %x) U: full-set S: full-set 902; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c.splat, i32 %x.off) 903; CHECK-NEXT: --> ((sext i1 %c to i32) umin (-42 + %x)) U: full-set S: full-set 904; CHECK-NEXT: %r.off = select i1 %v0.is.zero, i32 0, i32 %umin 905; CHECK-NEXT: --> ((sext i1 %c to i32) umin_seq (-42 + %x)) U: full-set S: full-set 906; CHECK-NEXT: %r = add i32 %r.off, 42 907; CHECK-NEXT: --> (42 + ((sext i1 %c to i32) umin_seq (-42 + %x))) U: full-set S: full-set 908; CHECK-NEXT: Determining loop execution counts for: @select_x_or_constant_expanded 909; 910 %c.splat = sext i1 %c to i32 911 %x.off = sub i32 %x, 42 912 %umin = call i32 @llvm.umin(i32 %c.splat, i32 %x.off) 913 %v0.is.zero = icmp eq i32 %c.splat, 0 914 %r.off = select i1 %v0.is.zero, i32 0, i32 %umin 915 %r = add i32 %r.off, 42 916 ret i32 %r 917} 918 919define i32 @select_constant_or_y_expanded(i1 %c, i32 %y) { 920; CHECK-LABEL: 'select_constant_or_y_expanded' 921; CHECK-NEXT: Classifying expressions for: @select_constant_or_y_expanded 922; CHECK-NEXT: %c.splat = sext i1 %c to i32 923; CHECK-NEXT: --> (sext i1 %c to i32) U: [-1,1) S: [-1,1) 924; CHECK-NEXT: %c.splat.not = xor i32 %c.splat, -1 925; CHECK-NEXT: --> (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> U: [-1,1) S: [-1,1) 926; CHECK-NEXT: %y.off = sub i32 %y, 42 927; CHECK-NEXT: --> (-42 + %y) U: full-set S: full-set 928; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c.splat.not, i32 %y.off) 929; CHECK-NEXT: --> ((-42 + %y) umin (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw>) U: full-set S: full-set 930; CHECK-NEXT: %r.off = select i1 %v0.is.zero, i32 0, i32 %umin 931; CHECK-NEXT: --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq (-42 + %y)) U: full-set S: full-set 932; CHECK-NEXT: %r = add i32 %r.off, 42 933; CHECK-NEXT: --> (42 + ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq (-42 + %y))) U: full-set S: full-set 934; CHECK-NEXT: Determining loop execution counts for: @select_constant_or_y_expanded 935; 936 %c.splat = sext i1 %c to i32 937 %c.splat.not = xor i32 %c.splat, -1 938 %y.off = sub i32 %y, 42 939 %umin = call i32 @llvm.umin(i32 %c.splat.not, i32 %y.off) 940 %v0.is.zero = icmp eq i32 %c.splat.not, 0 941 %r.off = select i1 %v0.is.zero, i32 0, i32 %umin 942 %r = add i32 %r.off, 42 943 ret i32 %r 944} 945 946declare i8 @llvm.umin.i8(i8, i8) 947declare i8 @llvm.umax.i8(i8, i8) 948declare i8 @llvm.smin.i8(i8, i8) 949declare i8 @llvm.smax.i8(i8, i8) 950 951declare i32 @llvm.umin(i32, i32) 952declare i32 @llvm.umax(i32, i32) 953declare i32 @llvm.smin(i32, i32) 954declare i32 @llvm.smax(i32, i32) 955