1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-unknown-unknown -O3 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=DEFAULT 3; RUN: llc -mtriple=x86_64-unknown-unknown -O3 -cgp-icmp-eq2icmp-st -verify-machineinstrs < %s | FileCheck %s --check-prefixes=EQ2ICMP 4 5; Test cases are generated from: 6; long long NAME(PARAM a, PARAM b) { 7; if (LHS > RHS) 8; return b; 9; if (LHS < RHS) 10; return a;\ 11; return a * b; 12; } 13; Please note funtion name is defined as <PARAM>_<LHS>_<RHS>. Take ll_a_op_b__1 14; for example. ll is PARAM, a_op_b (i.e., a << b) is LHS, _1 (i.e., -1) is RHS. 15 16target datalayout = "e-m:e-i64:64-n32:64" 17 18define i64 @ll_a_op_b__2(i64 %a, i64 %b) { 19; DEFAULT-LABEL: ll_a_op_b__2: 20; DEFAULT: # %bb.0: # %entry 21; DEFAULT-NEXT: movq %rsi, %rcx 22; DEFAULT-NEXT: movq %rdi, %rax 23; DEFAULT-NEXT: shlq %cl, %rax 24; DEFAULT-NEXT: cmpq $-2, %rax 25; DEFAULT-NEXT: jle .LBB0_1 26; DEFAULT-NEXT: # %bb.2: # %return 27; DEFAULT-NEXT: movq %rcx, %rax 28; DEFAULT-NEXT: retq 29; DEFAULT-NEXT: .LBB0_1: # %if.end 30; DEFAULT-NEXT: movl $1, %eax 31; DEFAULT-NEXT: cmoveq %rcx, %rax 32; DEFAULT-NEXT: imulq %rdi, %rax 33; DEFAULT-NEXT: retq 34; 35; EQ2ICMP-LABEL: ll_a_op_b__2: 36; EQ2ICMP: # %bb.0: # %entry 37; EQ2ICMP-NEXT: movq %rsi, %rax 38; EQ2ICMP-NEXT: movq %rdi, %rdx 39; EQ2ICMP-NEXT: movl %eax, %ecx 40; EQ2ICMP-NEXT: shlq %cl, %rdx 41; EQ2ICMP-NEXT: cmpq $-2, %rdx 42; EQ2ICMP-NEXT: jg .LBB0_2 43; EQ2ICMP-NEXT: # %bb.1: # %if.end 44; EQ2ICMP-NEXT: movl $1, %ecx 45; EQ2ICMP-NEXT: cmovlq %rcx, %rax 46; EQ2ICMP-NEXT: imulq %rdi, %rax 47; EQ2ICMP-NEXT: .LBB0_2: # %return 48; EQ2ICMP-NEXT: retq 49entry: 50 %shl = shl i64 %a, %b 51 %cmp = icmp sgt i64 %shl, -2 52 br i1 %cmp, label %return, label %if.end 53 54if.end: ; preds = %entry 55 %cmp2 = icmp eq i64 %shl, -2 56 %mul = select i1 %cmp2, i64 %b, i64 1 57 %spec.select = mul nsw i64 %mul, %a 58 ret i64 %spec.select 59 60return: ; preds = %entry 61 ret i64 %b 62} 63 64define i64 @ll_a_op_b__1(i64 %a, i64 %b) { 65; DEFAULT-LABEL: ll_a_op_b__1: 66; DEFAULT: # %bb.0: # %entry 67; DEFAULT-NEXT: movq %rsi, %rcx 68; DEFAULT-NEXT: movq %rdi, %rax 69; DEFAULT-NEXT: shlq %cl, %rax 70; DEFAULT-NEXT: testq %rax, %rax 71; DEFAULT-NEXT: js .LBB1_1 72; DEFAULT-NEXT: # %bb.2: # %return 73; DEFAULT-NEXT: movq %rcx, %rax 74; DEFAULT-NEXT: retq 75; DEFAULT-NEXT: .LBB1_1: # %if.end 76; DEFAULT-NEXT: cmpq $-1, %rax 77; DEFAULT-NEXT: movl $1, %eax 78; DEFAULT-NEXT: cmoveq %rcx, %rax 79; DEFAULT-NEXT: imulq %rdi, %rax 80; DEFAULT-NEXT: retq 81; 82; EQ2ICMP-LABEL: ll_a_op_b__1: 83; EQ2ICMP: # %bb.0: # %entry 84; EQ2ICMP-NEXT: movq %rsi, %rax 85; EQ2ICMP-NEXT: movq %rdi, %rdx 86; EQ2ICMP-NEXT: movl %eax, %ecx 87; EQ2ICMP-NEXT: shlq %cl, %rdx 88; EQ2ICMP-NEXT: testq %rdx, %rdx 89; EQ2ICMP-NEXT: js .LBB1_1 90; EQ2ICMP-NEXT: # %bb.2: # %return 91; EQ2ICMP-NEXT: retq 92; EQ2ICMP-NEXT: .LBB1_1: # %if.end 93; EQ2ICMP-NEXT: cmpq $-1, %rdx 94; EQ2ICMP-NEXT: movl $1, %ecx 95; EQ2ICMP-NEXT: cmovlq %rcx, %rax 96; EQ2ICMP-NEXT: imulq %rdi, %rax 97; EQ2ICMP-NEXT: retq 98entry: 99 %shl = shl i64 %a, %b 100 %cmp = icmp sgt i64 %shl, -1 101 br i1 %cmp, label %return, label %if.end 102 103if.end: ; preds = %entry 104 %cmp2 = icmp eq i64 %shl, -1 105 %mul = select i1 %cmp2, i64 %b, i64 1 106 %spec.select = mul nsw i64 %mul, %a 107 ret i64 %spec.select 108 109return: ; preds = %entry 110 ret i64 %b 111} 112 113define i64 @ll_a_op_b_0(i64 %a, i64 %b) { 114; DEFAULT-LABEL: ll_a_op_b_0: 115; DEFAULT: # %bb.0: # %entry 116; DEFAULT-NEXT: movq %rsi, %rcx 117; DEFAULT-NEXT: movq %rdi, %rax 118; DEFAULT-NEXT: shlq %cl, %rax 119; DEFAULT-NEXT: testq %rax, %rax 120; DEFAULT-NEXT: jle .LBB2_1 121; DEFAULT-NEXT: # %bb.2: # %return 122; DEFAULT-NEXT: movq %rcx, %rax 123; DEFAULT-NEXT: retq 124; DEFAULT-NEXT: .LBB2_1: # %if.end 125; DEFAULT-NEXT: movl $1, %eax 126; DEFAULT-NEXT: cmoveq %rcx, %rax 127; DEFAULT-NEXT: imulq %rdi, %rax 128; DEFAULT-NEXT: retq 129; 130; EQ2ICMP-LABEL: ll_a_op_b_0: 131; EQ2ICMP: # %bb.0: # %entry 132; EQ2ICMP-NEXT: movq %rsi, %rax 133; EQ2ICMP-NEXT: movq %rdi, %rdx 134; EQ2ICMP-NEXT: movl %eax, %ecx 135; EQ2ICMP-NEXT: shlq %cl, %rdx 136; EQ2ICMP-NEXT: testq %rdx, %rdx 137; EQ2ICMP-NEXT: jle .LBB2_1 138; EQ2ICMP-NEXT: # %bb.2: # %return 139; EQ2ICMP-NEXT: retq 140; EQ2ICMP-NEXT: .LBB2_1: # %if.end 141; EQ2ICMP-NEXT: movl $1, %ecx 142; EQ2ICMP-NEXT: cmovsq %rcx, %rax 143; EQ2ICMP-NEXT: imulq %rdi, %rax 144; EQ2ICMP-NEXT: retq 145entry: 146 %shl = shl i64 %a, %b 147 %cmp = icmp sgt i64 %shl, 0 148 br i1 %cmp, label %return, label %if.end 149 150if.end: ; preds = %entry 151 %cmp2 = icmp eq i64 %shl, 0 152 %mul = select i1 %cmp2, i64 %b, i64 1 153 %spec.select = mul nsw i64 %mul, %a 154 ret i64 %spec.select 155 156return: ; preds = %entry 157 ret i64 %b 158} 159 160define i64 @ll_a_op_b_1(i64 %a, i64 %b) { 161; DEFAULT-LABEL: ll_a_op_b_1: 162; DEFAULT: # %bb.0: # %entry 163; DEFAULT-NEXT: movq %rsi, %rcx 164; DEFAULT-NEXT: movq %rdi, %rax 165; DEFAULT-NEXT: shlq %cl, %rax 166; DEFAULT-NEXT: cmpq $1, %rax 167; DEFAULT-NEXT: jle .LBB3_1 168; DEFAULT-NEXT: # %bb.2: # %return 169; DEFAULT-NEXT: movq %rcx, %rax 170; DEFAULT-NEXT: retq 171; DEFAULT-NEXT: .LBB3_1: # %if.end 172; DEFAULT-NEXT: movl $1, %eax 173; DEFAULT-NEXT: cmoveq %rcx, %rax 174; DEFAULT-NEXT: imulq %rdi, %rax 175; DEFAULT-NEXT: retq 176; 177; EQ2ICMP-LABEL: ll_a_op_b_1: 178; EQ2ICMP: # %bb.0: # %entry 179; EQ2ICMP-NEXT: movq %rsi, %rax 180; EQ2ICMP-NEXT: movq %rdi, %rdx 181; EQ2ICMP-NEXT: movl %eax, %ecx 182; EQ2ICMP-NEXT: shlq %cl, %rdx 183; EQ2ICMP-NEXT: cmpq $1, %rdx 184; EQ2ICMP-NEXT: jg .LBB3_2 185; EQ2ICMP-NEXT: # %bb.1: # %if.end 186; EQ2ICMP-NEXT: movl $1, %ecx 187; EQ2ICMP-NEXT: cmovlq %rcx, %rax 188; EQ2ICMP-NEXT: imulq %rdi, %rax 189; EQ2ICMP-NEXT: .LBB3_2: # %return 190; EQ2ICMP-NEXT: retq 191entry: 192 %shl = shl i64 %a, %b 193 %cmp = icmp sgt i64 %shl, 1 194 br i1 %cmp, label %return, label %if.end 195 196if.end: ; preds = %entry 197 %cmp2 = icmp eq i64 %shl, 1 198 %mul = select i1 %cmp2, i64 %b, i64 1 199 %spec.select = mul nsw i64 %mul, %a 200 ret i64 %spec.select 201 202return: ; preds = %entry 203 ret i64 %b 204} 205 206define i64 @ll_a_op_b_2(i64 %a, i64 %b) { 207; DEFAULT-LABEL: ll_a_op_b_2: 208; DEFAULT: # %bb.0: # %entry 209; DEFAULT-NEXT: movq %rsi, %rcx 210; DEFAULT-NEXT: movq %rdi, %rax 211; DEFAULT-NEXT: shlq %cl, %rax 212; DEFAULT-NEXT: cmpq $2, %rax 213; DEFAULT-NEXT: jle .LBB4_1 214; DEFAULT-NEXT: # %bb.2: # %return 215; DEFAULT-NEXT: movq %rcx, %rax 216; DEFAULT-NEXT: retq 217; DEFAULT-NEXT: .LBB4_1: # %if.end 218; DEFAULT-NEXT: movl $1, %eax 219; DEFAULT-NEXT: cmoveq %rcx, %rax 220; DEFAULT-NEXT: imulq %rdi, %rax 221; DEFAULT-NEXT: retq 222; 223; EQ2ICMP-LABEL: ll_a_op_b_2: 224; EQ2ICMP: # %bb.0: # %entry 225; EQ2ICMP-NEXT: movq %rsi, %rax 226; EQ2ICMP-NEXT: movq %rdi, %rdx 227; EQ2ICMP-NEXT: movl %eax, %ecx 228; EQ2ICMP-NEXT: shlq %cl, %rdx 229; EQ2ICMP-NEXT: cmpq $2, %rdx 230; EQ2ICMP-NEXT: jg .LBB4_2 231; EQ2ICMP-NEXT: # %bb.1: # %if.end 232; EQ2ICMP-NEXT: movl $1, %ecx 233; EQ2ICMP-NEXT: cmovlq %rcx, %rax 234; EQ2ICMP-NEXT: imulq %rdi, %rax 235; EQ2ICMP-NEXT: .LBB4_2: # %return 236; EQ2ICMP-NEXT: retq 237entry: 238 %shl = shl i64 %a, %b 239 %cmp = icmp sgt i64 %shl, 2 240 br i1 %cmp, label %return, label %if.end 241 242if.end: ; preds = %entry 243 %cmp2 = icmp eq i64 %shl, 2 244 %mul = select i1 %cmp2, i64 %b, i64 1 245 %spec.select = mul nsw i64 %mul, %a 246 ret i64 %spec.select 247 248return: ; preds = %entry 249 ret i64 %b 250} 251 252define i64 @ll_a__2(i64 %a, i64 %b) { 253; DEFAULT-LABEL: ll_a__2: 254; DEFAULT: # %bb.0: # %entry 255; DEFAULT-NEXT: cmpq $-2, %rdi 256; DEFAULT-NEXT: jle .LBB5_1 257; DEFAULT-NEXT: # %bb.2: # %return 258; DEFAULT-NEXT: movq %rsi, %rax 259; DEFAULT-NEXT: retq 260; DEFAULT-NEXT: .LBB5_1: # %if.end 261; DEFAULT-NEXT: movl $1, %eax 262; DEFAULT-NEXT: cmoveq %rsi, %rax 263; DEFAULT-NEXT: imulq %rdi, %rax 264; DEFAULT-NEXT: retq 265; 266; EQ2ICMP-LABEL: ll_a__2: 267; EQ2ICMP: # %bb.0: # %entry 268; EQ2ICMP-NEXT: movq %rsi, %rax 269; EQ2ICMP-NEXT: cmpq $-2, %rdi 270; EQ2ICMP-NEXT: jg .LBB5_2 271; EQ2ICMP-NEXT: # %bb.1: # %if.end 272; EQ2ICMP-NEXT: movl $1, %ecx 273; EQ2ICMP-NEXT: cmovlq %rcx, %rax 274; EQ2ICMP-NEXT: imulq %rdi, %rax 275; EQ2ICMP-NEXT: .LBB5_2: # %return 276; EQ2ICMP-NEXT: retq 277entry: 278 %cmp = icmp sgt i64 %a, -2 279 br i1 %cmp, label %return, label %if.end 280 281if.end: ; preds = %entry 282 %cmp1 = icmp eq i64 %a, -2 283 %mul = select i1 %cmp1, i64 %b, i64 1 284 %spec.select = mul nsw i64 %mul, %a 285 ret i64 %spec.select 286 287return: ; preds = %entry 288 ret i64 %b 289} 290 291define i64 @ll_a__1(i64 %a, i64 %b) { 292; DEFAULT-LABEL: ll_a__1: 293; DEFAULT: # %bb.0: # %entry 294; DEFAULT-NEXT: testq %rdi, %rdi 295; DEFAULT-NEXT: js .LBB6_1 296; DEFAULT-NEXT: # %bb.2: # %return 297; DEFAULT-NEXT: movq %rsi, %rax 298; DEFAULT-NEXT: retq 299; DEFAULT-NEXT: .LBB6_1: # %if.end 300; DEFAULT-NEXT: cmpq $-1, %rdi 301; DEFAULT-NEXT: movl $1, %eax 302; DEFAULT-NEXT: cmoveq %rsi, %rax 303; DEFAULT-NEXT: imulq %rdi, %rax 304; DEFAULT-NEXT: retq 305; 306; EQ2ICMP-LABEL: ll_a__1: 307; EQ2ICMP: # %bb.0: # %entry 308; EQ2ICMP-NEXT: movq %rsi, %rax 309; EQ2ICMP-NEXT: testq %rdi, %rdi 310; EQ2ICMP-NEXT: js .LBB6_1 311; EQ2ICMP-NEXT: # %bb.2: # %return 312; EQ2ICMP-NEXT: retq 313; EQ2ICMP-NEXT: .LBB6_1: # %if.end 314; EQ2ICMP-NEXT: cmpq $-1, %rdi 315; EQ2ICMP-NEXT: movl $1, %ecx 316; EQ2ICMP-NEXT: cmovlq %rcx, %rax 317; EQ2ICMP-NEXT: imulq %rdi, %rax 318; EQ2ICMP-NEXT: retq 319entry: 320 %cmp = icmp sgt i64 %a, -1 321 br i1 %cmp, label %return, label %if.end 322 323if.end: ; preds = %entry 324 %cmp1 = icmp eq i64 %a, -1 325 %mul = select i1 %cmp1, i64 %b, i64 1 326 %spec.select = mul nsw i64 %mul, %a 327 ret i64 %spec.select 328 329return: ; preds = %entry 330 ret i64 %b 331} 332 333define i64 @ll_a_0(i64 %a, i64 %b) { 334; DEFAULT-LABEL: ll_a_0: 335; DEFAULT: # %bb.0: # %entry 336; DEFAULT-NEXT: testq %rdi, %rdi 337; DEFAULT-NEXT: jle .LBB7_1 338; DEFAULT-NEXT: # %bb.2: # %return 339; DEFAULT-NEXT: movq %rsi, %rax 340; DEFAULT-NEXT: retq 341; DEFAULT-NEXT: .LBB7_1: # %if.end 342; DEFAULT-NEXT: movl $1, %eax 343; DEFAULT-NEXT: cmoveq %rsi, %rax 344; DEFAULT-NEXT: imulq %rdi, %rax 345; DEFAULT-NEXT: retq 346; 347; EQ2ICMP-LABEL: ll_a_0: 348; EQ2ICMP: # %bb.0: # %entry 349; EQ2ICMP-NEXT: movq %rsi, %rax 350; EQ2ICMP-NEXT: testq %rdi, %rdi 351; EQ2ICMP-NEXT: jle .LBB7_1 352; EQ2ICMP-NEXT: # %bb.2: # %return 353; EQ2ICMP-NEXT: retq 354; EQ2ICMP-NEXT: .LBB7_1: # %if.end 355; EQ2ICMP-NEXT: movl $1, %ecx 356; EQ2ICMP-NEXT: cmovsq %rcx, %rax 357; EQ2ICMP-NEXT: imulq %rdi, %rax 358; EQ2ICMP-NEXT: retq 359entry: 360 %cmp = icmp sgt i64 %a, 0 361 br i1 %cmp, label %return, label %if.end 362 363if.end: ; preds = %entry 364 %cmp1 = icmp eq i64 %a, 0 365 %mul = select i1 %cmp1, i64 %b, i64 1 366 %spec.select = mul nsw i64 %mul, %a 367 ret i64 %spec.select 368 369return: ; preds = %entry 370 ret i64 %b 371} 372 373define i64 @ll_a_1(i64 %a, i64 %b) { 374; DEFAULT-LABEL: ll_a_1: 375; DEFAULT: # %bb.0: # %entry 376; DEFAULT-NEXT: cmpq $1, %rdi 377; DEFAULT-NEXT: jle .LBB8_1 378; DEFAULT-NEXT: # %bb.2: # %return 379; DEFAULT-NEXT: movq %rsi, %rax 380; DEFAULT-NEXT: retq 381; DEFAULT-NEXT: .LBB8_1: # %if.end 382; DEFAULT-NEXT: movl $1, %eax 383; DEFAULT-NEXT: cmoveq %rsi, %rax 384; DEFAULT-NEXT: imulq %rdi, %rax 385; DEFAULT-NEXT: retq 386; 387; EQ2ICMP-LABEL: ll_a_1: 388; EQ2ICMP: # %bb.0: # %entry 389; EQ2ICMP-NEXT: movq %rsi, %rax 390; EQ2ICMP-NEXT: cmpq $1, %rdi 391; EQ2ICMP-NEXT: jg .LBB8_2 392; EQ2ICMP-NEXT: # %bb.1: # %if.end 393; EQ2ICMP-NEXT: movl $1, %ecx 394; EQ2ICMP-NEXT: cmovlq %rcx, %rax 395; EQ2ICMP-NEXT: imulq %rdi, %rax 396; EQ2ICMP-NEXT: .LBB8_2: # %return 397; EQ2ICMP-NEXT: retq 398entry: 399 %cmp = icmp sgt i64 %a, 1 400 br i1 %cmp, label %return, label %if.end 401 402if.end: ; preds = %entry 403 %cmp1 = icmp eq i64 %a, 1 404 %mul = select i1 %cmp1, i64 %b, i64 1 405 %spec.select = mul nsw i64 %mul, %a 406 ret i64 %spec.select 407 408return: ; preds = %entry 409 ret i64 %b 410} 411 412define i64 @ll_a_2(i64 %a, i64 %b) { 413; DEFAULT-LABEL: ll_a_2: 414; DEFAULT: # %bb.0: # %entry 415; DEFAULT-NEXT: cmpq $2, %rdi 416; DEFAULT-NEXT: jle .LBB9_1 417; DEFAULT-NEXT: # %bb.2: # %return 418; DEFAULT-NEXT: movq %rsi, %rax 419; DEFAULT-NEXT: retq 420; DEFAULT-NEXT: .LBB9_1: # %if.end 421; DEFAULT-NEXT: movl $1, %eax 422; DEFAULT-NEXT: cmoveq %rsi, %rax 423; DEFAULT-NEXT: imulq %rdi, %rax 424; DEFAULT-NEXT: retq 425; 426; EQ2ICMP-LABEL: ll_a_2: 427; EQ2ICMP: # %bb.0: # %entry 428; EQ2ICMP-NEXT: movq %rsi, %rax 429; EQ2ICMP-NEXT: cmpq $2, %rdi 430; EQ2ICMP-NEXT: jg .LBB9_2 431; EQ2ICMP-NEXT: # %bb.1: # %if.end 432; EQ2ICMP-NEXT: movl $1, %ecx 433; EQ2ICMP-NEXT: cmovlq %rcx, %rax 434; EQ2ICMP-NEXT: imulq %rdi, %rax 435; EQ2ICMP-NEXT: .LBB9_2: # %return 436; EQ2ICMP-NEXT: retq 437entry: 438 %cmp = icmp sgt i64 %a, 2 439 br i1 %cmp, label %return, label %if.end 440 441if.end: ; preds = %entry 442 %cmp1 = icmp eq i64 %a, 2 443 %mul = select i1 %cmp1, i64 %b, i64 1 444 %spec.select = mul nsw i64 %mul, %a 445 ret i64 %spec.select 446 447return: ; preds = %entry 448 ret i64 %b 449} 450 451define i64 @i_a_op_b__2(i32 signext %a, i32 signext %b) { 452; DEFAULT-LABEL: i_a_op_b__2: 453; DEFAULT: # %bb.0: # %entry 454; DEFAULT-NEXT: movl %esi, %ecx 455; DEFAULT-NEXT: movl %edi, %eax 456; DEFAULT-NEXT: shll %cl, %eax 457; DEFAULT-NEXT: cmpl $-2, %eax 458; DEFAULT-NEXT: jg .LBB10_2 459; DEFAULT-NEXT: # %bb.1: # %if.end 460; DEFAULT-NEXT: movl $1, %eax 461; DEFAULT-NEXT: cmovel %ecx, %eax 462; DEFAULT-NEXT: imull %edi, %eax 463; DEFAULT-NEXT: movl %eax, %ecx 464; DEFAULT-NEXT: .LBB10_2: # %return 465; DEFAULT-NEXT: movslq %ecx, %rax 466; DEFAULT-NEXT: retq 467; 468; EQ2ICMP-LABEL: i_a_op_b__2: 469; EQ2ICMP: # %bb.0: # %entry 470; EQ2ICMP-NEXT: movl %esi, %ecx 471; EQ2ICMP-NEXT: movl %edi, %eax 472; EQ2ICMP-NEXT: shll %cl, %eax 473; EQ2ICMP-NEXT: cmpl $-2, %eax 474; EQ2ICMP-NEXT: jg .LBB10_2 475; EQ2ICMP-NEXT: # %bb.1: # %if.end 476; EQ2ICMP-NEXT: movl $1, %eax 477; EQ2ICMP-NEXT: cmovll %eax, %ecx 478; EQ2ICMP-NEXT: imull %edi, %ecx 479; EQ2ICMP-NEXT: .LBB10_2: # %return 480; EQ2ICMP-NEXT: movslq %ecx, %rax 481; EQ2ICMP-NEXT: retq 482entry: 483 %shl = shl i32 %a, %b 484 %cmp = icmp sgt i32 %shl, -2 485 br i1 %cmp, label %return, label %if.end 486 487if.end: ; preds = %entry 488 %cmp2 = icmp eq i32 %shl, -2 489 %mul = select i1 %cmp2, i32 %b, i32 1 490 %spec.select = mul nsw i32 %mul, %a 491 br label %return 492 493return: ; preds = %if.end, %entry 494 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 495 %retval.0 = sext i32 %retval.0.in to i64 496 ret i64 %retval.0 497} 498 499define i64 @i_a_op_b__1(i32 signext %a, i32 signext %b) { 500; DEFAULT-LABEL: i_a_op_b__1: 501; DEFAULT: # %bb.0: # %entry 502; DEFAULT-NEXT: movl %esi, %ecx 503; DEFAULT-NEXT: movl %edi, %eax 504; DEFAULT-NEXT: shll %cl, %eax 505; DEFAULT-NEXT: testl %eax, %eax 506; DEFAULT-NEXT: js .LBB11_1 507; DEFAULT-NEXT: # %bb.2: # %return 508; DEFAULT-NEXT: movslq %ecx, %rax 509; DEFAULT-NEXT: retq 510; DEFAULT-NEXT: .LBB11_1: # %if.end 511; DEFAULT-NEXT: cmpl $-1, %eax 512; DEFAULT-NEXT: movl $1, %eax 513; DEFAULT-NEXT: cmovel %ecx, %eax 514; DEFAULT-NEXT: imull %edi, %eax 515; DEFAULT-NEXT: movl %eax, %ecx 516; DEFAULT-NEXT: movslq %ecx, %rax 517; DEFAULT-NEXT: retq 518; 519; EQ2ICMP-LABEL: i_a_op_b__1: 520; EQ2ICMP: # %bb.0: # %entry 521; EQ2ICMP-NEXT: movl %esi, %ecx 522; EQ2ICMP-NEXT: movl %edi, %eax 523; EQ2ICMP-NEXT: shll %cl, %eax 524; EQ2ICMP-NEXT: testl %eax, %eax 525; EQ2ICMP-NEXT: js .LBB11_1 526; EQ2ICMP-NEXT: # %bb.2: # %return 527; EQ2ICMP-NEXT: movslq %ecx, %rax 528; EQ2ICMP-NEXT: retq 529; EQ2ICMP-NEXT: .LBB11_1: # %if.end 530; EQ2ICMP-NEXT: cmpl $-1, %eax 531; EQ2ICMP-NEXT: movl $1, %eax 532; EQ2ICMP-NEXT: cmovll %eax, %ecx 533; EQ2ICMP-NEXT: imull %edi, %ecx 534; EQ2ICMP-NEXT: movslq %ecx, %rax 535; EQ2ICMP-NEXT: retq 536entry: 537 %shl = shl i32 %a, %b 538 %cmp = icmp sgt i32 %shl, -1 539 br i1 %cmp, label %return, label %if.end 540 541if.end: ; preds = %entry 542 %cmp2 = icmp eq i32 %shl, -1 543 %mul = select i1 %cmp2, i32 %b, i32 1 544 %spec.select = mul nsw i32 %mul, %a 545 br label %return 546 547return: ; preds = %if.end, %entry 548 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 549 %retval.0 = sext i32 %retval.0.in to i64 550 ret i64 %retval.0 551} 552 553define i64 @i_a_op_b_0(i32 signext %a, i32 signext %b) { 554; DEFAULT-LABEL: i_a_op_b_0: 555; DEFAULT: # %bb.0: # %entry 556; DEFAULT-NEXT: movl %esi, %ecx 557; DEFAULT-NEXT: movl %edi, %eax 558; DEFAULT-NEXT: shll %cl, %eax 559; DEFAULT-NEXT: testl %eax, %eax 560; DEFAULT-NEXT: jle .LBB12_1 561; DEFAULT-NEXT: # %bb.2: # %return 562; DEFAULT-NEXT: movslq %ecx, %rax 563; DEFAULT-NEXT: retq 564; DEFAULT-NEXT: .LBB12_1: # %if.end 565; DEFAULT-NEXT: movl $1, %eax 566; DEFAULT-NEXT: cmovel %ecx, %eax 567; DEFAULT-NEXT: imull %edi, %eax 568; DEFAULT-NEXT: movl %eax, %ecx 569; DEFAULT-NEXT: movslq %ecx, %rax 570; DEFAULT-NEXT: retq 571; 572; EQ2ICMP-LABEL: i_a_op_b_0: 573; EQ2ICMP: # %bb.0: # %entry 574; EQ2ICMP-NEXT: movl %esi, %ecx 575; EQ2ICMP-NEXT: movl %edi, %eax 576; EQ2ICMP-NEXT: shll %cl, %eax 577; EQ2ICMP-NEXT: testl %eax, %eax 578; EQ2ICMP-NEXT: jle .LBB12_1 579; EQ2ICMP-NEXT: # %bb.2: # %return 580; EQ2ICMP-NEXT: movslq %ecx, %rax 581; EQ2ICMP-NEXT: retq 582; EQ2ICMP-NEXT: .LBB12_1: # %if.end 583; EQ2ICMP-NEXT: movl $1, %eax 584; EQ2ICMP-NEXT: cmovsl %eax, %ecx 585; EQ2ICMP-NEXT: imull %edi, %ecx 586; EQ2ICMP-NEXT: movslq %ecx, %rax 587; EQ2ICMP-NEXT: retq 588entry: 589 %shl = shl i32 %a, %b 590 %cmp = icmp sgt i32 %shl, 0 591 br i1 %cmp, label %return, label %if.end 592 593if.end: ; preds = %entry 594 %cmp2 = icmp eq i32 %shl, 0 595 %mul = select i1 %cmp2, i32 %b, i32 1 596 %spec.select = mul nsw i32 %mul, %a 597 br label %return 598 599return: ; preds = %if.end, %entry 600 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 601 %retval.0 = sext i32 %retval.0.in to i64 602 ret i64 %retval.0 603} 604 605define i64 @i_a_op_b_1(i32 signext %a, i32 signext %b) { 606; DEFAULT-LABEL: i_a_op_b_1: 607; DEFAULT: # %bb.0: # %entry 608; DEFAULT-NEXT: movl %esi, %ecx 609; DEFAULT-NEXT: movl %edi, %eax 610; DEFAULT-NEXT: shll %cl, %eax 611; DEFAULT-NEXT: cmpl $1, %eax 612; DEFAULT-NEXT: jg .LBB13_2 613; DEFAULT-NEXT: # %bb.1: # %if.end 614; DEFAULT-NEXT: movl $1, %eax 615; DEFAULT-NEXT: cmovel %ecx, %eax 616; DEFAULT-NEXT: imull %edi, %eax 617; DEFAULT-NEXT: movl %eax, %ecx 618; DEFAULT-NEXT: .LBB13_2: # %return 619; DEFAULT-NEXT: movslq %ecx, %rax 620; DEFAULT-NEXT: retq 621; 622; EQ2ICMP-LABEL: i_a_op_b_1: 623; EQ2ICMP: # %bb.0: # %entry 624; EQ2ICMP-NEXT: movl %esi, %ecx 625; EQ2ICMP-NEXT: movl %edi, %eax 626; EQ2ICMP-NEXT: shll %cl, %eax 627; EQ2ICMP-NEXT: cmpl $1, %eax 628; EQ2ICMP-NEXT: jg .LBB13_2 629; EQ2ICMP-NEXT: # %bb.1: # %if.end 630; EQ2ICMP-NEXT: movl $1, %eax 631; EQ2ICMP-NEXT: cmovll %eax, %ecx 632; EQ2ICMP-NEXT: imull %edi, %ecx 633; EQ2ICMP-NEXT: .LBB13_2: # %return 634; EQ2ICMP-NEXT: movslq %ecx, %rax 635; EQ2ICMP-NEXT: retq 636entry: 637 %shl = shl i32 %a, %b 638 %cmp = icmp sgt i32 %shl, 1 639 br i1 %cmp, label %return, label %if.end 640 641if.end: ; preds = %entry 642 %cmp2 = icmp eq i32 %shl, 1 643 %mul = select i1 %cmp2, i32 %b, i32 1 644 %spec.select = mul nsw i32 %mul, %a 645 br label %return 646 647return: ; preds = %if.end, %entry 648 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 649 %retval.0 = sext i32 %retval.0.in to i64 650 ret i64 %retval.0 651} 652 653define i64 @i_a_op_b_2(i32 signext %a, i32 signext %b) { 654; DEFAULT-LABEL: i_a_op_b_2: 655; DEFAULT: # %bb.0: # %entry 656; DEFAULT-NEXT: movl %esi, %ecx 657; DEFAULT-NEXT: movl %edi, %eax 658; DEFAULT-NEXT: shll %cl, %eax 659; DEFAULT-NEXT: cmpl $2, %eax 660; DEFAULT-NEXT: jg .LBB14_2 661; DEFAULT-NEXT: # %bb.1: # %if.end 662; DEFAULT-NEXT: movl $1, %eax 663; DEFAULT-NEXT: cmovel %ecx, %eax 664; DEFAULT-NEXT: imull %edi, %eax 665; DEFAULT-NEXT: movl %eax, %ecx 666; DEFAULT-NEXT: .LBB14_2: # %return 667; DEFAULT-NEXT: movslq %ecx, %rax 668; DEFAULT-NEXT: retq 669; 670; EQ2ICMP-LABEL: i_a_op_b_2: 671; EQ2ICMP: # %bb.0: # %entry 672; EQ2ICMP-NEXT: movl %esi, %ecx 673; EQ2ICMP-NEXT: movl %edi, %eax 674; EQ2ICMP-NEXT: shll %cl, %eax 675; EQ2ICMP-NEXT: cmpl $2, %eax 676; EQ2ICMP-NEXT: jg .LBB14_2 677; EQ2ICMP-NEXT: # %bb.1: # %if.end 678; EQ2ICMP-NEXT: movl $1, %eax 679; EQ2ICMP-NEXT: cmovll %eax, %ecx 680; EQ2ICMP-NEXT: imull %edi, %ecx 681; EQ2ICMP-NEXT: .LBB14_2: # %return 682; EQ2ICMP-NEXT: movslq %ecx, %rax 683; EQ2ICMP-NEXT: retq 684entry: 685 %shl = shl i32 %a, %b 686 %cmp = icmp sgt i32 %shl, 2 687 br i1 %cmp, label %return, label %if.end 688 689if.end: ; preds = %entry 690 %cmp2 = icmp eq i32 %shl, 2 691 %mul = select i1 %cmp2, i32 %b, i32 1 692 %spec.select = mul nsw i32 %mul, %a 693 br label %return 694 695return: ; preds = %if.end, %entry 696 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 697 %retval.0 = sext i32 %retval.0.in to i64 698 ret i64 %retval.0 699} 700 701define i64 @i_a__2(i32 signext %a, i32 signext %b) { 702; DEFAULT-LABEL: i_a__2: 703; DEFAULT: # %bb.0: # %entry 704; DEFAULT-NEXT: cmpl $-2, %edi 705; DEFAULT-NEXT: jg .LBB15_2 706; DEFAULT-NEXT: # %bb.1: # %if.end 707; DEFAULT-NEXT: movl $1, %eax 708; DEFAULT-NEXT: cmovel %esi, %eax 709; DEFAULT-NEXT: imull %edi, %eax 710; DEFAULT-NEXT: movl %eax, %esi 711; DEFAULT-NEXT: .LBB15_2: # %return 712; DEFAULT-NEXT: movslq %esi, %rax 713; DEFAULT-NEXT: retq 714; 715; EQ2ICMP-LABEL: i_a__2: 716; EQ2ICMP: # %bb.0: # %entry 717; EQ2ICMP-NEXT: cmpl $-2, %edi 718; EQ2ICMP-NEXT: jg .LBB15_2 719; EQ2ICMP-NEXT: # %bb.1: # %if.end 720; EQ2ICMP-NEXT: movl $1, %eax 721; EQ2ICMP-NEXT: cmovll %eax, %esi 722; EQ2ICMP-NEXT: imull %edi, %esi 723; EQ2ICMP-NEXT: .LBB15_2: # %return 724; EQ2ICMP-NEXT: movslq %esi, %rax 725; EQ2ICMP-NEXT: retq 726entry: 727 %cmp = icmp sgt i32 %a, -2 728 br i1 %cmp, label %return, label %if.end 729 730if.end: ; preds = %entry 731 %cmp1 = icmp eq i32 %a, -2 732 %mul = select i1 %cmp1, i32 %b, i32 1 733 %spec.select = mul nsw i32 %mul, %a 734 br label %return 735 736return: ; preds = %if.end, %entry 737 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 738 %retval.0 = sext i32 %retval.0.in to i64 739 ret i64 %retval.0 740} 741 742define i64 @i_a__1(i32 signext %a, i32 signext %b) { 743; DEFAULT-LABEL: i_a__1: 744; DEFAULT: # %bb.0: # %entry 745; DEFAULT-NEXT: testl %edi, %edi 746; DEFAULT-NEXT: js .LBB16_1 747; DEFAULT-NEXT: # %bb.2: # %return 748; DEFAULT-NEXT: movslq %esi, %rax 749; DEFAULT-NEXT: retq 750; DEFAULT-NEXT: .LBB16_1: # %if.end 751; DEFAULT-NEXT: cmpl $-1, %edi 752; DEFAULT-NEXT: movl $1, %eax 753; DEFAULT-NEXT: cmovel %esi, %eax 754; DEFAULT-NEXT: imull %edi, %eax 755; DEFAULT-NEXT: movl %eax, %esi 756; DEFAULT-NEXT: movslq %esi, %rax 757; DEFAULT-NEXT: retq 758; 759; EQ2ICMP-LABEL: i_a__1: 760; EQ2ICMP: # %bb.0: # %entry 761; EQ2ICMP-NEXT: testl %edi, %edi 762; EQ2ICMP-NEXT: js .LBB16_1 763; EQ2ICMP-NEXT: # %bb.2: # %return 764; EQ2ICMP-NEXT: movslq %esi, %rax 765; EQ2ICMP-NEXT: retq 766; EQ2ICMP-NEXT: .LBB16_1: # %if.end 767; EQ2ICMP-NEXT: cmpl $-1, %edi 768; EQ2ICMP-NEXT: movl $1, %eax 769; EQ2ICMP-NEXT: cmovll %eax, %esi 770; EQ2ICMP-NEXT: imull %edi, %esi 771; EQ2ICMP-NEXT: movslq %esi, %rax 772; EQ2ICMP-NEXT: retq 773entry: 774 %cmp = icmp sgt i32 %a, -1 775 br i1 %cmp, label %return, label %if.end 776 777if.end: ; preds = %entry 778 %cmp1 = icmp eq i32 %a, -1 779 %mul = select i1 %cmp1, i32 %b, i32 1 780 %spec.select = mul nsw i32 %mul, %a 781 br label %return 782 783return: ; preds = %if.end, %entry 784 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 785 %retval.0 = sext i32 %retval.0.in to i64 786 ret i64 %retval.0 787} 788 789define i64 @i_a_0(i32 signext %a, i32 signext %b) { 790; DEFAULT-LABEL: i_a_0: 791; DEFAULT: # %bb.0: # %entry 792; DEFAULT-NEXT: testl %edi, %edi 793; DEFAULT-NEXT: jle .LBB17_1 794; DEFAULT-NEXT: # %bb.2: # %return 795; DEFAULT-NEXT: movslq %esi, %rax 796; DEFAULT-NEXT: retq 797; DEFAULT-NEXT: .LBB17_1: # %if.end 798; DEFAULT-NEXT: movl $1, %eax 799; DEFAULT-NEXT: cmovel %esi, %eax 800; DEFAULT-NEXT: imull %edi, %eax 801; DEFAULT-NEXT: movl %eax, %esi 802; DEFAULT-NEXT: movslq %esi, %rax 803; DEFAULT-NEXT: retq 804; 805; EQ2ICMP-LABEL: i_a_0: 806; EQ2ICMP: # %bb.0: # %entry 807; EQ2ICMP-NEXT: testl %edi, %edi 808; EQ2ICMP-NEXT: jle .LBB17_1 809; EQ2ICMP-NEXT: # %bb.2: # %return 810; EQ2ICMP-NEXT: movslq %esi, %rax 811; EQ2ICMP-NEXT: retq 812; EQ2ICMP-NEXT: .LBB17_1: # %if.end 813; EQ2ICMP-NEXT: movl $1, %eax 814; EQ2ICMP-NEXT: cmovsl %eax, %esi 815; EQ2ICMP-NEXT: imull %edi, %esi 816; EQ2ICMP-NEXT: movslq %esi, %rax 817; EQ2ICMP-NEXT: retq 818entry: 819 %cmp = icmp sgt i32 %a, 0 820 br i1 %cmp, label %return, label %if.end 821 822if.end: ; preds = %entry 823 %cmp1 = icmp eq i32 %a, 0 824 %mul = select i1 %cmp1, i32 %b, i32 1 825 %spec.select = mul nsw i32 %mul, %a 826 br label %return 827 828return: ; preds = %if.end, %entry 829 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 830 %retval.0 = sext i32 %retval.0.in to i64 831 ret i64 %retval.0 832} 833 834define i64 @i_a_1(i32 signext %a, i32 signext %b) { 835; DEFAULT-LABEL: i_a_1: 836; DEFAULT: # %bb.0: # %entry 837; DEFAULT-NEXT: cmpl $1, %edi 838; DEFAULT-NEXT: jg .LBB18_2 839; DEFAULT-NEXT: # %bb.1: # %if.end 840; DEFAULT-NEXT: movl $1, %eax 841; DEFAULT-NEXT: cmovel %esi, %eax 842; DEFAULT-NEXT: imull %edi, %eax 843; DEFAULT-NEXT: movl %eax, %esi 844; DEFAULT-NEXT: .LBB18_2: # %return 845; DEFAULT-NEXT: movslq %esi, %rax 846; DEFAULT-NEXT: retq 847; 848; EQ2ICMP-LABEL: i_a_1: 849; EQ2ICMP: # %bb.0: # %entry 850; EQ2ICMP-NEXT: cmpl $1, %edi 851; EQ2ICMP-NEXT: jg .LBB18_2 852; EQ2ICMP-NEXT: # %bb.1: # %if.end 853; EQ2ICMP-NEXT: movl $1, %eax 854; EQ2ICMP-NEXT: cmovll %eax, %esi 855; EQ2ICMP-NEXT: imull %edi, %esi 856; EQ2ICMP-NEXT: .LBB18_2: # %return 857; EQ2ICMP-NEXT: movslq %esi, %rax 858; EQ2ICMP-NEXT: retq 859entry: 860 %cmp = icmp sgt i32 %a, 1 861 br i1 %cmp, label %return, label %if.end 862 863if.end: ; preds = %entry 864 %cmp1 = icmp eq i32 %a, 1 865 %mul = select i1 %cmp1, i32 %b, i32 1 866 %spec.select = mul nsw i32 %mul, %a 867 br label %return 868 869return: ; preds = %if.end, %entry 870 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 871 %retval.0 = sext i32 %retval.0.in to i64 872 ret i64 %retval.0 873} 874 875define i64 @i_a_2(i32 signext %a, i32 signext %b) { 876; DEFAULT-LABEL: i_a_2: 877; DEFAULT: # %bb.0: # %entry 878; DEFAULT-NEXT: cmpl $2, %edi 879; DEFAULT-NEXT: jg .LBB19_2 880; DEFAULT-NEXT: # %bb.1: # %if.end 881; DEFAULT-NEXT: movl $1, %eax 882; DEFAULT-NEXT: cmovel %esi, %eax 883; DEFAULT-NEXT: imull %edi, %eax 884; DEFAULT-NEXT: movl %eax, %esi 885; DEFAULT-NEXT: .LBB19_2: # %return 886; DEFAULT-NEXT: movslq %esi, %rax 887; DEFAULT-NEXT: retq 888; 889; EQ2ICMP-LABEL: i_a_2: 890; EQ2ICMP: # %bb.0: # %entry 891; EQ2ICMP-NEXT: cmpl $2, %edi 892; EQ2ICMP-NEXT: jg .LBB19_2 893; EQ2ICMP-NEXT: # %bb.1: # %if.end 894; EQ2ICMP-NEXT: movl $1, %eax 895; EQ2ICMP-NEXT: cmovll %eax, %esi 896; EQ2ICMP-NEXT: imull %edi, %esi 897; EQ2ICMP-NEXT: .LBB19_2: # %return 898; EQ2ICMP-NEXT: movslq %esi, %rax 899; EQ2ICMP-NEXT: retq 900entry: 901 %cmp = icmp sgt i32 %a, 2 902 br i1 %cmp, label %return, label %if.end 903 904if.end: ; preds = %entry 905 %cmp1 = icmp eq i32 %a, 2 906 %mul = select i1 %cmp1, i32 %b, i32 1 907 %spec.select = mul nsw i32 %mul, %a 908 br label %return 909 910return: ; preds = %if.end, %entry 911 %retval.0.in = phi i32 [ %b, %entry ], [ %spec.select, %if.end ] 912 %retval.0 = sext i32 %retval.0.in to i64 913 ret i64 %retval.0 914} 915