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