brintos

brintos / llvm-project-archived public Read only

0
0
Text · 50.6 KiB · 3fe5b70 Raw
1600 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s3 4define i64 @atomic_shl1_xor_64_gpr_val(ptr %v, i64 %c) nounwind {5; CHECK-LABEL: atomic_shl1_xor_64_gpr_val:6; CHECK:       # %bb.0: # %entry7; CHECK-NEXT:    movq %rsi, %rcx8; CHECK-NEXT:    andl $63, %ecx9; CHECK-NEXT:    xorl %eax, %eax10; CHECK-NEXT:    lock btcq %rcx, (%rdi)11; CHECK-NEXT:    setb %al12; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx13; CHECK-NEXT:    shlq %cl, %rax14; CHECK-NEXT:    retq15entry:16  %shl = shl nuw i64 1, %c17  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 818  %and = and i64 %shl, %019  ret i64 %and20}21 22define i64 @atomic_shl2_xor_64_gpr_val(ptr %v, i64 %c) nounwind {23; CHECK-LABEL: atomic_shl2_xor_64_gpr_val:24; CHECK:       # %bb.0: # %entry25; CHECK-NEXT:    movq %rsi, %rcx26; CHECK-NEXT:    movl $2, %edx27; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx28; CHECK-NEXT:    shlq %cl, %rdx29; CHECK-NEXT:    movq (%rdi), %rax30; CHECK-NEXT:    .p2align 431; CHECK-NEXT:  .LBB1_1: # %atomicrmw.start32; CHECK-NEXT:    # =>This Inner Loop Header: Depth=133; CHECK-NEXT:    movq %rax, %rcx34; CHECK-NEXT:    xorq %rdx, %rcx35; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)36; CHECK-NEXT:    jne .LBB1_137; CHECK-NEXT:  # %bb.2: # %atomicrmw.end38; CHECK-NEXT:    andq %rdx, %rax39; CHECK-NEXT:    retq40entry:41  %shl = shl i64 2, %c42  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 843  %and = and i64 %0, %shl44  ret i64 %and45}46 47define i64 @atomic_shl1_neq_xor_64_gpr_val(ptr %v, i64 %c) nounwind {48; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_val:49; CHECK:       # %bb.0: # %entry50; CHECK-NEXT:    movq %rsi, %rcx51; CHECK-NEXT:    movl $1, %edx52; CHECK-NEXT:    shlq %cl, %rdx53; CHECK-NEXT:    movq (%rdi), %rax54; CHECK-NEXT:    .p2align 455; CHECK-NEXT:  .LBB2_1: # %atomicrmw.start56; CHECK-NEXT:    # =>This Inner Loop Header: Depth=157; CHECK-NEXT:    movq %rax, %rsi58; CHECK-NEXT:    xorq %rdx, %rsi59; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)60; CHECK-NEXT:    jne .LBB2_161; CHECK-NEXT:  # %bb.2: # %atomicrmw.end62; CHECK-NEXT:    incb %cl63; CHECK-NEXT:    movl $1, %edx64; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx65; CHECK-NEXT:    shlq %cl, %rdx66; CHECK-NEXT:    andq %rdx, %rax67; CHECK-NEXT:    retq68entry:69  %shl = shl nuw i64 1, %c70  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 871  %add = add i64 %c, 172  %shl1 = shl nuw i64 1, %add73  %and = and i64 %0, %shl174  ret i64 %and75}76 77define i64 @atomic_shl1_small_mask_xor_64_gpr_val(ptr %v, i64 %c) nounwind {78; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_val:79; CHECK:       # %bb.0: # %entry80; CHECK-NEXT:    movq %rsi, %rcx81; CHECK-NEXT:    andl $31, %ecx82; CHECK-NEXT:    xorl %eax, %eax83; CHECK-NEXT:    lock btcq %rcx, (%rdi)84; CHECK-NEXT:    setb %al85; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx86; CHECK-NEXT:    shlq %cl, %rax87; CHECK-NEXT:    retq88entry:89  %rem = and i64 %c, 3190  %shl = shl nuw nsw i64 1, %rem91  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 892  %and = and i64 %0, %shl93  ret i64 %and94}95 96define i64 @atomic_shl1_mask0_xor_64_gpr_val(ptr %v, i64 %c) nounwind {97; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_val:98; CHECK:       # %bb.0: # %entry99; CHECK-NEXT:    movq %rsi, %rcx100; CHECK-NEXT:    andl $63, %ecx101; CHECK-NEXT:    xorl %eax, %eax102; CHECK-NEXT:    lock btcq %rcx, (%rdi)103; CHECK-NEXT:    setb %al104; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx105; CHECK-NEXT:    shlq %cl, %rax106; CHECK-NEXT:    retq107entry:108  %rem = and i64 %c, 63109  %shl = shl nuw i64 1, %rem110  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8111  %shl1 = shl nuw i64 1, %c112  %and = and i64 %shl1, %0113  ret i64 %and114}115 116define i64 @atomic_shl1_mask1_xor_64_gpr_val(ptr %v, i64 %c) nounwind {117; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_val:118; CHECK:       # %bb.0: # %entry119; CHECK-NEXT:    movq %rsi, %rcx120; CHECK-NEXT:    andl $63, %ecx121; CHECK-NEXT:    xorl %eax, %eax122; CHECK-NEXT:    lock btcq %rcx, (%rdi)123; CHECK-NEXT:    setb %al124; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx125; CHECK-NEXT:    shlq %cl, %rax126; CHECK-NEXT:    retq127entry:128  %shl = shl nuw i64 1, %c129  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8130  %rem = and i64 %c, 63131  %shl1 = shl nuw i64 1, %rem132  %and = and i64 %0, %shl1133  ret i64 %and134}135 136define i64 @atomic_shl1_mask01_xor_64_gpr_val(ptr %v, i64 %c) nounwind {137; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_val:138; CHECK:       # %bb.0: # %entry139; CHECK-NEXT:    movq %rsi, %rcx140; CHECK-NEXT:    andl $63, %ecx141; CHECK-NEXT:    xorl %eax, %eax142; CHECK-NEXT:    lock btcq %rcx, (%rdi)143; CHECK-NEXT:    setb %al144; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx145; CHECK-NEXT:    shlq %cl, %rax146; CHECK-NEXT:    retq147entry:148  %rem = and i64 %c, 63149  %shl = shl nuw i64 1, %rem150  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8151  %and = and i64 %0, %shl152  ret i64 %and153}154 155define i64 @atomic_blsi_xor_64_gpr_val(ptr %v, i64 %c) nounwind {156; CHECK-LABEL: atomic_blsi_xor_64_gpr_val:157; CHECK:       # %bb.0: # %entry158; CHECK-NEXT:    movq %rsi, %rcx159; CHECK-NEXT:    negq %rcx160; CHECK-NEXT:    andq %rsi, %rcx161; CHECK-NEXT:    movq (%rdi), %rax162; CHECK-NEXT:    .p2align 4163; CHECK-NEXT:  .LBB7_1: # %atomicrmw.start164; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1165; CHECK-NEXT:    movq %rax, %rdx166; CHECK-NEXT:    xorq %rcx, %rdx167; CHECK-NEXT:    lock cmpxchgq %rdx, (%rdi)168; CHECK-NEXT:    jne .LBB7_1169; CHECK-NEXT:  # %bb.2: # %atomicrmw.end170; CHECK-NEXT:    andq %rcx, %rax171; CHECK-NEXT:    retq172entry:173  %sub = sub i64 0, %c174  %and = and i64 %sub, %c175  %0 = atomicrmw xor ptr %v, i64 %and monotonic, align 8176  %and3 = and i64 %0, %and177  ret i64 %and3178}179 180define i64 @atomic_shl1_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {181; CHECK-LABEL: atomic_shl1_xor_64_gpr_valz:182; CHECK:       # %bb.0: # %entry183; CHECK-NEXT:    movq %rsi, %rcx184; CHECK-NEXT:    movl $1, %edx185; CHECK-NEXT:    shlq %cl, %rdx186; CHECK-NEXT:    movq (%rdi), %rax187; CHECK-NEXT:    .p2align 4188; CHECK-NEXT:  .LBB8_1: # %atomicrmw.start189; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1190; CHECK-NEXT:    movq %rax, %rsi191; CHECK-NEXT:    xorq %rdx, %rsi192; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)193; CHECK-NEXT:    jne .LBB8_1194; CHECK-NEXT:  # %bb.2: # %atomicrmw.end195; CHECK-NEXT:    xorl %edx, %edx196; CHECK-NEXT:    btq %rcx, %rax197; CHECK-NEXT:    setae %dl198; CHECK-NEXT:    movq %rdx, %rax199; CHECK-NEXT:    retq200entry:201  %shl = shl nuw i64 1, %c202  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8203  %1 = sub i64 -1, %0204  %2 = lshr i64 %1, %c205  %conv = and i64 %2, 1206  ret i64 %conv207}208 209define i64 @atomic_shl2_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {210; CHECK-LABEL: atomic_shl2_xor_64_gpr_valz:211; CHECK:       # %bb.0: # %entry212; CHECK-NEXT:    movq %rsi, %rcx213; CHECK-NEXT:    movl $2, %edx214; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx215; CHECK-NEXT:    shlq %cl, %rdx216; CHECK-NEXT:    movq (%rdi), %rax217; CHECK-NEXT:    .p2align 4218; CHECK-NEXT:  .LBB9_1: # %atomicrmw.start219; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1220; CHECK-NEXT:    movq %rax, %rcx221; CHECK-NEXT:    xorq %rdx, %rcx222; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)223; CHECK-NEXT:    jne .LBB9_1224; CHECK-NEXT:  # %bb.2: # %atomicrmw.end225; CHECK-NEXT:    xorl %ecx, %ecx226; CHECK-NEXT:    testq %rax, %rdx227; CHECK-NEXT:    sete %cl228; CHECK-NEXT:    movq %rcx, %rax229; CHECK-NEXT:    retq230entry:231  %shl = shl i64 2, %c232  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8233  %and = and i64 %shl, %0234  %tobool.not = icmp eq i64 %and, 0235  %conv = zext i1 %tobool.not to i64236  ret i64 %conv237}238 239define i64 @atomic_shl1_neq_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {240; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_valz:241; CHECK:       # %bb.0: # %entry242; CHECK-NEXT:    movq %rsi, %rcx243; CHECK-NEXT:    movl $1, %edx244; CHECK-NEXT:    shlq %cl, %rdx245; CHECK-NEXT:    movq (%rdi), %rax246; CHECK-NEXT:    .p2align 4247; CHECK-NEXT:  .LBB10_1: # %atomicrmw.start248; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1249; CHECK-NEXT:    movq %rax, %rsi250; CHECK-NEXT:    xorq %rdx, %rsi251; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)252; CHECK-NEXT:    jne .LBB10_1253; CHECK-NEXT:  # %bb.2: # %atomicrmw.end254; CHECK-NEXT:    incb %cl255; CHECK-NEXT:    movzbl %cl, %edx256; CHECK-NEXT:    xorl %ecx, %ecx257; CHECK-NEXT:    btq %rdx, %rax258; CHECK-NEXT:    setae %cl259; CHECK-NEXT:    movq %rcx, %rax260; CHECK-NEXT:    retq261entry:262  %shl = shl nuw i64 1, %c263  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8264  %add = add i64 %c, 1265  %1 = xor i64 %0, -1266  %2 = lshr i64 %1, %add267  %conv = and i64 %2, 1268  ret i64 %conv269}270 271define i64 @atomic_shl1_small_mask_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {272; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_valz:273; CHECK:       # %bb.0: # %entry274; CHECK-NEXT:    movq %rsi, %rcx275; CHECK-NEXT:    andl $31, %ecx276; CHECK-NEXT:    movl $1, %edx277; CHECK-NEXT:    shlq %cl, %rdx278; CHECK-NEXT:    movq (%rdi), %rax279; CHECK-NEXT:    .p2align 4280; CHECK-NEXT:  .LBB11_1: # %atomicrmw.start281; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1282; CHECK-NEXT:    movq %rax, %rsi283; CHECK-NEXT:    xorq %rdx, %rsi284; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)285; CHECK-NEXT:    jne .LBB11_1286; CHECK-NEXT:  # %bb.2: # %atomicrmw.end287; CHECK-NEXT:    xorl %edx, %edx288; CHECK-NEXT:    btl %ecx, %eax289; CHECK-NEXT:    setae %dl290; CHECK-NEXT:    movq %rdx, %rax291; CHECK-NEXT:    retq292entry:293  %rem = and i64 %c, 31294  %shl = shl nuw nsw i64 1, %rem295  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8296  %1 = xor i64 %0, -1297  %2 = lshr i64 %1, %rem298  %conv = and i64 %2, 1299  ret i64 %conv300}301 302define i64 @atomic_shl1_mask0_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {303; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_valz:304; CHECK:       # %bb.0: # %entry305; CHECK-NEXT:    movq %rsi, %rcx306; CHECK-NEXT:    movl $1, %edx307; CHECK-NEXT:    shlq %cl, %rdx308; CHECK-NEXT:    movq (%rdi), %rax309; CHECK-NEXT:    .p2align 4310; CHECK-NEXT:  .LBB12_1: # %atomicrmw.start311; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1312; CHECK-NEXT:    movq %rax, %rsi313; CHECK-NEXT:    xorq %rdx, %rsi314; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)315; CHECK-NEXT:    jne .LBB12_1316; CHECK-NEXT:  # %bb.2: # %atomicrmw.end317; CHECK-NEXT:    xorl %edx, %edx318; CHECK-NEXT:    btq %rcx, %rax319; CHECK-NEXT:    setae %dl320; CHECK-NEXT:    movq %rdx, %rax321; CHECK-NEXT:    retq322entry:323  %rem = and i64 %c, 63324  %shl = shl nuw i64 1, %rem325  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8326  %1 = xor i64 %0, -1327  %2 = lshr i64 %1, %c328  %conv = and i64 %2, 1329  ret i64 %conv330}331 332define i64 @atomic_shl1_mask1_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {333; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_valz:334; CHECK:       # %bb.0: # %entry335; CHECK-NEXT:    movq %rsi, %rcx336; CHECK-NEXT:    movl $1, %edx337; CHECK-NEXT:    shlq %cl, %rdx338; CHECK-NEXT:    movq (%rdi), %rax339; CHECK-NEXT:    .p2align 4340; CHECK-NEXT:  .LBB13_1: # %atomicrmw.start341; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1342; CHECK-NEXT:    movq %rax, %rsi343; CHECK-NEXT:    xorq %rdx, %rsi344; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)345; CHECK-NEXT:    jne .LBB13_1346; CHECK-NEXT:  # %bb.2: # %atomicrmw.end347; CHECK-NEXT:    xorl %edx, %edx348; CHECK-NEXT:    btq %rcx, %rax349; CHECK-NEXT:    setae %dl350; CHECK-NEXT:    movq %rdx, %rax351; CHECK-NEXT:    retq352entry:353  %shl = shl nuw i64 1, %c354  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8355  %rem = and i64 %c, 63356  %1 = xor i64 %0, -1357  %2 = lshr i64 %1, %rem358  %conv = and i64 %2, 1359  ret i64 %conv360}361 362define i64 @atomic_shl1_mask01_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {363; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_valz:364; CHECK:       # %bb.0: # %entry365; CHECK-NEXT:    movq %rsi, %rcx366; CHECK-NEXT:    andl $63, %ecx367; CHECK-NEXT:    movl $1, %edx368; CHECK-NEXT:    shlq %cl, %rdx369; CHECK-NEXT:    movq (%rdi), %rax370; CHECK-NEXT:    .p2align 4371; CHECK-NEXT:  .LBB14_1: # %atomicrmw.start372; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1373; CHECK-NEXT:    movq %rax, %rsi374; CHECK-NEXT:    xorq %rdx, %rsi375; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)376; CHECK-NEXT:    jne .LBB14_1377; CHECK-NEXT:  # %bb.2: # %atomicrmw.end378; CHECK-NEXT:    xorl %edx, %edx379; CHECK-NEXT:    btq %rcx, %rax380; CHECK-NEXT:    setae %dl381; CHECK-NEXT:    movq %rdx, %rax382; CHECK-NEXT:    retq383entry:384  %rem = and i64 %c, 63385  %shl = shl nuw i64 1, %rem386  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8387  %1 = xor i64 %0, -1388  %2 = lshr i64 %1, %rem389  %conv = and i64 %2, 1390  ret i64 %conv391}392 393define i64 @atomic_blsi_xor_64_gpr_valz(ptr %v, i64 %c) nounwind {394; CHECK-LABEL: atomic_blsi_xor_64_gpr_valz:395; CHECK:       # %bb.0: # %entry396; CHECK-NEXT:    movq %rsi, %rdx397; CHECK-NEXT:    negq %rdx398; CHECK-NEXT:    andq %rsi, %rdx399; CHECK-NEXT:    movq (%rdi), %rax400; CHECK-NEXT:    .p2align 4401; CHECK-NEXT:  .LBB15_1: # %atomicrmw.start402; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1403; CHECK-NEXT:    movq %rax, %rcx404; CHECK-NEXT:    xorq %rdx, %rcx405; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)406; CHECK-NEXT:    jne .LBB15_1407; CHECK-NEXT:  # %bb.2: # %atomicrmw.end408; CHECK-NEXT:    xorl %ecx, %ecx409; CHECK-NEXT:    testq %rdx, %rax410; CHECK-NEXT:    sete %cl411; CHECK-NEXT:    movq %rcx, %rax412; CHECK-NEXT:    retq413entry:414  %sub = sub i64 0, %c415  %and = and i64 %sub, %c416  %0 = atomicrmw xor ptr %v, i64 %and monotonic, align 8417  %and3 = and i64 %0, %and418  %tobool.not = icmp eq i64 %and3, 0419  %conv = zext i1 %tobool.not to i64420  ret i64 %conv421}422 423define i64 @atomic_shl1_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {424; CHECK-LABEL: atomic_shl1_xor_64_gpr_valnz:425; CHECK:       # %bb.0: # %entry426; CHECK-NEXT:    movq %rsi, %rcx427; CHECK-NEXT:    movl $1, %edx428; CHECK-NEXT:    shlq %cl, %rdx429; CHECK-NEXT:    movq (%rdi), %rax430; CHECK-NEXT:    .p2align 4431; CHECK-NEXT:  .LBB16_1: # %atomicrmw.start432; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1433; CHECK-NEXT:    movq %rax, %rsi434; CHECK-NEXT:    xorq %rdx, %rsi435; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)436; CHECK-NEXT:    jne .LBB16_1437; CHECK-NEXT:  # %bb.2: # %atomicrmw.end438; CHECK-NEXT:    xorl %edx, %edx439; CHECK-NEXT:    btq %rcx, %rax440; CHECK-NEXT:    setb %dl441; CHECK-NEXT:    movq %rdx, %rax442; CHECK-NEXT:    retq443entry:444  %shl = shl nuw i64 1, %c445  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8446  %1 = lshr i64 %0, %c447  %conv = and i64 %1, 1448  ret i64 %conv449}450 451define i64 @atomic_shl2_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {452; CHECK-LABEL: atomic_shl2_xor_64_gpr_valnz:453; CHECK:       # %bb.0: # %entry454; CHECK-NEXT:    movq %rsi, %rcx455; CHECK-NEXT:    movl $2, %edx456; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx457; CHECK-NEXT:    shlq %cl, %rdx458; CHECK-NEXT:    movq (%rdi), %rax459; CHECK-NEXT:    .p2align 4460; CHECK-NEXT:  .LBB17_1: # %atomicrmw.start461; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1462; CHECK-NEXT:    movq %rax, %rcx463; CHECK-NEXT:    xorq %rdx, %rcx464; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)465; CHECK-NEXT:    jne .LBB17_1466; CHECK-NEXT:  # %bb.2: # %atomicrmw.end467; CHECK-NEXT:    xorl %ecx, %ecx468; CHECK-NEXT:    testq %rdx, %rax469; CHECK-NEXT:    setne %cl470; CHECK-NEXT:    movq %rcx, %rax471; CHECK-NEXT:    retq472entry:473  %shl = shl i64 2, %c474  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8475  %and = and i64 %0, %shl476  %tobool = icmp ne i64 %and, 0477  %conv = zext i1 %tobool to i64478  ret i64 %conv479}480 481define i64 @atomic_shl1_neq_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {482; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_valnz:483; CHECK:       # %bb.0: # %entry484; CHECK-NEXT:    movq %rsi, %rcx485; CHECK-NEXT:    movl $1, %edx486; CHECK-NEXT:    shlq %cl, %rdx487; CHECK-NEXT:    movq (%rdi), %rax488; CHECK-NEXT:    .p2align 4489; CHECK-NEXT:  .LBB18_1: # %atomicrmw.start490; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1491; CHECK-NEXT:    movq %rax, %rsi492; CHECK-NEXT:    xorq %rdx, %rsi493; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)494; CHECK-NEXT:    jne .LBB18_1495; CHECK-NEXT:  # %bb.2: # %atomicrmw.end496; CHECK-NEXT:    incb %cl497; CHECK-NEXT:    movzbl %cl, %edx498; CHECK-NEXT:    xorl %ecx, %ecx499; CHECK-NEXT:    btq %rdx, %rax500; CHECK-NEXT:    setb %cl501; CHECK-NEXT:    movq %rcx, %rax502; CHECK-NEXT:    retq503entry:504  %shl = shl nuw i64 1, %c505  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8506  %add = add i64 %c, 1507  %1 = lshr i64 %0, %add508  %conv = and i64 %1, 1509  ret i64 %conv510}511 512define i64 @atomic_shl1_small_mask_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {513; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_valnz:514; CHECK:       # %bb.0: # %entry515; CHECK-NEXT:    movq %rsi, %rcx516; CHECK-NEXT:    andl $31, %ecx517; CHECK-NEXT:    movl $1, %edx518; CHECK-NEXT:    shlq %cl, %rdx519; CHECK-NEXT:    movq (%rdi), %rax520; CHECK-NEXT:    .p2align 4521; CHECK-NEXT:  .LBB19_1: # %atomicrmw.start522; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1523; CHECK-NEXT:    movq %rax, %rsi524; CHECK-NEXT:    xorq %rdx, %rsi525; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)526; CHECK-NEXT:    jne .LBB19_1527; CHECK-NEXT:  # %bb.2: # %atomicrmw.end528; CHECK-NEXT:    xorl %edx, %edx529; CHECK-NEXT:    btl %ecx, %eax530; CHECK-NEXT:    setb %dl531; CHECK-NEXT:    movq %rdx, %rax532; CHECK-NEXT:    retq533entry:534  %rem = and i64 %c, 31535  %shl = shl nuw nsw i64 1, %rem536  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8537  %1 = lshr i64 %0, %rem538  %conv = and i64 %1, 1539  ret i64 %conv540}541 542define i64 @atomic_shl1_mask0_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {543; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_valnz:544; CHECK:       # %bb.0: # %entry545; CHECK-NEXT:    movq %rsi, %rcx546; CHECK-NEXT:    movl $1, %edx547; CHECK-NEXT:    shlq %cl, %rdx548; CHECK-NEXT:    movq (%rdi), %rax549; CHECK-NEXT:    .p2align 4550; CHECK-NEXT:  .LBB20_1: # %atomicrmw.start551; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1552; CHECK-NEXT:    movq %rax, %rsi553; CHECK-NEXT:    xorq %rdx, %rsi554; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)555; CHECK-NEXT:    jne .LBB20_1556; CHECK-NEXT:  # %bb.2: # %atomicrmw.end557; CHECK-NEXT:    xorl %edx, %edx558; CHECK-NEXT:    btq %rcx, %rax559; CHECK-NEXT:    setb %dl560; CHECK-NEXT:    movq %rdx, %rax561; CHECK-NEXT:    retq562entry:563  %rem = and i64 %c, 63564  %shl = shl nuw i64 1, %rem565  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8566  %1 = lshr i64 %0, %c567  %conv = and i64 %1, 1568  ret i64 %conv569}570 571define i64 @atomic_shl1_mask1_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {572; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_valnz:573; CHECK:       # %bb.0: # %entry574; CHECK-NEXT:    movq %rsi, %rcx575; CHECK-NEXT:    movl $1, %edx576; CHECK-NEXT:    shlq %cl, %rdx577; CHECK-NEXT:    movq (%rdi), %rax578; CHECK-NEXT:    .p2align 4579; CHECK-NEXT:  .LBB21_1: # %atomicrmw.start580; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1581; CHECK-NEXT:    movq %rax, %rsi582; CHECK-NEXT:    xorq %rdx, %rsi583; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)584; CHECK-NEXT:    jne .LBB21_1585; CHECK-NEXT:  # %bb.2: # %atomicrmw.end586; CHECK-NEXT:    xorl %edx, %edx587; CHECK-NEXT:    btq %rcx, %rax588; CHECK-NEXT:    setb %dl589; CHECK-NEXT:    movq %rdx, %rax590; CHECK-NEXT:    retq591entry:592  %shl = shl nuw i64 1, %c593  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8594  %rem = and i64 %c, 63595  %1 = lshr i64 %0, %rem596  %conv = and i64 %1, 1597  ret i64 %conv598}599 600define i64 @atomic_shl1_mask01_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {601; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_valnz:602; CHECK:       # %bb.0: # %entry603; CHECK-NEXT:    movq %rsi, %rcx604; CHECK-NEXT:    andl $63, %ecx605; CHECK-NEXT:    movl $1, %edx606; CHECK-NEXT:    shlq %cl, %rdx607; CHECK-NEXT:    movq (%rdi), %rax608; CHECK-NEXT:    .p2align 4609; CHECK-NEXT:  .LBB22_1: # %atomicrmw.start610; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1611; CHECK-NEXT:    movq %rax, %rsi612; CHECK-NEXT:    xorq %rdx, %rsi613; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)614; CHECK-NEXT:    jne .LBB22_1615; CHECK-NEXT:  # %bb.2: # %atomicrmw.end616; CHECK-NEXT:    xorl %edx, %edx617; CHECK-NEXT:    btq %rcx, %rax618; CHECK-NEXT:    setb %dl619; CHECK-NEXT:    movq %rdx, %rax620; CHECK-NEXT:    retq621entry:622  %rem = and i64 %c, 63623  %shl = shl nuw i64 1, %rem624  %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8625  %1 = lshr i64 %0, %rem626  %conv = and i64 %1, 1627  ret i64 %conv628}629 630define i64 @atomic_blsi_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind {631; CHECK-LABEL: atomic_blsi_xor_64_gpr_valnz:632; CHECK:       # %bb.0: # %entry633; CHECK-NEXT:    movq %rsi, %rdx634; CHECK-NEXT:    negq %rdx635; CHECK-NEXT:    andq %rsi, %rdx636; CHECK-NEXT:    movq (%rdi), %rax637; CHECK-NEXT:    .p2align 4638; CHECK-NEXT:  .LBB23_1: # %atomicrmw.start639; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1640; CHECK-NEXT:    movq %rax, %rcx641; CHECK-NEXT:    xorq %rdx, %rcx642; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)643; CHECK-NEXT:    jne .LBB23_1644; CHECK-NEXT:  # %bb.2: # %atomicrmw.end645; CHECK-NEXT:    xorl %ecx, %ecx646; CHECK-NEXT:    testq %rdx, %rax647; CHECK-NEXT:    setne %cl648; CHECK-NEXT:    movq %rcx, %rax649; CHECK-NEXT:    retq650entry:651  %sub = sub i64 0, %c652  %and = and i64 %sub, %c653  %0 = atomicrmw xor ptr %v, i64 %and monotonic, align 8654  %and3 = and i64 %0, %and655  %tobool = icmp ne i64 %and3, 0656  %conv = zext i1 %tobool to i64657  ret i64 %conv658}659 660define i64 @atomic_shl1_and_64_gpr_val(ptr %v, i64 %c) nounwind {661; CHECK-LABEL: atomic_shl1_and_64_gpr_val:662; CHECK:       # %bb.0: # %entry663; CHECK-NEXT:    movq %rsi, %rcx664; CHECK-NEXT:    andl $63, %ecx665; CHECK-NEXT:    xorl %eax, %eax666; CHECK-NEXT:    lock btrq %rcx, (%rdi)667; CHECK-NEXT:    setb %al668; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx669; CHECK-NEXT:    shlq %cl, %rax670; CHECK-NEXT:    retq671entry:672  %shl = shl nuw i64 1, %c673  %not = sub i64 -1, %shl674  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8675  %and = and i64 %0, %shl676  ret i64 %and677}678 679define i64 @atomic_shl2_and_64_gpr_val(ptr %v, i64 %c) nounwind {680; CHECK-LABEL: atomic_shl2_and_64_gpr_val:681; CHECK:       # %bb.0: # %entry682; CHECK-NEXT:    movq %rsi, %rcx683; CHECK-NEXT:    movl $2, %edx684; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx685; CHECK-NEXT:    shlq %cl, %rdx686; CHECK-NEXT:    movq %rdx, %rcx687; CHECK-NEXT:    notq %rcx688; CHECK-NEXT:    movq (%rdi), %rax689; CHECK-NEXT:    .p2align 4690; CHECK-NEXT:  .LBB25_1: # %atomicrmw.start691; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1692; CHECK-NEXT:    movq %rax, %rsi693; CHECK-NEXT:    andq %rcx, %rsi694; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)695; CHECK-NEXT:    jne .LBB25_1696; CHECK-NEXT:  # %bb.2: # %atomicrmw.end697; CHECK-NEXT:    andq %rdx, %rax698; CHECK-NEXT:    retq699entry:700  %shl = shl i64 2, %c701  %not = xor i64 %shl, -1702  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8703  %and = and i64 %0, %shl704  ret i64 %and705}706 707define i64 @atomic_shl1_neq_and_64_gpr_val(ptr %v, i64 %c) nounwind {708; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_val:709; CHECK:       # %bb.0: # %entry710; CHECK-NEXT:    movq %rsi, %rcx711; CHECK-NEXT:    movq $-2, %rdx712; CHECK-NEXT:    rolq %cl, %rdx713; CHECK-NEXT:    movq (%rdi), %rax714; CHECK-NEXT:    .p2align 4715; CHECK-NEXT:  .LBB26_1: # %atomicrmw.start716; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1717; CHECK-NEXT:    movq %rax, %rsi718; CHECK-NEXT:    andq %rdx, %rsi719; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)720; CHECK-NEXT:    jne .LBB26_1721; CHECK-NEXT:  # %bb.2: # %atomicrmw.end722; CHECK-NEXT:    incb %cl723; CHECK-NEXT:    movl $1, %edx724; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx725; CHECK-NEXT:    shlq %cl, %rdx726; CHECK-NEXT:    andq %rdx, %rax727; CHECK-NEXT:    retq728entry:729  %shl = shl nuw i64 1, %c730  %not = xor i64 %shl, -1731  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8732  %add = add i64 %c, 1733  %shl1 = shl nuw i64 1, %add734  %and = and i64 %0, %shl1735  ret i64 %and736}737 738define i64 @atomic_shl1_small_mask_and_64_gpr_val(ptr %v, i64 %c) nounwind {739; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_val:740; CHECK:       # %bb.0: # %entry741; CHECK-NEXT:    movq %rsi, %rcx742; CHECK-NEXT:    andl $31, %ecx743; CHECK-NEXT:    xorl %eax, %eax744; CHECK-NEXT:    lock btrq %rcx, (%rdi)745; CHECK-NEXT:    setb %al746; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx747; CHECK-NEXT:    shlq %cl, %rax748; CHECK-NEXT:    retq749entry:750  %rem = and i64 %c, 31751  %shl = shl nuw nsw i64 1, %rem752  %not = xor i64 %shl, -1753  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8754  %and = and i64 %0, %shl755  ret i64 %and756}757 758define i64 @atomic_shl1_mask0_and_64_gpr_val(ptr %v, i64 %c) nounwind {759; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_val:760; CHECK:       # %bb.0: # %entry761; CHECK-NEXT:    movq %rsi, %rcx762; CHECK-NEXT:    andl $63, %ecx763; CHECK-NEXT:    xorl %eax, %eax764; CHECK-NEXT:    lock btrq %rcx, (%rdi)765; CHECK-NEXT:    setb %al766; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx767; CHECK-NEXT:    shlq %cl, %rax768; CHECK-NEXT:    retq769entry:770  %rem = and i64 %c, 63771  %shl = shl nuw i64 1, %rem772  %not = sub i64 -1, %shl773  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8774  %shl1 = shl nuw i64 1, %c775  %and = and i64 %0, %shl1776  ret i64 %and777}778 779define i64 @atomic_shl1_mask1_and_64_gpr_val(ptr %v, i64 %c) nounwind {780; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_val:781; CHECK:       # %bb.0: # %entry782; CHECK-NEXT:    movq %rsi, %rcx783; CHECK-NEXT:    andl $63, %ecx784; CHECK-NEXT:    xorl %eax, %eax785; CHECK-NEXT:    lock btrq %rcx, (%rdi)786; CHECK-NEXT:    setb %al787; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx788; CHECK-NEXT:    shlq %cl, %rax789; CHECK-NEXT:    retq790entry:791  %shl = shl nuw i64 1, %c792  %not = xor i64 %shl, -1793  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8794  %rem = and i64 %c, 63795  %shl1 = shl nuw i64 1, %rem796  %and = and i64 %0, %shl1797  ret i64 %and798}799 800define i64 @atomic_shl1_mask01_and_64_gpr_val(ptr %v, i64 %c) nounwind {801; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_val:802; CHECK:       # %bb.0: # %entry803; CHECK-NEXT:    movq %rsi, %rcx804; CHECK-NEXT:    andl $63, %ecx805; CHECK-NEXT:    xorl %eax, %eax806; CHECK-NEXT:    lock btrq %rcx, (%rdi)807; CHECK-NEXT:    setb %al808; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx809; CHECK-NEXT:    shlq %cl, %rax810; CHECK-NEXT:    retq811entry:812  %rem = and i64 %c, 63813  %shl = shl nuw i64 1, %rem814  %not = xor i64 %shl, -1815  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8816  %and = and i64 %0, %shl817  ret i64 %and818}819 820define i64 @atomic_blsi_and_64_gpr_val(ptr %v, i64 %c) nounwind {821; CHECK-LABEL: atomic_blsi_and_64_gpr_val:822; CHECK:       # %bb.0: # %entry823; CHECK-NEXT:    movq %rsi, %rcx824; CHECK-NEXT:    negq %rcx825; CHECK-NEXT:    andq %rsi, %rcx826; CHECK-NEXT:    movq %rcx, %rdx827; CHECK-NEXT:    notq %rdx828; CHECK-NEXT:    movq (%rdi), %rax829; CHECK-NEXT:    .p2align 4830; CHECK-NEXT:  .LBB31_1: # %atomicrmw.start831; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1832; CHECK-NEXT:    movq %rax, %rsi833; CHECK-NEXT:    andq %rdx, %rsi834; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)835; CHECK-NEXT:    jne .LBB31_1836; CHECK-NEXT:  # %bb.2: # %atomicrmw.end837; CHECK-NEXT:    andq %rax, %rcx838; CHECK-NEXT:    movq %rcx, %rax839; CHECK-NEXT:    retq840entry:841  %sub = sub i64 0, %c842  %and = and i64 %sub, %c843  %not = xor i64 %and, -1844  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8845  %and3 = and i64 %and, %0846  ret i64 %and3847}848 849define i64 @atomic_shl1_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {850; CHECK-LABEL: atomic_shl1_and_64_gpr_valnz:851; CHECK:       # %bb.0: # %entry852; CHECK-NEXT:    movq %rsi, %rcx853; CHECK-NEXT:    movq $-2, %rdx854; CHECK-NEXT:    rolq %cl, %rdx855; CHECK-NEXT:    movq (%rdi), %rax856; CHECK-NEXT:    .p2align 4857; CHECK-NEXT:  .LBB32_1: # %atomicrmw.start858; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1859; CHECK-NEXT:    movq %rax, %rsi860; CHECK-NEXT:    andq %rdx, %rsi861; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)862; CHECK-NEXT:    jne .LBB32_1863; CHECK-NEXT:  # %bb.2: # %atomicrmw.end864; CHECK-NEXT:    xorl %edx, %edx865; CHECK-NEXT:    btq %rcx, %rax866; CHECK-NEXT:    setb %dl867; CHECK-NEXT:    movq %rdx, %rax868; CHECK-NEXT:    retq869entry:870  %shl = shl nuw i64 1, %c871  %not = xor i64 %shl, -1872  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8873  %1 = lshr i64 %0, %c874  %conv = and i64 %1, 1875  ret i64 %conv876}877 878define i64 @atomic_shl2_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {879; CHECK-LABEL: atomic_shl2_and_64_gpr_valnz:880; CHECK:       # %bb.0: # %entry881; CHECK-NEXT:    movq %rsi, %rcx882; CHECK-NEXT:    movl $2, %edx883; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx884; CHECK-NEXT:    shlq %cl, %rdx885; CHECK-NEXT:    movq %rdx, %rcx886; CHECK-NEXT:    notq %rcx887; CHECK-NEXT:    movq (%rdi), %rax888; CHECK-NEXT:    .p2align 4889; CHECK-NEXT:  .LBB33_1: # %atomicrmw.start890; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1891; CHECK-NEXT:    movq %rax, %rsi892; CHECK-NEXT:    andq %rcx, %rsi893; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)894; CHECK-NEXT:    jne .LBB33_1895; CHECK-NEXT:  # %bb.2: # %atomicrmw.end896; CHECK-NEXT:    xorl %ecx, %ecx897; CHECK-NEXT:    testq %rax, %rdx898; CHECK-NEXT:    setne %cl899; CHECK-NEXT:    movq %rcx, %rax900; CHECK-NEXT:    retq901entry:902  %shl = shl i64 2, %c903  %not = xor i64 %shl, -1904  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8905  %and = and i64 %shl, %0906  %tobool = icmp ne i64 %and, 0907  %conv = zext i1 %tobool to i64908  ret i64 %conv909}910 911define i64 @atomic_shl1_neq_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {912; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_valnz:913; CHECK:       # %bb.0: # %entry914; CHECK-NEXT:    movq %rsi, %rcx915; CHECK-NEXT:    movq $-2, %rdx916; CHECK-NEXT:    rolq %cl, %rdx917; CHECK-NEXT:    movq (%rdi), %rax918; CHECK-NEXT:    .p2align 4919; CHECK-NEXT:  .LBB34_1: # %atomicrmw.start920; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1921; CHECK-NEXT:    movq %rax, %rsi922; CHECK-NEXT:    andq %rdx, %rsi923; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)924; CHECK-NEXT:    jne .LBB34_1925; CHECK-NEXT:  # %bb.2: # %atomicrmw.end926; CHECK-NEXT:    incb %cl927; CHECK-NEXT:    movzbl %cl, %edx928; CHECK-NEXT:    xorl %ecx, %ecx929; CHECK-NEXT:    btq %rdx, %rax930; CHECK-NEXT:    setb %cl931; CHECK-NEXT:    movq %rcx, %rax932; CHECK-NEXT:    retq933entry:934  %shl = shl nuw i64 1, %c935  %not = xor i64 %shl, -1936  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8937  %add = add i64 %c, 1938  %1 = lshr i64 %0, %add939  %conv = and i64 %1, 1940  ret i64 %conv941}942 943define i64 @atomic_shl1_small_mask_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {944; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_valnz:945; CHECK:       # %bb.0: # %entry946; CHECK-NEXT:    movq %rsi, %rcx947; CHECK-NEXT:    andl $31, %ecx948; CHECK-NEXT:    movq $-2, %rdx949; CHECK-NEXT:    rolq %cl, %rdx950; CHECK-NEXT:    movq (%rdi), %rax951; CHECK-NEXT:    .p2align 4952; CHECK-NEXT:  .LBB35_1: # %atomicrmw.start953; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1954; CHECK-NEXT:    movq %rax, %rsi955; CHECK-NEXT:    andq %rdx, %rsi956; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)957; CHECK-NEXT:    jne .LBB35_1958; CHECK-NEXT:  # %bb.2: # %atomicrmw.end959; CHECK-NEXT:    xorl %edx, %edx960; CHECK-NEXT:    btl %ecx, %eax961; CHECK-NEXT:    setb %dl962; CHECK-NEXT:    movq %rdx, %rax963; CHECK-NEXT:    retq964entry:965  %rem = and i64 %c, 31966  %shl = shl nuw nsw i64 1, %rem967  %not = xor i64 %shl, -1968  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8969  %1 = lshr i64 %0, %rem970  %conv = and i64 %1, 1971  ret i64 %conv972}973 974define i64 @atomic_shl1_mask0_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {975; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_valnz:976; CHECK:       # %bb.0: # %entry977; CHECK-NEXT:    movq %rsi, %rcx978; CHECK-NEXT:    movq $-2, %rdx979; CHECK-NEXT:    rolq %cl, %rdx980; CHECK-NEXT:    movq (%rdi), %rax981; CHECK-NEXT:    .p2align 4982; CHECK-NEXT:  .LBB36_1: # %atomicrmw.start983; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1984; CHECK-NEXT:    movq %rax, %rsi985; CHECK-NEXT:    andq %rdx, %rsi986; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)987; CHECK-NEXT:    jne .LBB36_1988; CHECK-NEXT:  # %bb.2: # %atomicrmw.end989; CHECK-NEXT:    xorl %edx, %edx990; CHECK-NEXT:    btq %rcx, %rax991; CHECK-NEXT:    setb %dl992; CHECK-NEXT:    movq %rdx, %rax993; CHECK-NEXT:    retq994entry:995  %rem = and i64 %c, 63996  %shl = shl nuw i64 1, %rem997  %not = xor i64 %shl, -1998  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 8999  %1 = lshr i64 %0, %c1000  %conv = and i64 %1, 11001  ret i64 %conv1002}1003 1004define i64 @atomic_shl1_mask1_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {1005; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_valnz:1006; CHECK:       # %bb.0: # %entry1007; CHECK-NEXT:    movq %rsi, %rcx1008; CHECK-NEXT:    movq $-2, %rdx1009; CHECK-NEXT:    rolq %cl, %rdx1010; CHECK-NEXT:    movq (%rdi), %rax1011; CHECK-NEXT:    .p2align 41012; CHECK-NEXT:  .LBB37_1: # %atomicrmw.start1013; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11014; CHECK-NEXT:    movq %rax, %rsi1015; CHECK-NEXT:    andq %rdx, %rsi1016; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)1017; CHECK-NEXT:    jne .LBB37_11018; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1019; CHECK-NEXT:    xorl %edx, %edx1020; CHECK-NEXT:    btq %rcx, %rax1021; CHECK-NEXT:    setb %dl1022; CHECK-NEXT:    movq %rdx, %rax1023; CHECK-NEXT:    retq1024entry:1025  %shl = shl nuw i64 1, %c1026  %not = xor i64 %shl, -11027  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81028  %rem = and i64 %c, 631029  %1 = lshr i64 %0, %rem1030  %conv = and i64 %1, 11031  ret i64 %conv1032}1033 1034define i64 @atomic_shl1_mask01_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {1035; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_valnz:1036; CHECK:       # %bb.0: # %entry1037; CHECK-NEXT:    movq %rsi, %rcx1038; CHECK-NEXT:    movl %ecx, %edx1039; CHECK-NEXT:    andl $63, %edx1040; CHECK-NEXT:    movq $-2, %rsi1041; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx1042; CHECK-NEXT:    rolq %cl, %rsi1043; CHECK-NEXT:    movq (%rdi), %rax1044; CHECK-NEXT:    .p2align 41045; CHECK-NEXT:  .LBB38_1: # %atomicrmw.start1046; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11047; CHECK-NEXT:    movq %rax, %rcx1048; CHECK-NEXT:    andq %rsi, %rcx1049; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)1050; CHECK-NEXT:    jne .LBB38_11051; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1052; CHECK-NEXT:    xorl %ecx, %ecx1053; CHECK-NEXT:    btq %rdx, %rax1054; CHECK-NEXT:    setb %cl1055; CHECK-NEXT:    movq %rcx, %rax1056; CHECK-NEXT:    retq1057entry:1058  %rem = and i64 %c, 631059  %shl = shl nuw i64 1, %rem1060  %not = xor i64 %shl, -11061  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81062  %1 = lshr i64 %0, %rem1063  %conv = and i64 %1, 11064  ret i64 %conv1065}1066 1067define i64 @atomic_blsi_and_64_gpr_valnz(ptr %v, i64 %c) nounwind {1068; CHECK-LABEL: atomic_blsi_and_64_gpr_valnz:1069; CHECK:       # %bb.0: # %entry1070; CHECK-NEXT:    movq %rsi, %rdx1071; CHECK-NEXT:    negq %rdx1072; CHECK-NEXT:    andq %rsi, %rdx1073; CHECK-NEXT:    movq %rdx, %rcx1074; CHECK-NEXT:    notq %rcx1075; CHECK-NEXT:    movq (%rdi), %rax1076; CHECK-NEXT:    .p2align 41077; CHECK-NEXT:  .LBB39_1: # %atomicrmw.start1078; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11079; CHECK-NEXT:    movq %rax, %rsi1080; CHECK-NEXT:    andq %rcx, %rsi1081; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)1082; CHECK-NEXT:    jne .LBB39_11083; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1084; CHECK-NEXT:    xorl %ecx, %ecx1085; CHECK-NEXT:    testq %rdx, %rax1086; CHECK-NEXT:    setne %cl1087; CHECK-NEXT:    movq %rcx, %rax1088; CHECK-NEXT:    retq1089entry:1090  %sub = sub i64 0, %c1091  %and = and i64 %sub, %c1092  %not = xor i64 %and, -11093  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81094  %and3 = and i64 %0, %and1095  %tobool = icmp ne i64 %and3, 01096  %conv = zext i1 %tobool to i641097  ret i64 %conv1098}1099 1100define i64 @atomic_shl1_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1101; CHECK-LABEL: atomic_shl1_and_64_gpr_brnz:1102; CHECK:       # %bb.0: # %entry1103; CHECK-NEXT:    movl %esi, %eax1104; CHECK-NEXT:    andl $63, %eax1105; CHECK-NEXT:    lock btrq %rax, (%rdi)1106; CHECK-NEXT:    jae .LBB40_11107; CHECK-NEXT:  # %bb.2: # %if.then1108; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1109; CHECK-NEXT:    retq1110; CHECK-NEXT:  .LBB40_1:1111; CHECK-NEXT:    movl $123, %eax1112; CHECK-NEXT:    retq1113entry:1114  %shl = shl nuw i64 1, %c1115  %not = xor i64 %shl, -11116  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81117  %and = and i64 %shl, %01118  %tobool.not = icmp eq i64 %and, 01119  br i1 %tobool.not, label %return, label %if.then1120 1121if.then:                                          ; preds = %entry1122  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1123  %1 = load i64, ptr %arrayidx, align 81124  br label %return1125 1126return:                                           ; preds = %entry, %if.then1127  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1128  ret i64 %retval.01129}1130 1131define i64 @atomic_shl2_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1132; CHECK-LABEL: atomic_shl2_and_64_gpr_brnz:1133; CHECK:       # %bb.0: # %entry1134; CHECK-NEXT:    movq %rsi, %rcx1135; CHECK-NEXT:    movl $2, %edx1136; CHECK-NEXT:    shlq %cl, %rdx1137; CHECK-NEXT:    movq %rdx, %rsi1138; CHECK-NEXT:    notq %rsi1139; CHECK-NEXT:    movq (%rdi), %rax1140; CHECK-NEXT:    .p2align 41141; CHECK-NEXT:  .LBB41_1: # %atomicrmw.start1142; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11143; CHECK-NEXT:    movq %rax, %r81144; CHECK-NEXT:    andq %rsi, %r81145; CHECK-NEXT:    lock cmpxchgq %r8, (%rdi)1146; CHECK-NEXT:    jne .LBB41_11147; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1148; CHECK-NEXT:    testq %rdx, %rax1149; CHECK-NEXT:    je .LBB41_31150; CHECK-NEXT:  # %bb.4: # %if.then1151; CHECK-NEXT:    movq (%rdi,%rcx,8), %rax1152; CHECK-NEXT:    retq1153; CHECK-NEXT:  .LBB41_3:1154; CHECK-NEXT:    movl $123, %eax1155; CHECK-NEXT:    retq1156entry:1157  %shl = shl i64 2, %c1158  %not = xor i64 %shl, -11159  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81160  %and = and i64 %0, %shl1161  %tobool.not = icmp eq i64 %and, 01162  br i1 %tobool.not, label %return, label %if.then1163 1164if.then:                                          ; preds = %entry1165  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1166  %1 = load i64, ptr %arrayidx, align 81167  br label %return1168 1169return:                                           ; preds = %entry, %if.then1170  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1171  ret i64 %retval.01172}1173 1174define i64 @atomic_shl1_neq_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1175; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_brnz:1176; CHECK:       # %bb.0: # %entry1177; CHECK-NEXT:    movq %rsi, %rcx1178; CHECK-NEXT:    movq $-2, %rdx1179; CHECK-NEXT:    rolq %cl, %rdx1180; CHECK-NEXT:    movq (%rdi), %rax1181; CHECK-NEXT:    .p2align 41182; CHECK-NEXT:  .LBB42_1: # %atomicrmw.start1183; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11184; CHECK-NEXT:    movq %rax, %rsi1185; CHECK-NEXT:    andq %rdx, %rsi1186; CHECK-NEXT:    lock cmpxchgq %rsi, (%rdi)1187; CHECK-NEXT:    jne .LBB42_11188; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1189; CHECK-NEXT:    leal 1(%rcx), %edx1190; CHECK-NEXT:    movzbl %dl, %edx1191; CHECK-NEXT:    btq %rdx, %rax1192; CHECK-NEXT:    jae .LBB42_31193; CHECK-NEXT:  # %bb.4: # %if.then1194; CHECK-NEXT:    movq (%rdi,%rcx,8), %rax1195; CHECK-NEXT:    retq1196; CHECK-NEXT:  .LBB42_3:1197; CHECK-NEXT:    movl $123, %eax1198; CHECK-NEXT:    retq1199entry:1200  %shl = shl nuw i64 1, %c1201  %not = xor i64 %shl, -11202  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81203  %add = add i64 %c, 11204  %shl1 = shl nuw i64 1, %add1205  %and = and i64 %0, %shl11206  %tobool.not = icmp eq i64 %and, 01207  br i1 %tobool.not, label %return, label %if.then1208 1209if.then:                                          ; preds = %entry1210  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1211  %1 = load i64, ptr %arrayidx, align 81212  br label %return1213 1214return:                                           ; preds = %entry, %if.then1215  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1216  ret i64 %retval.01217}1218 1219define i64 @atomic_shl1_small_mask_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1220; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_brnz:1221; CHECK:       # %bb.0: # %entry1222; CHECK-NEXT:    andl $31, %esi1223; CHECK-NEXT:    lock btrq %rsi, (%rdi)1224; CHECK-NEXT:    jae .LBB43_11225; CHECK-NEXT:  # %bb.2: # %if.then1226; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1227; CHECK-NEXT:    retq1228; CHECK-NEXT:  .LBB43_1:1229; CHECK-NEXT:    movl $123, %eax1230; CHECK-NEXT:    retq1231entry:1232  %rem = and i64 %c, 311233  %shl = shl nuw nsw i64 1, %rem1234  %not = xor i64 %shl, -11235  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81236  %and = and i64 %0, %shl1237  %tobool.not = icmp eq i64 %and, 01238  br i1 %tobool.not, label %return, label %if.then1239 1240if.then:                                          ; preds = %entry1241  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %rem1242  %1 = load i64, ptr %arrayidx, align 81243  br label %return1244 1245return:                                           ; preds = %entry, %if.then1246  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1247  ret i64 %retval.01248}1249 1250define i64 @atomic_shl1_mask0_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1251; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_brnz:1252; CHECK:       # %bb.0: # %entry1253; CHECK-NEXT:    movl %esi, %eax1254; CHECK-NEXT:    andl $63, %eax1255; CHECK-NEXT:    lock btrq %rax, (%rdi)1256; CHECK-NEXT:    jae .LBB44_11257; CHECK-NEXT:  # %bb.2: # %if.then1258; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1259; CHECK-NEXT:    retq1260; CHECK-NEXT:  .LBB44_1:1261; CHECK-NEXT:    movl $123, %eax1262; CHECK-NEXT:    retq1263entry:1264  %rem = and i64 %c, 631265  %shl = shl nuw i64 1, %rem1266  %not = xor i64 %shl, -11267  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81268  %shl1 = shl nuw i64 1, %c1269  %and = and i64 %shl1, %01270  %tobool.not = icmp eq i64 %and, 01271  br i1 %tobool.not, label %return, label %if.then1272 1273if.then:                                          ; preds = %entry1274  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1275  %1 = load i64, ptr %arrayidx, align 81276  br label %return1277 1278return:                                           ; preds = %entry, %if.then1279  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1280  ret i64 %retval.01281}1282 1283define i64 @atomic_shl1_mask1_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1284; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_brnz:1285; CHECK:       # %bb.0: # %entry1286; CHECK-NEXT:    movl %esi, %eax1287; CHECK-NEXT:    andl $63, %eax1288; CHECK-NEXT:    lock btrq %rax, (%rdi)1289; CHECK-NEXT:    jae .LBB45_11290; CHECK-NEXT:  # %bb.2: # %if.then1291; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1292; CHECK-NEXT:    retq1293; CHECK-NEXT:  .LBB45_1:1294; CHECK-NEXT:    movl $123, %eax1295; CHECK-NEXT:    retq1296entry:1297  %shl = shl nuw i64 1, %c1298  %not = xor i64 %shl, -11299  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81300  %rem = and i64 %c, 631301  %shl1 = shl nuw i64 1, %rem1302  %and = and i64 %0, %shl11303  %tobool.not = icmp eq i64 %and, 01304  br i1 %tobool.not, label %return, label %if.then1305 1306if.then:                                          ; preds = %entry1307  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1308  %1 = load i64, ptr %arrayidx, align 81309  br label %return1310 1311return:                                           ; preds = %entry, %if.then1312  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1313  ret i64 %retval.01314}1315 1316define i64 @atomic_shl1_mask01_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1317; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_brnz:1318; CHECK:       # %bb.0: # %entry1319; CHECK-NEXT:    movl %esi, %eax1320; CHECK-NEXT:    andl $63, %eax1321; CHECK-NEXT:    lock btrq %rax, (%rdi)1322; CHECK-NEXT:    jae .LBB46_11323; CHECK-NEXT:  # %bb.2: # %if.then1324; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1325; CHECK-NEXT:    retq1326; CHECK-NEXT:  .LBB46_1:1327; CHECK-NEXT:    movl $123, %eax1328; CHECK-NEXT:    retq1329entry:1330  %rem = and i64 %c, 631331  %shl = shl nuw i64 1, %rem1332  %not = xor i64 %shl, -11333  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81334  %and = and i64 %0, %shl1335  %tobool.not = icmp eq i64 %and, 01336  br i1 %tobool.not, label %return, label %if.then1337 1338if.then:                                          ; preds = %entry1339  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1340  %1 = load i64, ptr %arrayidx, align 81341  br label %return1342 1343return:                                           ; preds = %entry, %if.then1344  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1345  ret i64 %retval.01346}1347 1348define i64 @atomic_blsi_and_64_gpr_brnz(ptr %v, i64 %c) nounwind {1349; CHECK-LABEL: atomic_blsi_and_64_gpr_brnz:1350; CHECK:       # %bb.0: # %entry1351; CHECK-NEXT:    movq %rsi, %rcx1352; CHECK-NEXT:    negq %rcx1353; CHECK-NEXT:    andq %rsi, %rcx1354; CHECK-NEXT:    movq %rcx, %rdx1355; CHECK-NEXT:    notq %rdx1356; CHECK-NEXT:    movq (%rdi), %rax1357; CHECK-NEXT:    .p2align 41358; CHECK-NEXT:  .LBB47_1: # %atomicrmw.start1359; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11360; CHECK-NEXT:    movq %rax, %r81361; CHECK-NEXT:    andq %rdx, %r81362; CHECK-NEXT:    lock cmpxchgq %r8, (%rdi)1363; CHECK-NEXT:    jne .LBB47_11364; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1365; CHECK-NEXT:    testq %rcx, %rax1366; CHECK-NEXT:    je .LBB47_31367; CHECK-NEXT:  # %bb.4: # %if.then1368; CHECK-NEXT:    movq (%rdi,%rsi,8), %rax1369; CHECK-NEXT:    retq1370; CHECK-NEXT:  .LBB47_3:1371; CHECK-NEXT:    movl $123, %eax1372; CHECK-NEXT:    retq1373entry:1374  %sub = sub i64 0, %c1375  %and = and i64 %sub, %c1376  %not = xor i64 %and, -11377  %0 = atomicrmw and ptr %v, i64 %not monotonic, align 81378  %and3 = and i64 %0, %and1379  %tobool.not = icmp eq i64 %and3, 01380  br i1 %tobool.not, label %return, label %if.then1381 1382if.then:                                          ; preds = %entry1383  %arrayidx = getelementptr inbounds i64, ptr %v, i64 %c1384  %1 = load i64, ptr %arrayidx, align 81385  br label %return1386 1387return:                                           ; preds = %entry, %if.then1388  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1389  ret i64 %retval.01390}1391 1392define i64 @atomic_shl1_xor_64_const_br(ptr %v) nounwind {1393; CHECK-LABEL: atomic_shl1_xor_64_const_br:1394; CHECK:       # %bb.0: # %entry1395; CHECK-NEXT:    lock btcq $4, (%rdi)1396; CHECK-NEXT:    jae .LBB48_11397; CHECK-NEXT:  # %bb.2: # %if.then1398; CHECK-NEXT:    movq 32(%rdi), %rax1399; CHECK-NEXT:    retq1400; CHECK-NEXT:  .LBB48_1:1401; CHECK-NEXT:    movl $123, %eax1402; CHECK-NEXT:    retq1403entry:1404  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81405  %and = and i64 %0, 161406  %tobool.not = icmp eq i64 %and, 01407  br i1 %tobool.not, label %return, label %if.then1408 1409if.then:                                          ; preds = %entry1410  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41411  %1 = load i64, ptr %arrayidx, align 81412  br label %return1413 1414return:                                           ; preds = %entry, %if.then1415  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1416  ret i64 %retval.01417}1418 1419define i64 @atomic_shl1_neq_xor_64_const_br(ptr %v) nounwind {1420; CHECK-LABEL: atomic_shl1_neq_xor_64_const_br:1421; CHECK:       # %bb.0: # %entry1422; CHECK-NEXT:    movq (%rdi), %rax1423; CHECK-NEXT:    .p2align 41424; CHECK-NEXT:  .LBB49_1: # %atomicrmw.start1425; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11426; CHECK-NEXT:    movq %rax, %rcx1427; CHECK-NEXT:    xorq $16, %rcx1428; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)1429; CHECK-NEXT:    jne .LBB49_11430; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1431; CHECK-NEXT:    movl $123, %ecx1432; CHECK-NEXT:    testb $32, %al1433; CHECK-NEXT:    je .LBB49_41434; CHECK-NEXT:  # %bb.3: # %if.then1435; CHECK-NEXT:    movq 32(%rdi), %rcx1436; CHECK-NEXT:  .LBB49_4: # %return1437; CHECK-NEXT:    movq %rcx, %rax1438; CHECK-NEXT:    retq1439entry:1440  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81441  %and = and i64 %0, 321442  %tobool.not = icmp eq i64 %and, 01443  br i1 %tobool.not, label %return, label %if.then1444 1445if.then:                                          ; preds = %entry1446  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41447  %1 = load i64, ptr %arrayidx, align 81448  br label %return1449 1450return:                                           ; preds = %entry, %if.then1451  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1452  ret i64 %retval.01453}1454 1455define i64 @atomic_shl1_xor_64_const_brz(ptr %v) nounwind {1456; CHECK-LABEL: atomic_shl1_xor_64_const_brz:1457; CHECK:       # %bb.0: # %entry1458; CHECK-NEXT:    lock btcq $4, (%rdi)1459; CHECK-NEXT:    movl $123, %eax1460; CHECK-NEXT:    jae .LBB50_11461; CHECK-NEXT:  # %bb.2: # %return1462; CHECK-NEXT:    retq1463; CHECK-NEXT:  .LBB50_1: # %if.then1464; CHECK-NEXT:    movq 32(%rdi), %rax1465; CHECK-NEXT:    retq1466entry:1467  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81468  %and = and i64 16, %01469  %tobool.not = icmp eq i64 %and, 01470  br i1 %tobool.not, label %if.then, label %return1471 1472if.then:                                          ; preds = %entry1473  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41474  %1 = load i64, ptr %arrayidx, align 81475  br label %return1476 1477return:                                           ; preds = %entry, %if.then1478  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1479  ret i64 %retval.01480}1481 1482define i64 @atomic_shl1_neq_xor_64_const_brz(ptr %v) nounwind {1483; CHECK-LABEL: atomic_shl1_neq_xor_64_const_brz:1484; CHECK:       # %bb.0: # %entry1485; CHECK-NEXT:    movq (%rdi), %rax1486; CHECK-NEXT:    .p2align 41487; CHECK-NEXT:  .LBB51_1: # %atomicrmw.start1488; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11489; CHECK-NEXT:    movq %rax, %rcx1490; CHECK-NEXT:    xorq $16, %rcx1491; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)1492; CHECK-NEXT:    jne .LBB51_11493; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1494; CHECK-NEXT:    movl $123, %ecx1495; CHECK-NEXT:    testb $32, %al1496; CHECK-NEXT:    jne .LBB51_41497; CHECK-NEXT:  # %bb.3: # %if.then1498; CHECK-NEXT:    movq 32(%rdi), %rcx1499; CHECK-NEXT:  .LBB51_4: # %return1500; CHECK-NEXT:    movq %rcx, %rax1501; CHECK-NEXT:    retq1502entry:1503  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81504  %and = and i64 %0, 321505  %tobool.not = icmp eq i64 %and, 01506  br i1 %tobool.not, label %if.then, label %return1507 1508if.then:                                          ; preds = %entry1509  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41510  %1 = load i64, ptr %arrayidx, align 81511  br label %return1512 1513return:                                           ; preds = %entry, %if.then1514  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1515  ret i64 %retval.01516}1517 1518define i64 @atomic_shl1_xor_64_const_brnz(ptr %v) nounwind {1519; CHECK-LABEL: atomic_shl1_xor_64_const_brnz:1520; CHECK:       # %bb.0: # %entry1521; CHECK-NEXT:    lock btcq $4, (%rdi)1522; CHECK-NEXT:    jae .LBB52_11523; CHECK-NEXT:  # %bb.2: # %if.then1524; CHECK-NEXT:    movq 32(%rdi), %rax1525; CHECK-NEXT:    retq1526; CHECK-NEXT:  .LBB52_1:1527; CHECK-NEXT:    movl $123, %eax1528; CHECK-NEXT:    retq1529entry:1530  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81531  %and = and i64 %0, 161532  %tobool.not = icmp eq i64 %and, 01533  br i1 %tobool.not, label %return, label %if.then1534 1535if.then:                                          ; preds = %entry1536  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41537  %1 = load i64, ptr %arrayidx, align 81538  br label %return1539 1540return:                                           ; preds = %entry, %if.then1541  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1542  ret i64 %retval.01543}1544 1545define i64 @atomic_shl1_neq_xor_64_const_brnz(ptr %v) nounwind {1546; CHECK-LABEL: atomic_shl1_neq_xor_64_const_brnz:1547; CHECK:       # %bb.0: # %entry1548; CHECK-NEXT:    movq (%rdi), %rax1549; CHECK-NEXT:    .p2align 41550; CHECK-NEXT:  .LBB53_1: # %atomicrmw.start1551; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11552; CHECK-NEXT:    movq %rax, %rcx1553; CHECK-NEXT:    xorq $16, %rcx1554; CHECK-NEXT:    lock cmpxchgq %rcx, (%rdi)1555; CHECK-NEXT:    jne .LBB53_11556; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1557; CHECK-NEXT:    movl $123, %ecx1558; CHECK-NEXT:    testb $32, %al1559; CHECK-NEXT:    je .LBB53_41560; CHECK-NEXT:  # %bb.3: # %if.then1561; CHECK-NEXT:    movq 32(%rdi), %rcx1562; CHECK-NEXT:  .LBB53_4: # %return1563; CHECK-NEXT:    movq %rcx, %rax1564; CHECK-NEXT:    retq1565entry:1566  %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 81567  %and = and i64 %0, 321568  %tobool.not = icmp eq i64 %and, 01569  br i1 %tobool.not, label %return, label %if.then1570 1571if.then:                                          ; preds = %entry1572  %arrayidx = getelementptr inbounds i64, ptr %v, i64 41573  %1 = load i64, ptr %arrayidx, align 81574  br label %return1575 1576return:                                           ; preds = %entry, %if.then1577  %retval.0 = phi i64 [ %1, %if.then ], [ 123, %entry ]1578  ret i64 %retval.01579}1580 1581define i64 @atomic_and_with_not_arg(ptr %v, i64 %c) nounwind {1582; CHECK-LABEL: atomic_and_with_not_arg:1583; CHECK:       # %bb.0: # %entry1584; CHECK-NEXT:    movq $-1, %rcx1585; CHECK-NEXT:    movq (%rdi), %rax1586; CHECK-NEXT:    .p2align 41587; CHECK-NEXT:  .LBB54_1: # %atomicrmw.start1588; CHECK-NEXT:    # =>This Inner Loop Header: Depth=11589; CHECK-NEXT:    movq %rax, %rdx1590; CHECK-NEXT:    orq %rcx, %rdx1591; CHECK-NEXT:    lock cmpxchgq %rdx, (%rdi)1592; CHECK-NEXT:    jne .LBB54_11593; CHECK-NEXT:  # %bb.2: # %atomicrmw.end1594; CHECK-NEXT:    retq1595  entry:1596  %0 = xor i64 0, -11597  %1 = atomicrmw or ptr %v, i64 %0 monotonic, align 81598  ret i64 %11599}1600