1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=NOZBB,RV32I 3; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=NOZBB,RV64I 4; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | \ 5; RUN: FileCheck %s --check-prefixes=ZBB,RV32ZBB 6; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | \ 7; RUN: FileCheck %s --check-prefixes=ZBB,RV64ZBB 8 9; Basic tests. 10 11declare i8 @llvm.smax.i8(i8 %a, i8 %b) readnone 12 13define signext i8 @smax_i8(i8 signext %a, i8 signext %b) { 14; NOZBB-LABEL: smax_i8: 15; NOZBB: # %bb.0: 16; NOZBB-NEXT: blt a1, a0, .LBB0_2 17; NOZBB-NEXT: # %bb.1: 18; NOZBB-NEXT: mv a0, a1 19; NOZBB-NEXT: .LBB0_2: 20; NOZBB-NEXT: ret 21; 22; ZBB-LABEL: smax_i8: 23; ZBB: # %bb.0: 24; ZBB-NEXT: max a0, a0, a1 25; ZBB-NEXT: ret 26 %c = call i8 @llvm.smax.i8(i8 %a, i8 %b) 27 ret i8 %c 28} 29 30declare i16 @llvm.smax.i16(i16 %a, i16 %b) readnone 31 32define signext i16 @smax_i16(i16 signext %a, i16 signext %b) { 33; NOZBB-LABEL: smax_i16: 34; NOZBB: # %bb.0: 35; NOZBB-NEXT: blt a1, a0, .LBB1_2 36; NOZBB-NEXT: # %bb.1: 37; NOZBB-NEXT: mv a0, a1 38; NOZBB-NEXT: .LBB1_2: 39; NOZBB-NEXT: ret 40; 41; ZBB-LABEL: smax_i16: 42; ZBB: # %bb.0: 43; ZBB-NEXT: max a0, a0, a1 44; ZBB-NEXT: ret 45 %c = call i16 @llvm.smax.i16(i16 %a, i16 %b) 46 ret i16 %c 47} 48 49declare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone 50 51define signext i32 @smax_i32(i32 signext %a, i32 signext %b) { 52; NOZBB-LABEL: smax_i32: 53; NOZBB: # %bb.0: 54; NOZBB-NEXT: blt a1, a0, .LBB2_2 55; NOZBB-NEXT: # %bb.1: 56; NOZBB-NEXT: mv a0, a1 57; NOZBB-NEXT: .LBB2_2: 58; NOZBB-NEXT: ret 59; 60; ZBB-LABEL: smax_i32: 61; ZBB: # %bb.0: 62; ZBB-NEXT: max a0, a0, a1 63; ZBB-NEXT: ret 64 %c = call i32 @llvm.smax.i32(i32 %a, i32 %b) 65 ret i32 %c 66} 67 68declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone 69 70define i64 @smax_i64(i64 %a, i64 %b) { 71; RV32I-LABEL: smax_i64: 72; RV32I: # %bb.0: 73; RV32I-NEXT: beq a1, a3, .LBB3_2 74; RV32I-NEXT: # %bb.1: 75; RV32I-NEXT: slt a4, a3, a1 76; RV32I-NEXT: beqz a4, .LBB3_3 77; RV32I-NEXT: j .LBB3_4 78; RV32I-NEXT: .LBB3_2: 79; RV32I-NEXT: sltu a4, a2, a0 80; RV32I-NEXT: bnez a4, .LBB3_4 81; RV32I-NEXT: .LBB3_3: 82; RV32I-NEXT: mv a0, a2 83; RV32I-NEXT: mv a1, a3 84; RV32I-NEXT: .LBB3_4: 85; RV32I-NEXT: ret 86; 87; RV64I-LABEL: smax_i64: 88; RV64I: # %bb.0: 89; RV64I-NEXT: blt a1, a0, .LBB3_2 90; RV64I-NEXT: # %bb.1: 91; RV64I-NEXT: mv a0, a1 92; RV64I-NEXT: .LBB3_2: 93; RV64I-NEXT: ret 94; 95; RV32ZBB-LABEL: smax_i64: 96; RV32ZBB: # %bb.0: 97; RV32ZBB-NEXT: beq a1, a3, .LBB3_2 98; RV32ZBB-NEXT: # %bb.1: 99; RV32ZBB-NEXT: slt a4, a3, a1 100; RV32ZBB-NEXT: beqz a4, .LBB3_3 101; RV32ZBB-NEXT: j .LBB3_4 102; RV32ZBB-NEXT: .LBB3_2: 103; RV32ZBB-NEXT: sltu a4, a2, a0 104; RV32ZBB-NEXT: bnez a4, .LBB3_4 105; RV32ZBB-NEXT: .LBB3_3: 106; RV32ZBB-NEXT: mv a0, a2 107; RV32ZBB-NEXT: mv a1, a3 108; RV32ZBB-NEXT: .LBB3_4: 109; RV32ZBB-NEXT: ret 110; 111; RV64ZBB-LABEL: smax_i64: 112; RV64ZBB: # %bb.0: 113; RV64ZBB-NEXT: max a0, a0, a1 114; RV64ZBB-NEXT: ret 115 %c = call i64 @llvm.smax.i64(i64 %a, i64 %b) 116 ret i64 %c 117} 118 119declare i8 @llvm.smin.i8(i8 %a, i8 %b) readnone 120 121define signext i8 @smin_i8(i8 signext %a, i8 signext %b) { 122; NOZBB-LABEL: smin_i8: 123; NOZBB: # %bb.0: 124; NOZBB-NEXT: blt a0, a1, .LBB4_2 125; NOZBB-NEXT: # %bb.1: 126; NOZBB-NEXT: mv a0, a1 127; NOZBB-NEXT: .LBB4_2: 128; NOZBB-NEXT: ret 129; 130; ZBB-LABEL: smin_i8: 131; ZBB: # %bb.0: 132; ZBB-NEXT: min a0, a0, a1 133; ZBB-NEXT: ret 134 %c = call i8 @llvm.smin.i8(i8 %a, i8 %b) 135 ret i8 %c 136} 137 138declare i16 @llvm.smin.i16(i16 %a, i16 %b) readnone 139 140define signext i16 @smin_i16(i16 signext %a, i16 signext %b) { 141; NOZBB-LABEL: smin_i16: 142; NOZBB: # %bb.0: 143; NOZBB-NEXT: blt a0, a1, .LBB5_2 144; NOZBB-NEXT: # %bb.1: 145; NOZBB-NEXT: mv a0, a1 146; NOZBB-NEXT: .LBB5_2: 147; NOZBB-NEXT: ret 148; 149; ZBB-LABEL: smin_i16: 150; ZBB: # %bb.0: 151; ZBB-NEXT: min a0, a0, a1 152; ZBB-NEXT: ret 153 %c = call i16 @llvm.smin.i16(i16 %a, i16 %b) 154 ret i16 %c 155} 156 157declare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone 158 159define signext i32 @smin_i32(i32 signext %a, i32 signext %b) { 160; NOZBB-LABEL: smin_i32: 161; NOZBB: # %bb.0: 162; NOZBB-NEXT: blt a0, a1, .LBB6_2 163; NOZBB-NEXT: # %bb.1: 164; NOZBB-NEXT: mv a0, a1 165; NOZBB-NEXT: .LBB6_2: 166; NOZBB-NEXT: ret 167; 168; ZBB-LABEL: smin_i32: 169; ZBB: # %bb.0: 170; ZBB-NEXT: min a0, a0, a1 171; ZBB-NEXT: ret 172 %c = call i32 @llvm.smin.i32(i32 %a, i32 %b) 173 ret i32 %c 174} 175 176declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone 177 178define i64 @smin_i64(i64 %a, i64 %b) { 179; RV32I-LABEL: smin_i64: 180; RV32I: # %bb.0: 181; RV32I-NEXT: beq a1, a3, .LBB7_2 182; RV32I-NEXT: # %bb.1: 183; RV32I-NEXT: slt a4, a1, a3 184; RV32I-NEXT: beqz a4, .LBB7_3 185; RV32I-NEXT: j .LBB7_4 186; RV32I-NEXT: .LBB7_2: 187; RV32I-NEXT: sltu a4, a0, a2 188; RV32I-NEXT: bnez a4, .LBB7_4 189; RV32I-NEXT: .LBB7_3: 190; RV32I-NEXT: mv a0, a2 191; RV32I-NEXT: mv a1, a3 192; RV32I-NEXT: .LBB7_4: 193; RV32I-NEXT: ret 194; 195; RV64I-LABEL: smin_i64: 196; RV64I: # %bb.0: 197; RV64I-NEXT: blt a0, a1, .LBB7_2 198; RV64I-NEXT: # %bb.1: 199; RV64I-NEXT: mv a0, a1 200; RV64I-NEXT: .LBB7_2: 201; RV64I-NEXT: ret 202; 203; RV32ZBB-LABEL: smin_i64: 204; RV32ZBB: # %bb.0: 205; RV32ZBB-NEXT: beq a1, a3, .LBB7_2 206; RV32ZBB-NEXT: # %bb.1: 207; RV32ZBB-NEXT: slt a4, a1, a3 208; RV32ZBB-NEXT: beqz a4, .LBB7_3 209; RV32ZBB-NEXT: j .LBB7_4 210; RV32ZBB-NEXT: .LBB7_2: 211; RV32ZBB-NEXT: sltu a4, a0, a2 212; RV32ZBB-NEXT: bnez a4, .LBB7_4 213; RV32ZBB-NEXT: .LBB7_3: 214; RV32ZBB-NEXT: mv a0, a2 215; RV32ZBB-NEXT: mv a1, a3 216; RV32ZBB-NEXT: .LBB7_4: 217; RV32ZBB-NEXT: ret 218; 219; RV64ZBB-LABEL: smin_i64: 220; RV64ZBB: # %bb.0: 221; RV64ZBB-NEXT: min a0, a0, a1 222; RV64ZBB-NEXT: ret 223 %c = call i64 @llvm.smin.i64(i64 %a, i64 %b) 224 ret i64 %c 225} 226 227declare i8 @llvm.umax.i8(i8 %a, i8 %b) readnone 228 229define i8 @umax_i8(i8 zeroext %a, i8 zeroext %b) { 230; NOZBB-LABEL: umax_i8: 231; NOZBB: # %bb.0: 232; NOZBB-NEXT: bltu a1, a0, .LBB8_2 233; NOZBB-NEXT: # %bb.1: 234; NOZBB-NEXT: mv a0, a1 235; NOZBB-NEXT: .LBB8_2: 236; NOZBB-NEXT: ret 237; 238; ZBB-LABEL: umax_i8: 239; ZBB: # %bb.0: 240; ZBB-NEXT: maxu a0, a0, a1 241; ZBB-NEXT: ret 242 %c = call i8 @llvm.umax.i8(i8 %a, i8 %b) 243 ret i8 %c 244} 245 246declare i16 @llvm.umax.i16(i16 %a, i16 %b) readnone 247 248define i16 @umax_i16(i16 zeroext %a, i16 zeroext %b) { 249; NOZBB-LABEL: umax_i16: 250; NOZBB: # %bb.0: 251; NOZBB-NEXT: bltu a1, a0, .LBB9_2 252; NOZBB-NEXT: # %bb.1: 253; NOZBB-NEXT: mv a0, a1 254; NOZBB-NEXT: .LBB9_2: 255; NOZBB-NEXT: ret 256; 257; ZBB-LABEL: umax_i16: 258; ZBB: # %bb.0: 259; ZBB-NEXT: maxu a0, a0, a1 260; ZBB-NEXT: ret 261 %c = call i16 @llvm.umax.i16(i16 %a, i16 %b) 262 ret i16 %c 263} 264 265declare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone 266 267define signext i32 @umax_i32(i32 signext %a, i32 signext %b) { 268; NOZBB-LABEL: umax_i32: 269; NOZBB: # %bb.0: 270; NOZBB-NEXT: bltu a1, a0, .LBB10_2 271; NOZBB-NEXT: # %bb.1: 272; NOZBB-NEXT: mv a0, a1 273; NOZBB-NEXT: .LBB10_2: 274; NOZBB-NEXT: ret 275; 276; ZBB-LABEL: umax_i32: 277; ZBB: # %bb.0: 278; ZBB-NEXT: maxu a0, a0, a1 279; ZBB-NEXT: ret 280 %c = call i32 @llvm.umax.i32(i32 %a, i32 %b) 281 ret i32 %c 282} 283 284declare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone 285 286define i64 @umax_i64(i64 %a, i64 %b) { 287; RV32I-LABEL: umax_i64: 288; RV32I: # %bb.0: 289; RV32I-NEXT: beq a1, a3, .LBB11_2 290; RV32I-NEXT: # %bb.1: 291; RV32I-NEXT: sltu a4, a3, a1 292; RV32I-NEXT: beqz a4, .LBB11_3 293; RV32I-NEXT: j .LBB11_4 294; RV32I-NEXT: .LBB11_2: 295; RV32I-NEXT: sltu a4, a2, a0 296; RV32I-NEXT: bnez a4, .LBB11_4 297; RV32I-NEXT: .LBB11_3: 298; RV32I-NEXT: mv a0, a2 299; RV32I-NEXT: mv a1, a3 300; RV32I-NEXT: .LBB11_4: 301; RV32I-NEXT: ret 302; 303; RV64I-LABEL: umax_i64: 304; RV64I: # %bb.0: 305; RV64I-NEXT: bltu a1, a0, .LBB11_2 306; RV64I-NEXT: # %bb.1: 307; RV64I-NEXT: mv a0, a1 308; RV64I-NEXT: .LBB11_2: 309; RV64I-NEXT: ret 310; 311; RV32ZBB-LABEL: umax_i64: 312; RV32ZBB: # %bb.0: 313; RV32ZBB-NEXT: beq a1, a3, .LBB11_2 314; RV32ZBB-NEXT: # %bb.1: 315; RV32ZBB-NEXT: sltu a4, a3, a1 316; RV32ZBB-NEXT: beqz a4, .LBB11_3 317; RV32ZBB-NEXT: j .LBB11_4 318; RV32ZBB-NEXT: .LBB11_2: 319; RV32ZBB-NEXT: sltu a4, a2, a0 320; RV32ZBB-NEXT: bnez a4, .LBB11_4 321; RV32ZBB-NEXT: .LBB11_3: 322; RV32ZBB-NEXT: mv a0, a2 323; RV32ZBB-NEXT: mv a1, a3 324; RV32ZBB-NEXT: .LBB11_4: 325; RV32ZBB-NEXT: ret 326; 327; RV64ZBB-LABEL: umax_i64: 328; RV64ZBB: # %bb.0: 329; RV64ZBB-NEXT: maxu a0, a0, a1 330; RV64ZBB-NEXT: ret 331 %c = call i64 @llvm.umax.i64(i64 %a, i64 %b) 332 ret i64 %c 333} 334 335declare i8 @llvm.umin.i8(i8 %a, i8 %b) readnone 336 337define zeroext i8 @umin_i8(i8 zeroext %a, i8 zeroext %b) { 338; NOZBB-LABEL: umin_i8: 339; NOZBB: # %bb.0: 340; NOZBB-NEXT: bltu a0, a1, .LBB12_2 341; NOZBB-NEXT: # %bb.1: 342; NOZBB-NEXT: mv a0, a1 343; NOZBB-NEXT: .LBB12_2: 344; NOZBB-NEXT: ret 345; 346; ZBB-LABEL: umin_i8: 347; ZBB: # %bb.0: 348; ZBB-NEXT: minu a0, a0, a1 349; ZBB-NEXT: ret 350 %c = call i8 @llvm.umin.i8(i8 %a, i8 %b) 351 ret i8 %c 352} 353 354declare i16 @llvm.umin.i16(i16 %a, i16 %b) readnone 355 356define zeroext i16 @umin_i16(i16 zeroext %a, i16 zeroext %b) { 357; NOZBB-LABEL: umin_i16: 358; NOZBB: # %bb.0: 359; NOZBB-NEXT: bltu a0, a1, .LBB13_2 360; NOZBB-NEXT: # %bb.1: 361; NOZBB-NEXT: mv a0, a1 362; NOZBB-NEXT: .LBB13_2: 363; NOZBB-NEXT: ret 364; 365; ZBB-LABEL: umin_i16: 366; ZBB: # %bb.0: 367; ZBB-NEXT: minu a0, a0, a1 368; ZBB-NEXT: ret 369 %c = call i16 @llvm.umin.i16(i16 %a, i16 %b) 370 ret i16 %c 371} 372 373declare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone 374 375define signext i32 @umin_i32(i32 signext %a, i32 signext %b) { 376; NOZBB-LABEL: umin_i32: 377; NOZBB: # %bb.0: 378; NOZBB-NEXT: bltu a0, a1, .LBB14_2 379; NOZBB-NEXT: # %bb.1: 380; NOZBB-NEXT: mv a0, a1 381; NOZBB-NEXT: .LBB14_2: 382; NOZBB-NEXT: ret 383; 384; ZBB-LABEL: umin_i32: 385; ZBB: # %bb.0: 386; ZBB-NEXT: minu a0, a0, a1 387; ZBB-NEXT: ret 388 %c = call i32 @llvm.umin.i32(i32 %a, i32 %b) 389 ret i32 %c 390} 391 392declare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone 393 394define i64 @umin_i64(i64 %a, i64 %b) { 395; RV32I-LABEL: umin_i64: 396; RV32I: # %bb.0: 397; RV32I-NEXT: beq a1, a3, .LBB15_2 398; RV32I-NEXT: # %bb.1: 399; RV32I-NEXT: sltu a4, a1, a3 400; RV32I-NEXT: beqz a4, .LBB15_3 401; RV32I-NEXT: j .LBB15_4 402; RV32I-NEXT: .LBB15_2: 403; RV32I-NEXT: sltu a4, a0, a2 404; RV32I-NEXT: bnez a4, .LBB15_4 405; RV32I-NEXT: .LBB15_3: 406; RV32I-NEXT: mv a0, a2 407; RV32I-NEXT: mv a1, a3 408; RV32I-NEXT: .LBB15_4: 409; RV32I-NEXT: ret 410; 411; RV64I-LABEL: umin_i64: 412; RV64I: # %bb.0: 413; RV64I-NEXT: bltu a0, a1, .LBB15_2 414; RV64I-NEXT: # %bb.1: 415; RV64I-NEXT: mv a0, a1 416; RV64I-NEXT: .LBB15_2: 417; RV64I-NEXT: ret 418; 419; RV32ZBB-LABEL: umin_i64: 420; RV32ZBB: # %bb.0: 421; RV32ZBB-NEXT: beq a1, a3, .LBB15_2 422; RV32ZBB-NEXT: # %bb.1: 423; RV32ZBB-NEXT: sltu a4, a1, a3 424; RV32ZBB-NEXT: beqz a4, .LBB15_3 425; RV32ZBB-NEXT: j .LBB15_4 426; RV32ZBB-NEXT: .LBB15_2: 427; RV32ZBB-NEXT: sltu a4, a0, a2 428; RV32ZBB-NEXT: bnez a4, .LBB15_4 429; RV32ZBB-NEXT: .LBB15_3: 430; RV32ZBB-NEXT: mv a0, a2 431; RV32ZBB-NEXT: mv a1, a3 432; RV32ZBB-NEXT: .LBB15_4: 433; RV32ZBB-NEXT: ret 434; 435; RV64ZBB-LABEL: umin_i64: 436; RV64ZBB: # %bb.0: 437; RV64ZBB-NEXT: minu a0, a0, a1 438; RV64ZBB-NEXT: ret 439 %c = call i64 @llvm.umin.i64(i64 %a, i64 %b) 440 ret i64 %c 441} 442 443; Tests with the same operand used twice. These should fold away. 444 445define signext i32 @smin_same_op_i32(i32 signext %a) { 446; NOZBB-LABEL: smin_same_op_i32: 447; NOZBB: # %bb.0: 448; NOZBB-NEXT: ret 449; 450; ZBB-LABEL: smin_same_op_i32: 451; ZBB: # %bb.0: 452; ZBB-NEXT: ret 453 %c = call i32 @llvm.smin.i32(i32 %a, i32 %a) 454 ret i32 %c 455} 456 457define signext i32 @smax_same_op_i32(i32 signext %a) { 458; NOZBB-LABEL: smax_same_op_i32: 459; NOZBB: # %bb.0: 460; NOZBB-NEXT: ret 461; 462; ZBB-LABEL: smax_same_op_i32: 463; ZBB: # %bb.0: 464; ZBB-NEXT: ret 465 %c = call i32 @llvm.smax.i32(i32 %a, i32 %a) 466 ret i32 %c 467} 468 469define signext i32 @umin_same_op_i32(i32 signext %a) { 470; NOZBB-LABEL: umin_same_op_i32: 471; NOZBB: # %bb.0: 472; NOZBB-NEXT: ret 473; 474; ZBB-LABEL: umin_same_op_i32: 475; ZBB: # %bb.0: 476; ZBB-NEXT: ret 477 %c = call i32 @llvm.umin.i32(i32 %a, i32 %a) 478 ret i32 %c 479} 480 481define signext i32 @umax_same_op_i32(i32 signext %a) { 482; NOZBB-LABEL: umax_same_op_i32: 483; NOZBB: # %bb.0: 484; NOZBB-NEXT: ret 485; 486; ZBB-LABEL: umax_same_op_i32: 487; ZBB: # %bb.0: 488; ZBB-NEXT: ret 489 %c = call i32 @llvm.umax.i32(i32 %a, i32 %a) 490 ret i32 %c 491} 492 493; Tests with undef operands. These should fold to undef for RV32 or 0 for RV64. 494 495define signext i32 @smin_undef_i32() { 496; RV32I-LABEL: smin_undef_i32: 497; RV32I: # %bb.0: 498; RV32I-NEXT: ret 499; 500; RV64I-LABEL: smin_undef_i32: 501; RV64I: # %bb.0: 502; RV64I-NEXT: li a0, 0 503; RV64I-NEXT: ret 504; 505; RV32ZBB-LABEL: smin_undef_i32: 506; RV32ZBB: # %bb.0: 507; RV32ZBB-NEXT: ret 508; 509; RV64ZBB-LABEL: smin_undef_i32: 510; RV64ZBB: # %bb.0: 511; RV64ZBB-NEXT: li a0, 0 512; RV64ZBB-NEXT: ret 513 %c = call i32 @llvm.smin.i32(i32 undef, i32 undef) 514 ret i32 %c 515} 516 517define signext i32 @smax_undef_i32() { 518; RV32I-LABEL: smax_undef_i32: 519; RV32I: # %bb.0: 520; RV32I-NEXT: ret 521; 522; RV64I-LABEL: smax_undef_i32: 523; RV64I: # %bb.0: 524; RV64I-NEXT: li a0, 0 525; RV64I-NEXT: ret 526; 527; RV32ZBB-LABEL: smax_undef_i32: 528; RV32ZBB: # %bb.0: 529; RV32ZBB-NEXT: ret 530; 531; RV64ZBB-LABEL: smax_undef_i32: 532; RV64ZBB: # %bb.0: 533; RV64ZBB-NEXT: li a0, 0 534; RV64ZBB-NEXT: ret 535 %c = call i32 @llvm.smax.i32(i32 undef, i32 undef) 536 ret i32 %c 537} 538 539define signext i32 @umin_undef_i32() { 540; RV32I-LABEL: umin_undef_i32: 541; RV32I: # %bb.0: 542; RV32I-NEXT: ret 543; 544; RV64I-LABEL: umin_undef_i32: 545; RV64I: # %bb.0: 546; RV64I-NEXT: li a0, 0 547; RV64I-NEXT: ret 548; 549; RV32ZBB-LABEL: umin_undef_i32: 550; RV32ZBB: # %bb.0: 551; RV32ZBB-NEXT: ret 552; 553; RV64ZBB-LABEL: umin_undef_i32: 554; RV64ZBB: # %bb.0: 555; RV64ZBB-NEXT: li a0, 0 556; RV64ZBB-NEXT: ret 557 %c = call i32 @llvm.umin.i32(i32 undef, i32 undef) 558 ret i32 %c 559} 560 561define signext i32 @umax_undef_i32() { 562; RV32I-LABEL: umax_undef_i32: 563; RV32I: # %bb.0: 564; RV32I-NEXT: ret 565; 566; RV64I-LABEL: umax_undef_i32: 567; RV64I: # %bb.0: 568; RV64I-NEXT: li a0, 0 569; RV64I-NEXT: ret 570; 571; RV32ZBB-LABEL: umax_undef_i32: 572; RV32ZBB: # %bb.0: 573; RV32ZBB-NEXT: ret 574; 575; RV64ZBB-LABEL: umax_undef_i32: 576; RV64ZBB: # %bb.0: 577; RV64ZBB-NEXT: li a0, 0 578; RV64ZBB-NEXT: ret 579 %c = call i32 @llvm.umax.i32(i32 undef, i32 undef) 580 ret i32 %c 581} 582 583define signext i32 @smax_i32_pos_constant(i32 signext %a) { 584; NOZBB-LABEL: smax_i32_pos_constant: 585; NOZBB: # %bb.0: 586; NOZBB-NEXT: li a1, 10 587; NOZBB-NEXT: blt a1, a0, .LBB24_2 588; NOZBB-NEXT: # %bb.1: 589; NOZBB-NEXT: li a0, 10 590; NOZBB-NEXT: .LBB24_2: 591; NOZBB-NEXT: ret 592; 593; ZBB-LABEL: smax_i32_pos_constant: 594; ZBB: # %bb.0: 595; ZBB-NEXT: li a1, 10 596; ZBB-NEXT: max a0, a0, a1 597; ZBB-NEXT: ret 598 %c = call i32 @llvm.smax.i32(i32 %a, i32 10) 599 ret i32 %c 600} 601 602define signext i32 @smax_i32_pos_constant_trailing_zeros(i32 signext %a) { 603; NOZBB-LABEL: smax_i32_pos_constant_trailing_zeros: 604; NOZBB: # %bb.0: 605; NOZBB-NEXT: andi a0, a0, -8 606; NOZBB-NEXT: li a1, 16 607; NOZBB-NEXT: blt a1, a0, .LBB25_2 608; NOZBB-NEXT: # %bb.1: 609; NOZBB-NEXT: li a0, 16 610; NOZBB-NEXT: .LBB25_2: 611; NOZBB-NEXT: ret 612; 613; ZBB-LABEL: smax_i32_pos_constant_trailing_zeros: 614; ZBB: # %bb.0: 615; ZBB-NEXT: andi a0, a0, -8 616; ZBB-NEXT: li a1, 16 617; ZBB-NEXT: max a0, a0, a1 618; ZBB-NEXT: ret 619 %b = and i32 %a, -8 620 %c = call i32 @llvm.smax.i32(i32 %b, i32 16) 621 %d = and i32 %c, -4 622 ret i32 %d 623} 624 625define signext i32 @smin_i32_negone(i32 signext %a) { 626; NOZBB-LABEL: smin_i32_negone: 627; NOZBB: # %bb.0: 628; NOZBB-NEXT: slti a1, a0, -1 629; NOZBB-NEXT: addi a1, a1, -1 630; NOZBB-NEXT: or a0, a1, a0 631; NOZBB-NEXT: ret 632; 633; ZBB-LABEL: smin_i32_negone: 634; ZBB: # %bb.0: 635; ZBB-NEXT: li a1, -1 636; ZBB-NEXT: min a0, a0, a1 637; ZBB-NEXT: ret 638 %c = call i32 @llvm.smin.i32(i32 %a, i32 -1) 639 ret i32 %c 640} 641 642define i64 @smin_i64_negone(i64 %a) { 643; RV32I-LABEL: smin_i64_negone: 644; RV32I: # %bb.0: 645; RV32I-NEXT: slti a2, a1, 0 646; RV32I-NEXT: addi a2, a2, -1 647; RV32I-NEXT: or a0, a2, a0 648; RV32I-NEXT: slti a2, a1, -1 649; RV32I-NEXT: addi a2, a2, -1 650; RV32I-NEXT: or a1, a2, a1 651; RV32I-NEXT: ret 652; 653; RV64I-LABEL: smin_i64_negone: 654; RV64I: # %bb.0: 655; RV64I-NEXT: slti a1, a0, -1 656; RV64I-NEXT: addi a1, a1, -1 657; RV64I-NEXT: or a0, a1, a0 658; RV64I-NEXT: ret 659; 660; RV32ZBB-LABEL: smin_i64_negone: 661; RV32ZBB: # %bb.0: 662; RV32ZBB-NEXT: li a2, -1 663; RV32ZBB-NEXT: min a2, a1, a2 664; RV32ZBB-NEXT: slti a1, a1, 0 665; RV32ZBB-NEXT: addi a1, a1, -1 666; RV32ZBB-NEXT: or a0, a1, a0 667; RV32ZBB-NEXT: mv a1, a2 668; RV32ZBB-NEXT: ret 669; 670; RV64ZBB-LABEL: smin_i64_negone: 671; RV64ZBB: # %bb.0: 672; RV64ZBB-NEXT: li a1, -1 673; RV64ZBB-NEXT: min a0, a0, a1 674; RV64ZBB-NEXT: ret 675 %c = call i64 @llvm.smin.i64(i64 %a, i64 -1) 676 ret i64 %c 677} 678 679define i64 @umax_i64_one(i64 %a, i64 %b) { 680; RV32I-LABEL: umax_i64_one: 681; RV32I: # %bb.0: 682; RV32I-NEXT: mv a2, a0 683; RV32I-NEXT: beqz a1, .LBB28_3 684; RV32I-NEXT: # %bb.1: 685; RV32I-NEXT: beqz a1, .LBB28_4 686; RV32I-NEXT: .LBB28_2: 687; RV32I-NEXT: ret 688; RV32I-NEXT: .LBB28_3: 689; RV32I-NEXT: li a0, 1 690; RV32I-NEXT: bnez a1, .LBB28_2 691; RV32I-NEXT: .LBB28_4: 692; RV32I-NEXT: seqz a0, a2 693; RV32I-NEXT: add a0, a2, a0 694; RV32I-NEXT: ret 695; 696; RV64I-LABEL: umax_i64_one: 697; RV64I: # %bb.0: 698; RV64I-NEXT: seqz a1, a0 699; RV64I-NEXT: add a0, a0, a1 700; RV64I-NEXT: ret 701; 702; RV32ZBB-LABEL: umax_i64_one: 703; RV32ZBB: # %bb.0: 704; RV32ZBB-NEXT: mv a2, a0 705; RV32ZBB-NEXT: li a3, 1 706; RV32ZBB-NEXT: beqz a1, .LBB28_3 707; RV32ZBB-NEXT: # %bb.1: 708; RV32ZBB-NEXT: beqz a1, .LBB28_4 709; RV32ZBB-NEXT: .LBB28_2: 710; RV32ZBB-NEXT: ret 711; RV32ZBB-NEXT: .LBB28_3: 712; RV32ZBB-NEXT: li a0, 1 713; RV32ZBB-NEXT: bnez a1, .LBB28_2 714; RV32ZBB-NEXT: .LBB28_4: 715; RV32ZBB-NEXT: maxu a0, a2, a3 716; RV32ZBB-NEXT: ret 717; 718; RV64ZBB-LABEL: umax_i64_one: 719; RV64ZBB: # %bb.0: 720; RV64ZBB-NEXT: li a1, 1 721; RV64ZBB-NEXT: maxu a0, a0, a1 722; RV64ZBB-NEXT: ret 723 %c = call i64 @llvm.umax.i64(i64 %a, i64 1) 724 ret i64 %c 725} 726