brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.9 KiB · ae36f29 Raw
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