571 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-- | FileCheck %s3 4define i64 @select_consts_i64(i64 %offset, i32 %x) {5; CHECK-LABEL: select_consts_i64:6; CHECK: # %bb.0:7; CHECK-NEXT: leaq 42(%rdi), %rax8; CHECK-NEXT: testl %esi, %esi9; CHECK-NEXT: cmovneq %rdi, %rax10; CHECK-NEXT: retq11 %b = icmp eq i32 %x, 012 %s = select i1 %b, i64 42, i64 013 %r = add i64 %s, %offset14 ret i64 %r15}16 17define i64 @select_consts_big_i64(i64 %offset, i32 %x) {18; CHECK-LABEL: select_consts_big_i64:19; CHECK: # %bb.0:20; CHECK-NEXT: movabsq $42000000000, %rax # imm = 0x9C765240021; CHECK-NEXT: addq %rdi, %rax22; CHECK-NEXT: testl %esi, %esi23; CHECK-NEXT: cmovneq %rdi, %rax24; CHECK-NEXT: retq25 %b = icmp eq i32 %x, 026 %s = select i1 %b, i64 42000000000, i64 027 %r = add i64 %s, %offset28 ret i64 %r29}30 31define i32 @select_consts_i32(i32 %offset, i64 %x) {32; CHECK-LABEL: select_consts_i32:33; CHECK: # %bb.0:34; CHECK-NEXT: # kill: def $edi killed $edi def $rdi35; CHECK-NEXT: leal 43(%rdi), %eax36; CHECK-NEXT: cmpq $42, %rsi37; CHECK-NEXT: cmovgel %edi, %eax38; CHECK-NEXT: retq39 %b = icmp sgt i64 %x, 4140 %s = select i1 %b, i32 0, i32 4341 %r = add i32 %offset, %s42 ret i32 %r43}44 45define i16 @select_consts_i16(i16 %offset, i1 %b) {46; CHECK-LABEL: select_consts_i16:47; CHECK: # %bb.0:48; CHECK-NEXT: # kill: def $edi killed $edi def $rdi49; CHECK-NEXT: leal 44(%rdi), %eax50; CHECK-NEXT: testb $1, %sil51; CHECK-NEXT: cmovel %edi, %eax52; CHECK-NEXT: # kill: def $ax killed $ax killed $eax53; CHECK-NEXT: retq54 %s = select i1 %b, i16 44, i16 055 %r = add i16 %s, %offset56 ret i16 %r57}58 59define i8 @select_consts_i8(i8 %offset, i1 %b) {60; CHECK-LABEL: select_consts_i8:61; CHECK: # %bb.0:62; CHECK-NEXT: xorl %ecx, %ecx63; CHECK-NEXT: testb $1, %sil64; CHECK-NEXT: movl $45, %eax65; CHECK-NEXT: cmovnel %ecx, %eax66; CHECK-NEXT: addb %dil, %al67; CHECK-NEXT: # kill: def $al killed $al killed $eax68; CHECK-NEXT: retq69 %s = select i1 %b, i8 0, i8 4570 %r = add i8 %offset, %s71 ret i8 %r72}73 74define i32 @select_consts_use_i32(i32 %offset, i64 %x, ptr %p) {75; CHECK-LABEL: select_consts_use_i32:76; CHECK: # %bb.0:77; CHECK-NEXT: xorl %ecx, %ecx78; CHECK-NEXT: cmpq $42, %rsi79; CHECK-NEXT: movl $43, %eax80; CHECK-NEXT: cmovgel %ecx, %eax81; CHECK-NEXT: movl %eax, (%rdx)82; CHECK-NEXT: addl %edi, %eax83; CHECK-NEXT: retq84 %b = icmp sgt i64 %x, 4185 %s = select i1 %b, i32 0, i32 4386 store i32 %s, ptr %p87 %r = add i32 %offset, %s88 ret i32 %r89}90 91; Special-case LEA hacks are done before we try to push the add into a CMOV.92 93define i32 @select_40_43_i32(i32 %offset, i64 %x) {94; CHECK-LABEL: select_40_43_i32:95; CHECK: # %bb.0:96; CHECK-NEXT: # kill: def $edi killed $edi def $rdi97; CHECK-NEXT: xorl %eax, %eax98; CHECK-NEXT: cmpq $42, %rsi99; CHECK-NEXT: setl %al100; CHECK-NEXT: leal (%rax,%rax,2), %eax101; CHECK-NEXT: leal 40(%rdi,%rax), %eax102; CHECK-NEXT: retq103 %b = icmp sgt i64 %x, 41104 %s = select i1 %b, i32 40, i32 43105 %r = add i32 %offset, %s106 ret i32 %r107}108 109define i32 @select_0_1_i32(i32 %offset, i64 %x) {110; CHECK-LABEL: select_0_1_i32:111; CHECK: # %bb.0:112; CHECK-NEXT: movl %edi, %eax113; CHECK-NEXT: cmpq $42, %rsi114; CHECK-NEXT: adcl $0, %eax115; CHECK-NEXT: retq116 %b = icmp ugt i64 %x, 41117 %s = select i1 %b, i32 0, i32 1118 %r = add i32 %offset, %s119 ret i32 %r120}121 122define i32 @select_1_0_i32(i32 %offset, i64 %x) {123; CHECK-LABEL: select_1_0_i32:124; CHECK: # %bb.0:125; CHECK-NEXT: movl %edi, %eax126; CHECK-NEXT: cmpq $42, %rsi127; CHECK-NEXT: sbbl $-1, %eax128; CHECK-NEXT: retq129 %b = icmp ugt i64 %x, 41130 %s = select i1 %b, i32 1, i32 0131 %r = add i32 %offset, %s132 ret i32 %r133}134 135define i64 @select_max32_2_i64(i64 %offset, i64 %x) {136; CHECK-LABEL: select_max32_2_i64:137; CHECK: # %bb.0:138; CHECK-NEXT: leaq 2(%rdi), %rax139; CHECK-NEXT: leaq 2147483647(%rdi), %rcx140; CHECK-NEXT: cmpq $41, %rsi141; CHECK-NEXT: cmovneq %rcx, %rax142; CHECK-NEXT: retq143 %b = icmp ne i64 %x, 41144 %s = select i1 %b, i64 2147483647, i64 2145 %r = add i64 %offset, %s146 ret i64 %r147}148 149define i64 @select_42_min32_i64(i64 %offset, i1 %b) {150; CHECK-LABEL: select_42_min32_i64:151; CHECK: # %bb.0:152; CHECK-NEXT: testb $1, %sil153; CHECK-NEXT: movl $42, %ecx154; CHECK-NEXT: movl $2147483648, %eax # imm = 0x80000000155; CHECK-NEXT: cmovneq %rcx, %rax156; CHECK-NEXT: addq %rdi, %rax157; CHECK-NEXT: retq158 %s = select i1 %b, i64 42, i64 2147483648159 %r = add i64 %offset, %s160 ret i64 %r161}162 163define i64 @select_big_42_i64(i64 %offset, i64 %x) {164; CHECK-LABEL: select_big_42_i64:165; CHECK: # %bb.0:166; CHECK-NEXT: cmpq $41, %rsi167; CHECK-NEXT: movl $2147483649, %ecx # imm = 0x80000001168; CHECK-NEXT: movl $42, %eax169; CHECK-NEXT: cmovneq %rcx, %rax170; CHECK-NEXT: addq %rdi, %rax171; CHECK-NEXT: retq172 %b = icmp ne i64 %x, 41173 %s = select i1 %b, i64 2147483649, i64 42174 %r = add i64 %s, %offset175 ret i64 %r176}177 178define i64 @select_n42_big_i64(i64 %offset, i64 %x) {179; CHECK-LABEL: select_n42_big_i64:180; CHECK: # %bb.0:181; CHECK-NEXT: cmpq $41, %rsi182; CHECK-NEXT: movq $-42, %rcx183; CHECK-NEXT: movl $2147483649, %eax # imm = 0x80000001184; CHECK-NEXT: cmovneq %rcx, %rax185; CHECK-NEXT: addq %rdi, %rax186; CHECK-NEXT: retq187 %b = icmp ne i64 %x, 41188 %s = select i1 %b, i64 -42, i64 2147483649189 %r = add i64 %s, %offset190 ret i64 %r191}192 193define i64 @select_big_bigger_i64(i64 %offset, i64 %x) {194; CHECK-LABEL: select_big_bigger_i64:195; CHECK: # %bb.0:196; CHECK-NEXT: cmpq $41, %rsi197; CHECK-NEXT: movl $2147483649, %ecx # imm = 0x80000001198; CHECK-NEXT: movabsq $42000000000, %rax # imm = 0x9C7652400199; CHECK-NEXT: cmovneq %rcx, %rax200; CHECK-NEXT: addq %rdi, %rax201; CHECK-NEXT: retq202 %b = icmp ne i64 %x, 41203 %s = select i1 %b, i64 2147483649, i64 42000000000204 %r = add i64 %s, %offset205 ret i64 %r206}207 208define i32 @select_20_43_i32(i32 %offset, i64 %x) {209; CHECK-LABEL: select_20_43_i32:210; CHECK: # %bb.0:211; CHECK-NEXT: # kill: def $edi killed $edi def $rdi212; CHECK-NEXT: leal 43(%rdi), %ecx213; CHECK-NEXT: leal 20(%rdi), %eax214; CHECK-NEXT: cmpq $42, %rsi215; CHECK-NEXT: cmovll %ecx, %eax216; CHECK-NEXT: retq217 %b = icmp sgt i64 %x, 41218 %s = select i1 %b, i32 20, i32 43219 %r = add i32 %offset, %s220 ret i32 %r221}222 223define i16 @select_n2_17_i16(i16 %offset, i1 %b) {224; CHECK-LABEL: select_n2_17_i16:225; CHECK: # %bb.0:226; CHECK-NEXT: # kill: def $edi killed $edi def $rdi227; CHECK-NEXT: leal 17(%rdi), %ecx228; CHECK-NEXT: leal 65534(%rdi), %eax229; CHECK-NEXT: testb $1, %sil230; CHECK-NEXT: cmovel %ecx, %eax231; CHECK-NEXT: # kill: def $ax killed $ax killed $eax232; CHECK-NEXT: retq233 %s = select i1 %b, i16 -2, i16 17234 %r = add i16 %offset, %s235 ret i16 %r236}237 238%class.btAxis = type { %struct.btBroadphaseProxy.base, [3 x i16], [3 x i16], ptr }239%struct.btBroadphaseProxy.base = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float] }>240%struct.btBroadphaseProxy = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float], [4 x i8] }>241 242define ptr @bullet(i1 %b, ptr readnone %ptr, i64 %idx) {243; CHECK-LABEL: bullet:244; CHECK: # %bb.0:245; CHECK-NEXT: leaq (%rdx,%rdx,4), %rax246; CHECK-NEXT: shlq $4, %rax247; CHECK-NEXT: leaq 60(%rsi,%rax), %rcx248; CHECK-NEXT: leaq 66(%rsi,%rax), %rax249; CHECK-NEXT: testb $1, %dil250; CHECK-NEXT: cmovneq %rcx, %rax251; CHECK-NEXT: retq252 %gep2 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 2, i64 0253 %gep1 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 1, i64 0254 %sel = select i1 %b, ptr %gep1, ptr %gep2255 ret ptr %sel256}257 258define ptr @bullet_alt1(i1 %b, ptr readnone %ptr, i64 %idx) {259; CHECK-LABEL: bullet_alt1:260; CHECK: # %bb.0:261; CHECK-NEXT: leaq 60(%rsi), %rax262; CHECK-NEXT: leaq 66(%rsi), %rcx263; CHECK-NEXT: testb $1, %dil264; CHECK-NEXT: cmovneq %rax, %rcx265; CHECK-NEXT: leaq (%rdx,%rdx,4), %rax266; CHECK-NEXT: shlq $4, %rax267; CHECK-NEXT: addq %rcx, %rax268; CHECK-NEXT: retq269 %idx40 = mul i64 %idx, 40270 %gep2 = getelementptr inbounds i16, ptr %ptr, i64 33271 %gep1 = getelementptr inbounds i16, ptr %ptr, i64 30272 %sel = select i1 %b, ptr %gep1, ptr %gep2273 %gep3 = getelementptr inbounds i16, ptr %sel, i64 %idx40274 ret ptr %gep3275}276 277define void @bullet_load_store(i32 %x, i64 %y, ptr %p) {278; CHECK-LABEL: bullet_load_store:279; CHECK: # %bb.0:280; CHECK-NEXT: leaq (%rsi,%rsi,4), %rax281; CHECK-NEXT: shlq $4, %rax282; CHECK-NEXT: leaq 66(%rdx), %rcx283; CHECK-NEXT: addq $60, %rdx284; CHECK-NEXT: testb $1, %dil285; CHECK-NEXT: cmovneq %rcx, %rdx286; CHECK-NEXT: decw (%rdx,%rax)287; CHECK-NEXT: retq288 %and = and i32 %x, 1289 %b = icmp eq i32 %and, 0290 %gep2 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 2, i64 0291 %gep1 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 1, i64 0292 %sel = select i1 %b, ptr %gep1, ptr %gep2293 %ld = load i16, ptr %sel, align 4294 %dec = add i16 %ld, -1295 store i16 %dec, ptr %sel, align 4296 ret void297}298 299define void @complex_lea_alt1(i1 %b, ptr readnone %ptr, i64 %idx) {300; CHECK-LABEL: complex_lea_alt1:301; CHECK: # %bb.0:302; CHECK-NEXT: leaq 60(%rdx), %rax303; CHECK-NEXT: addq $66, %rdx304; CHECK-NEXT: testb $1, %dil305; CHECK-NEXT: cmovneq %rax, %rdx306; CHECK-NEXT: decw (%rdx,%rsi)307; CHECK-NEXT: retq308 %i = ptrtoint ptr %ptr to i64309 %sum = add i64 %idx, %i310 %base = inttoptr i64 %sum to ptr311 %gep2 = getelementptr inbounds i16, ptr %base, i64 33312 %gep1 = getelementptr inbounds i16, ptr %base, i64 30313 %sel = select i1 %b, ptr %gep1, ptr %gep2314 %ld = load i16, ptr %sel, align 4315 %dec = add i16 %ld, -1316 store i16 %dec, ptr %sel, align 4317 ret void318}319 320define void @complex_lea_alt2(i1 %b, ptr readnone %ptr, i64 %idx) {321; CHECK-LABEL: complex_lea_alt2:322; CHECK: # %bb.0:323; CHECK-NEXT: leaq 60(%rsi), %rax324; CHECK-NEXT: addq $66, %rsi325; CHECK-NEXT: testb $1, %dil326; CHECK-NEXT: cmovneq %rax, %rsi327; CHECK-NEXT: decw (%rsi,%rdx)328; CHECK-NEXT: retq329 %i = ptrtoint ptr %ptr to i64330 %sum = add i64 %i, %idx331 %base = inttoptr i64 %sum to ptr332 %gep2 = getelementptr inbounds i16, ptr %base, i64 33333 %gep1 = getelementptr inbounds i16, ptr %base, i64 30334 %sel = select i1 %b, ptr %gep1, ptr %gep2335 %ld = load i16, ptr %sel, align 4336 %dec = add i16 %ld, -1337 store i16 %dec, ptr %sel, align 4338 ret void339}340 341define void @complex_lea_alt3(i1 %b, ptr readnone %ptr, i64 %idx) {342; CHECK-LABEL: complex_lea_alt3:343; CHECK: # %bb.0:344; CHECK-NEXT: leaq 60(%rsi), %rax345; CHECK-NEXT: addq $66, %rsi346; CHECK-NEXT: testb $1, %dil347; CHECK-NEXT: cmovneq %rax, %rsi348; CHECK-NEXT: decw (%rsi,%rdx)349; CHECK-NEXT: retq350 %i = ptrtoint ptr %ptr to i64351 %i66 = add i64 %i, 66352 %i60 = add i64 %i, 60353 %o66 = add i64 %i66, %idx354 %o60 = add i64 %i60, %idx355 %p66 = inttoptr i64 %o66 to ptr356 %p60 = inttoptr i64 %o60 to ptr357 %sel = select i1 %b, ptr %p60, ptr %p66358 %ld = load i16, ptr %sel, align 4359 %dec = add i16 %ld, -1360 store i16 %dec, ptr %sel, align 4361 ret void362}363 364define void @complex_lea_alt4(i1 %b, ptr readnone %ptr, i64 %idx) {365; CHECK-LABEL: complex_lea_alt4:366; CHECK: # %bb.0:367; CHECK-NEXT: leaq 60(%rsi), %rax368; CHECK-NEXT: addq $66, %rsi369; CHECK-NEXT: testb $1, %dil370; CHECK-NEXT: cmovneq %rax, %rsi371; CHECK-NEXT: decw (%rdx,%rsi)372; CHECK-NEXT: retq373 %i = ptrtoint ptr %ptr to i64374 %i66 = add i64 %i, 66375 %i60 = add i64 %i, 60376 %o66 = add i64 %idx, %i66377 %o60 = add i64 %idx, %i60378 %p66 = inttoptr i64 %o66 to ptr379 %p60 = inttoptr i64 %o60 to ptr380 %sel = select i1 %b, ptr %p60, ptr %p66381 %ld = load i16, ptr %sel, align 4382 %dec = add i16 %ld, -1383 store i16 %dec, ptr %sel, align 4384 ret void385}386 387define void @complex_lea_alt5(i1 %b, ptr readnone %ptr, i64 %idx) {388; CHECK-LABEL: complex_lea_alt5:389; CHECK: # %bb.0:390; CHECK-NEXT: leaq 60(%rdx), %rax391; CHECK-NEXT: addq $66, %rdx392; CHECK-NEXT: testb $1, %dil393; CHECK-NEXT: cmovneq %rax, %rdx394; CHECK-NEXT: decw (%rdx,%rsi)395; CHECK-NEXT: retq396 %i = ptrtoint ptr %ptr to i64397 %i66 = add i64 %idx, 66398 %i60 = add i64 %idx, 60399 %o66 = add i64 %i66, %i400 %o60 = add i64 %i60, %i401 %p66 = inttoptr i64 %o66 to ptr402 %p60 = inttoptr i64 %o60 to ptr403 %sel = select i1 %b, ptr %p60, ptr %p66404 %ld = load i16, ptr %sel, align 4405 %dec = add i16 %ld, -1406 store i16 %dec, ptr %sel, align 4407 ret void408}409 410define void @complex_lea_alt6(i1 %b, ptr readnone %ptr, i64 %idx) {411; CHECK-LABEL: complex_lea_alt6:412; CHECK: # %bb.0:413; CHECK-NEXT: leaq 60(%rdx), %rax414; CHECK-NEXT: addq $66, %rdx415; CHECK-NEXT: testb $1, %dil416; CHECK-NEXT: cmovneq %rax, %rdx417; CHECK-NEXT: decw (%rsi,%rdx)418; CHECK-NEXT: retq419 %i = ptrtoint ptr %ptr to i64420 %i66 = add i64 %idx, 66421 %i60 = add i64 %idx, 60422 %o66 = add i64 %i, %i66423 %o60 = add i64 %i, %i60424 %p66 = inttoptr i64 %o66 to ptr425 %p60 = inttoptr i64 %o60 to ptr426 %sel = select i1 %b, ptr %p60, ptr %p66427 %ld = load i16, ptr %sel, align 4428 %dec = add i16 %ld, -1429 store i16 %dec, ptr %sel, align 4430 ret void431}432 433define void @complex_lea_alt7(i1 %b, ptr readnone %ptr, i64 %idx) {434; CHECK-LABEL: complex_lea_alt7:435; CHECK: # %bb.0:436; CHECK-NEXT: leaq 60(%rdx), %rax437; CHECK-NEXT: addq $66, %rdx438; CHECK-NEXT: testb $1, %dil439; CHECK-NEXT: cmovneq %rax, %rdx440; CHECK-NEXT: decw (%rdx,%rsi)441; CHECK-NEXT: retq442 %i = ptrtoint ptr %ptr to i64443 %o = add i64 %idx, %i444 %o66 = add i64 %o, 66445 %o60 = add i64 %o, 60446 %p66 = inttoptr i64 %o66 to ptr447 %p60 = inttoptr i64 %o60 to ptr448 %sel = select i1 %b, ptr %p60, ptr %p66449 %ld = load i16, ptr %sel, align 4450 %dec = add i16 %ld, -1451 store i16 %dec, ptr %sel, align 4452 ret void453}454 455define void @complex_lea_alt8(i1 %b, ptr readnone %ptr, i64 %idx) {456; CHECK-LABEL: complex_lea_alt8:457; CHECK: # %bb.0:458; CHECK-NEXT: leaq 60(%rsi), %rax459; CHECK-NEXT: addq $66, %rsi460; CHECK-NEXT: testb $1, %dil461; CHECK-NEXT: cmovneq %rax, %rsi462; CHECK-NEXT: decw (%rsi,%rdx)463; CHECK-NEXT: retq464 %i = ptrtoint ptr %ptr to i64465 %o = add i64 %i, %idx466 %o66 = add i64 %o, 66467 %o60 = add i64 %o, 60468 %p66 = inttoptr i64 %o66 to ptr469 %p60 = inttoptr i64 %o60 to ptr470 %sel = select i1 %b, ptr %p60, ptr %p66471 %ld = load i16, ptr %sel, align 4472 %dec = add i16 %ld, -1473 store i16 %dec, ptr %sel, align 4474 ret void475}476 477define i32 @loadfold_select_const_arms(ptr %x, i1 %y) {478; CHECK-LABEL: loadfold_select_const_arms:479; CHECK: # %bb.0:480; CHECK-NEXT: testb $1, %sil481; CHECK-NEXT: movl $10, %ecx482; CHECK-NEXT: movl $-10, %eax483; CHECK-NEXT: cmovnel %ecx, %eax484; CHECK-NEXT: addl (%rdi), %eax485; CHECK-NEXT: retq486 %cond = select i1 %y, i32 10, i32 -10487 %t0 = load i32, ptr %x, align 4488 %add = add nsw i32 %t0, %cond489 ret i32 %add490}491 492define void @rmw_add(ptr %x, i1 %y, i32 %z, i32 %w) {493; CHECK-LABEL: rmw_add:494; CHECK: # %bb.0:495; CHECK-NEXT: testb $1, %sil496; CHECK-NEXT: cmovel %ecx, %edx497; CHECK-NEXT: addl %edx, (%rdi)498; CHECK-NEXT: retq499 %cond = select i1 %y, i32 %z, i32 %w500 %t0 = load i32, ptr %x, align 4501 %add = add nsw i32 %t0, %cond502 store i32 %add, ptr %x, align 4503 ret void504}505 506define void @rmw_add_select_const_arm(ptr %x, i1 %y, i32 %z) {507; CHECK-LABEL: rmw_add_select_const_arm:508; CHECK: # %bb.0:509; CHECK-NEXT: testb $1, %sil510; CHECK-NEXT: movl $-10, %eax511; CHECK-NEXT: cmovnel %edx, %eax512; CHECK-NEXT: addl %eax, (%rdi)513; CHECK-NEXT: retq514 %cond = select i1 %y, i32 %z, i32 -10515 %t0 = load i32, ptr %x, align 4516 %add = add nsw i32 %t0, %cond517 store i32 %add, ptr %x, align 4518 ret void519}520 521define void @rmw_select_const_arms(ptr %x, i1 %y) {522; CHECK-LABEL: rmw_select_const_arms:523; CHECK: # %bb.0:524; CHECK-NEXT: testb $1, %sil525; CHECK-NEXT: movl $10, %eax526; CHECK-NEXT: movl $-10, %ecx527; CHECK-NEXT: cmovnel %eax, %ecx528; CHECK-NEXT: addl %ecx, (%rdi)529; CHECK-NEXT: retq530 %cond = select i1 %y, i32 10, i32 -10531 %t0 = load i32, ptr %x, align 4532 %add = add nsw i32 %t0, %cond533 store i32 %add, ptr %x, align 4534 ret void535}536 537define i32 @rmw_select_const_arms_extra_load_use(ptr %x, i1 %y) {538; CHECK-LABEL: rmw_select_const_arms_extra_load_use:539; CHECK: # %bb.0:540; CHECK-NEXT: movl (%rdi), %eax541; CHECK-NEXT: leal -10(%rax), %ecx542; CHECK-NEXT: leal 10(%rax), %edx543; CHECK-NEXT: testb $1, %sil544; CHECK-NEXT: cmovel %ecx, %edx545; CHECK-NEXT: movl %edx, (%rdi)546; CHECK-NEXT: # kill: def $eax killed $eax killed $rax547; CHECK-NEXT: retq548 %cond = select i1 %y, i32 10, i32 -10549 %t0 = load i32, ptr %x, align 4550 %add = add nsw i32 %t0, %cond551 store i32 %add, ptr %x, align 4552 ret i32 %t0553}554 555define i32 @rmw_select_const_arms_extra_add_use(ptr %x, i1 %y) {556; CHECK-LABEL: rmw_select_const_arms_extra_add_use:557; CHECK: # %bb.0:558; CHECK-NEXT: testb $1, %sil559; CHECK-NEXT: movl $10, %ecx560; CHECK-NEXT: movl $-10, %eax561; CHECK-NEXT: cmovnel %ecx, %eax562; CHECK-NEXT: addl (%rdi), %eax563; CHECK-NEXT: movl %eax, (%rdi)564; CHECK-NEXT: retq565 %cond = select i1 %y, i32 10, i32 -10566 %t0 = load i32, ptr %x, align 4567 %add = add nsw i32 %t0, %cond568 store i32 %add, ptr %x, align 4569 ret i32 %add570}571