430 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefixes=NOZACAS,RV32IA %s4; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=ZACAS,RV32IA-ZACAS %s6; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=NOZACAS,RV64IA %s8; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefixes=ZACAS,RV64IA-ZACAS %s10; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas,+zabha -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefixes=ZACAS,RV64IA-ZABHA %s12 13; Test cmpxchg followed by a branch on the cmpxchg success value to see if the14; branch is folded into the cmpxchg expansion.15 16define void @cmpxchg_and_branch1(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind {17; NOZACAS-LABEL: cmpxchg_and_branch1:18; NOZACAS: # %bb.0: # %entry19; NOZACAS-NEXT: .LBB0_1: # %do_cmpxchg20; NOZACAS-NEXT: # =>This Loop Header: Depth=121; NOZACAS-NEXT: # Child Loop BB0_3 Depth 222; NOZACAS-NEXT: .LBB0_3: # %do_cmpxchg23; NOZACAS-NEXT: # Parent Loop BB0_1 Depth=124; NOZACAS-NEXT: # => This Inner Loop Header: Depth=225; NOZACAS-NEXT: lr.w.aqrl a3, (a0)26; NOZACAS-NEXT: bne a3, a1, .LBB0_127; NOZACAS-NEXT: # %bb.4: # %do_cmpxchg28; NOZACAS-NEXT: # in Loop: Header=BB0_3 Depth=229; NOZACAS-NEXT: sc.w.rl a4, a2, (a0)30; NOZACAS-NEXT: bnez a4, .LBB0_331; NOZACAS-NEXT: # %bb.5: # %do_cmpxchg32; NOZACAS-NEXT: # %bb.2: # %exit33; NOZACAS-NEXT: ret34;35; ZACAS-LABEL: cmpxchg_and_branch1:36; ZACAS: # %bb.0: # %entry37; ZACAS-NEXT: .LBB0_1: # %do_cmpxchg38; ZACAS-NEXT: # =>This Inner Loop Header: Depth=139; ZACAS-NEXT: fence rw, rw40; ZACAS-NEXT: mv a3, a141; ZACAS-NEXT: amocas.w.aqrl a3, a2, (a0)42; ZACAS-NEXT: bne a3, a1, .LBB0_143; ZACAS-NEXT: # %bb.2: # %exit44; ZACAS-NEXT: ret45entry:46 br label %do_cmpxchg47do_cmpxchg:48 %0 = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst49 %1 = extractvalue { i32, i1 } %0, 150 br i1 %1, label %exit, label %do_cmpxchg51exit:52 ret void53}54 55define void @cmpxchg_and_branch2(ptr %ptr, i32 signext %cmp, i32 signext %val) nounwind {56; NOZACAS-LABEL: cmpxchg_and_branch2:57; NOZACAS: # %bb.0: # %entry58; NOZACAS-NEXT: .LBB1_1: # %do_cmpxchg59; NOZACAS-NEXT: # =>This Loop Header: Depth=160; NOZACAS-NEXT: # Child Loop BB1_3 Depth 261; NOZACAS-NEXT: .LBB1_3: # %do_cmpxchg62; NOZACAS-NEXT: # Parent Loop BB1_1 Depth=163; NOZACAS-NEXT: # => This Inner Loop Header: Depth=264; NOZACAS-NEXT: lr.w.aqrl a3, (a0)65; NOZACAS-NEXT: bne a3, a1, .LBB1_566; NOZACAS-NEXT: # %bb.4: # %do_cmpxchg67; NOZACAS-NEXT: # in Loop: Header=BB1_3 Depth=268; NOZACAS-NEXT: sc.w.rl a4, a2, (a0)69; NOZACAS-NEXT: bnez a4, .LBB1_370; NOZACAS-NEXT: .LBB1_5: # %do_cmpxchg71; NOZACAS-NEXT: # in Loop: Header=BB1_1 Depth=172; NOZACAS-NEXT: beq a3, a1, .LBB1_173; NOZACAS-NEXT: # %bb.2: # %exit74; NOZACAS-NEXT: ret75;76; ZACAS-LABEL: cmpxchg_and_branch2:77; ZACAS: # %bb.0: # %entry78; ZACAS-NEXT: .LBB1_1: # %do_cmpxchg79; ZACAS-NEXT: # =>This Inner Loop Header: Depth=180; ZACAS-NEXT: fence rw, rw81; ZACAS-NEXT: mv a3, a182; ZACAS-NEXT: amocas.w.aqrl a3, a2, (a0)83; ZACAS-NEXT: beq a3, a1, .LBB1_184; ZACAS-NEXT: # %bb.2: # %exit85; ZACAS-NEXT: ret86entry:87 br label %do_cmpxchg88do_cmpxchg:89 %0 = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst90 %1 = extractvalue { i32, i1 } %0, 191 br i1 %1, label %do_cmpxchg, label %exit92exit:93 ret void94}95 96define void @cmpxchg_masked_and_branch1(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind {97; RV32IA-LABEL: cmpxchg_masked_and_branch1:98; RV32IA: # %bb.0: # %entry99; RV32IA-NEXT: andi a3, a0, -4100; RV32IA-NEXT: slli a4, a0, 3101; RV32IA-NEXT: li a0, 255102; RV32IA-NEXT: zext.b a1, a1103; RV32IA-NEXT: zext.b a2, a2104; RV32IA-NEXT: sll a0, a0, a4105; RV32IA-NEXT: sll a1, a1, a4106; RV32IA-NEXT: sll a2, a2, a4107; RV32IA-NEXT: .LBB2_1: # %do_cmpxchg108; RV32IA-NEXT: # =>This Loop Header: Depth=1109; RV32IA-NEXT: # Child Loop BB2_3 Depth 2110; RV32IA-NEXT: .LBB2_3: # %do_cmpxchg111; RV32IA-NEXT: # Parent Loop BB2_1 Depth=1112; RV32IA-NEXT: # => This Inner Loop Header: Depth=2113; RV32IA-NEXT: lr.w.aqrl a4, (a3)114; RV32IA-NEXT: and a5, a4, a0115; RV32IA-NEXT: bne a5, a1, .LBB2_1116; RV32IA-NEXT: # %bb.4: # %do_cmpxchg117; RV32IA-NEXT: # in Loop: Header=BB2_3 Depth=2118; RV32IA-NEXT: xor a5, a4, a2119; RV32IA-NEXT: and a5, a5, a0120; RV32IA-NEXT: xor a5, a4, a5121; RV32IA-NEXT: sc.w.rl a5, a5, (a3)122; RV32IA-NEXT: bnez a5, .LBB2_3123; RV32IA-NEXT: # %bb.5: # %do_cmpxchg124; RV32IA-NEXT: # %bb.2: # %exit125; RV32IA-NEXT: ret126;127; RV32IA-ZACAS-LABEL: cmpxchg_masked_and_branch1:128; RV32IA-ZACAS: # %bb.0: # %entry129; RV32IA-ZACAS-NEXT: andi a3, a0, -4130; RV32IA-ZACAS-NEXT: slli a4, a0, 3131; RV32IA-ZACAS-NEXT: li a0, 255132; RV32IA-ZACAS-NEXT: zext.b a1, a1133; RV32IA-ZACAS-NEXT: zext.b a2, a2134; RV32IA-ZACAS-NEXT: sll a0, a0, a4135; RV32IA-ZACAS-NEXT: sll a1, a1, a4136; RV32IA-ZACAS-NEXT: sll a2, a2, a4137; RV32IA-ZACAS-NEXT: .LBB2_1: # %do_cmpxchg138; RV32IA-ZACAS-NEXT: # =>This Loop Header: Depth=1139; RV32IA-ZACAS-NEXT: # Child Loop BB2_3 Depth 2140; RV32IA-ZACAS-NEXT: .LBB2_3: # %do_cmpxchg141; RV32IA-ZACAS-NEXT: # Parent Loop BB2_1 Depth=1142; RV32IA-ZACAS-NEXT: # => This Inner Loop Header: Depth=2143; RV32IA-ZACAS-NEXT: lr.w.aqrl a4, (a3)144; RV32IA-ZACAS-NEXT: and a5, a4, a0145; RV32IA-ZACAS-NEXT: bne a5, a1, .LBB2_1146; RV32IA-ZACAS-NEXT: # %bb.4: # %do_cmpxchg147; RV32IA-ZACAS-NEXT: # in Loop: Header=BB2_3 Depth=2148; RV32IA-ZACAS-NEXT: xor a5, a4, a2149; RV32IA-ZACAS-NEXT: and a5, a5, a0150; RV32IA-ZACAS-NEXT: xor a5, a4, a5151; RV32IA-ZACAS-NEXT: sc.w.rl a5, a5, (a3)152; RV32IA-ZACAS-NEXT: bnez a5, .LBB2_3153; RV32IA-ZACAS-NEXT: # %bb.5: # %do_cmpxchg154; RV32IA-ZACAS-NEXT: # %bb.2: # %exit155; RV32IA-ZACAS-NEXT: ret156;157; RV64IA-LABEL: cmpxchg_masked_and_branch1:158; RV64IA: # %bb.0: # %entry159; RV64IA-NEXT: andi a3, a0, -4160; RV64IA-NEXT: slli a4, a0, 3161; RV64IA-NEXT: li a0, 255162; RV64IA-NEXT: zext.b a1, a1163; RV64IA-NEXT: zext.b a2, a2164; RV64IA-NEXT: sllw a0, a0, a4165; RV64IA-NEXT: sllw a1, a1, a4166; RV64IA-NEXT: sllw a2, a2, a4167; RV64IA-NEXT: .LBB2_1: # %do_cmpxchg168; RV64IA-NEXT: # =>This Loop Header: Depth=1169; RV64IA-NEXT: # Child Loop BB2_3 Depth 2170; RV64IA-NEXT: .LBB2_3: # %do_cmpxchg171; RV64IA-NEXT: # Parent Loop BB2_1 Depth=1172; RV64IA-NEXT: # => This Inner Loop Header: Depth=2173; RV64IA-NEXT: lr.w.aqrl a4, (a3)174; RV64IA-NEXT: and a5, a4, a0175; RV64IA-NEXT: bne a5, a1, .LBB2_1176; RV64IA-NEXT: # %bb.4: # %do_cmpxchg177; RV64IA-NEXT: # in Loop: Header=BB2_3 Depth=2178; RV64IA-NEXT: xor a5, a4, a2179; RV64IA-NEXT: and a5, a5, a0180; RV64IA-NEXT: xor a5, a4, a5181; RV64IA-NEXT: sc.w.rl a5, a5, (a3)182; RV64IA-NEXT: bnez a5, .LBB2_3183; RV64IA-NEXT: # %bb.5: # %do_cmpxchg184; RV64IA-NEXT: # %bb.2: # %exit185; RV64IA-NEXT: ret186;187; RV64IA-ZACAS-LABEL: cmpxchg_masked_and_branch1:188; RV64IA-ZACAS: # %bb.0: # %entry189; RV64IA-ZACAS-NEXT: andi a3, a0, -4190; RV64IA-ZACAS-NEXT: slli a4, a0, 3191; RV64IA-ZACAS-NEXT: li a0, 255192; RV64IA-ZACAS-NEXT: zext.b a1, a1193; RV64IA-ZACAS-NEXT: zext.b a2, a2194; RV64IA-ZACAS-NEXT: sllw a0, a0, a4195; RV64IA-ZACAS-NEXT: sllw a1, a1, a4196; RV64IA-ZACAS-NEXT: sllw a2, a2, a4197; RV64IA-ZACAS-NEXT: .LBB2_1: # %do_cmpxchg198; RV64IA-ZACAS-NEXT: # =>This Loop Header: Depth=1199; RV64IA-ZACAS-NEXT: # Child Loop BB2_3 Depth 2200; RV64IA-ZACAS-NEXT: .LBB2_3: # %do_cmpxchg201; RV64IA-ZACAS-NEXT: # Parent Loop BB2_1 Depth=1202; RV64IA-ZACAS-NEXT: # => This Inner Loop Header: Depth=2203; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a3)204; RV64IA-ZACAS-NEXT: and a5, a4, a0205; RV64IA-ZACAS-NEXT: bne a5, a1, .LBB2_1206; RV64IA-ZACAS-NEXT: # %bb.4: # %do_cmpxchg207; RV64IA-ZACAS-NEXT: # in Loop: Header=BB2_3 Depth=2208; RV64IA-ZACAS-NEXT: xor a5, a4, a2209; RV64IA-ZACAS-NEXT: and a5, a5, a0210; RV64IA-ZACAS-NEXT: xor a5, a4, a5211; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a3)212; RV64IA-ZACAS-NEXT: bnez a5, .LBB2_3213; RV64IA-ZACAS-NEXT: # %bb.5: # %do_cmpxchg214; RV64IA-ZACAS-NEXT: # %bb.2: # %exit215; RV64IA-ZACAS-NEXT: ret216;217; RV64IA-ZABHA-LABEL: cmpxchg_masked_and_branch1:218; RV64IA-ZABHA: # %bb.0: # %entry219; RV64IA-ZABHA-NEXT: .LBB2_1: # %do_cmpxchg220; RV64IA-ZABHA-NEXT: # =>This Inner Loop Header: Depth=1221; RV64IA-ZABHA-NEXT: fence rw, rw222; RV64IA-ZABHA-NEXT: mv a3, a1223; RV64IA-ZABHA-NEXT: amocas.b.aqrl a3, a2, (a0)224; RV64IA-ZABHA-NEXT: bne a3, a1, .LBB2_1225; RV64IA-ZABHA-NEXT: # %bb.2: # %exit226; RV64IA-ZABHA-NEXT: ret227entry:228 br label %do_cmpxchg229do_cmpxchg:230 %0 = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst seq_cst231 %1 = extractvalue { i8, i1 } %0, 1232 br i1 %1, label %exit, label %do_cmpxchg233exit:234 ret void235}236 237define void @cmpxchg_masked_and_branch2(ptr %ptr, i8 signext %cmp, i8 signext %val) nounwind {238; RV32IA-LABEL: cmpxchg_masked_and_branch2:239; RV32IA: # %bb.0: # %entry240; RV32IA-NEXT: andi a3, a0, -4241; RV32IA-NEXT: slli a4, a0, 3242; RV32IA-NEXT: li a0, 255243; RV32IA-NEXT: zext.b a1, a1244; RV32IA-NEXT: zext.b a2, a2245; RV32IA-NEXT: sll a0, a0, a4246; RV32IA-NEXT: sll a1, a1, a4247; RV32IA-NEXT: sll a2, a2, a4248; RV32IA-NEXT: .LBB3_1: # %do_cmpxchg249; RV32IA-NEXT: # =>This Loop Header: Depth=1250; RV32IA-NEXT: # Child Loop BB3_3 Depth 2251; RV32IA-NEXT: .LBB3_3: # %do_cmpxchg252; RV32IA-NEXT: # Parent Loop BB3_1 Depth=1253; RV32IA-NEXT: # => This Inner Loop Header: Depth=2254; RV32IA-NEXT: lr.w.aqrl a4, (a3)255; RV32IA-NEXT: and a5, a4, a0256; RV32IA-NEXT: bne a5, a1, .LBB3_5257; RV32IA-NEXT: # %bb.4: # %do_cmpxchg258; RV32IA-NEXT: # in Loop: Header=BB3_3 Depth=2259; RV32IA-NEXT: xor a5, a4, a2260; RV32IA-NEXT: and a5, a5, a0261; RV32IA-NEXT: xor a5, a4, a5262; RV32IA-NEXT: sc.w.rl a5, a5, (a3)263; RV32IA-NEXT: bnez a5, .LBB3_3264; RV32IA-NEXT: .LBB3_5: # %do_cmpxchg265; RV32IA-NEXT: # in Loop: Header=BB3_1 Depth=1266; RV32IA-NEXT: and a4, a4, a0267; RV32IA-NEXT: beq a1, a4, .LBB3_1268; RV32IA-NEXT: # %bb.2: # %exit269; RV32IA-NEXT: ret270;271; RV32IA-ZACAS-LABEL: cmpxchg_masked_and_branch2:272; RV32IA-ZACAS: # %bb.0: # %entry273; RV32IA-ZACAS-NEXT: andi a3, a0, -4274; RV32IA-ZACAS-NEXT: slli a4, a0, 3275; RV32IA-ZACAS-NEXT: li a0, 255276; RV32IA-ZACAS-NEXT: zext.b a1, a1277; RV32IA-ZACAS-NEXT: zext.b a2, a2278; RV32IA-ZACAS-NEXT: sll a0, a0, a4279; RV32IA-ZACAS-NEXT: sll a1, a1, a4280; RV32IA-ZACAS-NEXT: sll a2, a2, a4281; RV32IA-ZACAS-NEXT: .LBB3_1: # %do_cmpxchg282; RV32IA-ZACAS-NEXT: # =>This Loop Header: Depth=1283; RV32IA-ZACAS-NEXT: # Child Loop BB3_3 Depth 2284; RV32IA-ZACAS-NEXT: .LBB3_3: # %do_cmpxchg285; RV32IA-ZACAS-NEXT: # Parent Loop BB3_1 Depth=1286; RV32IA-ZACAS-NEXT: # => This Inner Loop Header: Depth=2287; RV32IA-ZACAS-NEXT: lr.w.aqrl a4, (a3)288; RV32IA-ZACAS-NEXT: and a5, a4, a0289; RV32IA-ZACAS-NEXT: bne a5, a1, .LBB3_5290; RV32IA-ZACAS-NEXT: # %bb.4: # %do_cmpxchg291; RV32IA-ZACAS-NEXT: # in Loop: Header=BB3_3 Depth=2292; RV32IA-ZACAS-NEXT: xor a5, a4, a2293; RV32IA-ZACAS-NEXT: and a5, a5, a0294; RV32IA-ZACAS-NEXT: xor a5, a4, a5295; RV32IA-ZACAS-NEXT: sc.w.rl a5, a5, (a3)296; RV32IA-ZACAS-NEXT: bnez a5, .LBB3_3297; RV32IA-ZACAS-NEXT: .LBB3_5: # %do_cmpxchg298; RV32IA-ZACAS-NEXT: # in Loop: Header=BB3_1 Depth=1299; RV32IA-ZACAS-NEXT: and a4, a4, a0300; RV32IA-ZACAS-NEXT: beq a1, a4, .LBB3_1301; RV32IA-ZACAS-NEXT: # %bb.2: # %exit302; RV32IA-ZACAS-NEXT: ret303;304; RV64IA-LABEL: cmpxchg_masked_and_branch2:305; RV64IA: # %bb.0: # %entry306; RV64IA-NEXT: andi a3, a0, -4307; RV64IA-NEXT: slli a4, a0, 3308; RV64IA-NEXT: li a0, 255309; RV64IA-NEXT: zext.b a1, a1310; RV64IA-NEXT: zext.b a2, a2311; RV64IA-NEXT: sllw a0, a0, a4312; RV64IA-NEXT: sllw a1, a1, a4313; RV64IA-NEXT: sllw a2, a2, a4314; RV64IA-NEXT: .LBB3_1: # %do_cmpxchg315; RV64IA-NEXT: # =>This Loop Header: Depth=1316; RV64IA-NEXT: # Child Loop BB3_3 Depth 2317; RV64IA-NEXT: .LBB3_3: # %do_cmpxchg318; RV64IA-NEXT: # Parent Loop BB3_1 Depth=1319; RV64IA-NEXT: # => This Inner Loop Header: Depth=2320; RV64IA-NEXT: lr.w.aqrl a4, (a3)321; RV64IA-NEXT: and a5, a4, a0322; RV64IA-NEXT: bne a5, a1, .LBB3_5323; RV64IA-NEXT: # %bb.4: # %do_cmpxchg324; RV64IA-NEXT: # in Loop: Header=BB3_3 Depth=2325; RV64IA-NEXT: xor a5, a4, a2326; RV64IA-NEXT: and a5, a5, a0327; RV64IA-NEXT: xor a5, a4, a5328; RV64IA-NEXT: sc.w.rl a5, a5, (a3)329; RV64IA-NEXT: bnez a5, .LBB3_3330; RV64IA-NEXT: .LBB3_5: # %do_cmpxchg331; RV64IA-NEXT: # in Loop: Header=BB3_1 Depth=1332; RV64IA-NEXT: and a4, a4, a0333; RV64IA-NEXT: beq a1, a4, .LBB3_1334; RV64IA-NEXT: # %bb.2: # %exit335; RV64IA-NEXT: ret336;337; RV64IA-ZACAS-LABEL: cmpxchg_masked_and_branch2:338; RV64IA-ZACAS: # %bb.0: # %entry339; RV64IA-ZACAS-NEXT: andi a3, a0, -4340; RV64IA-ZACAS-NEXT: slli a4, a0, 3341; RV64IA-ZACAS-NEXT: li a0, 255342; RV64IA-ZACAS-NEXT: zext.b a1, a1343; RV64IA-ZACAS-NEXT: zext.b a2, a2344; RV64IA-ZACAS-NEXT: sllw a0, a0, a4345; RV64IA-ZACAS-NEXT: sllw a1, a1, a4346; RV64IA-ZACAS-NEXT: sllw a2, a2, a4347; RV64IA-ZACAS-NEXT: .LBB3_1: # %do_cmpxchg348; RV64IA-ZACAS-NEXT: # =>This Loop Header: Depth=1349; RV64IA-ZACAS-NEXT: # Child Loop BB3_3 Depth 2350; RV64IA-ZACAS-NEXT: .LBB3_3: # %do_cmpxchg351; RV64IA-ZACAS-NEXT: # Parent Loop BB3_1 Depth=1352; RV64IA-ZACAS-NEXT: # => This Inner Loop Header: Depth=2353; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a3)354; RV64IA-ZACAS-NEXT: and a5, a4, a0355; RV64IA-ZACAS-NEXT: bne a5, a1, .LBB3_5356; RV64IA-ZACAS-NEXT: # %bb.4: # %do_cmpxchg357; RV64IA-ZACAS-NEXT: # in Loop: Header=BB3_3 Depth=2358; RV64IA-ZACAS-NEXT: xor a5, a4, a2359; RV64IA-ZACAS-NEXT: and a5, a5, a0360; RV64IA-ZACAS-NEXT: xor a5, a4, a5361; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a3)362; RV64IA-ZACAS-NEXT: bnez a5, .LBB3_3363; RV64IA-ZACAS-NEXT: .LBB3_5: # %do_cmpxchg364; RV64IA-ZACAS-NEXT: # in Loop: Header=BB3_1 Depth=1365; RV64IA-ZACAS-NEXT: and a4, a4, a0366; RV64IA-ZACAS-NEXT: beq a1, a4, .LBB3_1367; RV64IA-ZACAS-NEXT: # %bb.2: # %exit368; RV64IA-ZACAS-NEXT: ret369;370; RV64IA-ZABHA-LABEL: cmpxchg_masked_and_branch2:371; RV64IA-ZABHA: # %bb.0: # %entry372; RV64IA-ZABHA-NEXT: .LBB3_1: # %do_cmpxchg373; RV64IA-ZABHA-NEXT: # =>This Inner Loop Header: Depth=1374; RV64IA-ZABHA-NEXT: fence rw, rw375; RV64IA-ZABHA-NEXT: mv a3, a1376; RV64IA-ZABHA-NEXT: amocas.b.aqrl a3, a2, (a0)377; RV64IA-ZABHA-NEXT: beq a3, a1, .LBB3_1378; RV64IA-ZABHA-NEXT: # %bb.2: # %exit379; RV64IA-ZABHA-NEXT: ret380entry:381 br label %do_cmpxchg382do_cmpxchg:383 %0 = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst seq_cst384 %1 = extractvalue { i8, i1 } %0, 1385 br i1 %1, label %do_cmpxchg, label %exit386exit:387 ret void388}389 390define void @cmpxchg_and_irrelevant_branch(ptr %ptr, i32 signext %cmp, i32 signext %val, i1 zeroext %bool) nounwind {391; NOZACAS-LABEL: cmpxchg_and_irrelevant_branch:392; NOZACAS: # %bb.0: # %entry393; NOZACAS-NEXT: .LBB4_1: # %do_cmpxchg394; NOZACAS-NEXT: # =>This Loop Header: Depth=1395; NOZACAS-NEXT: # Child Loop BB4_3 Depth 2396; NOZACAS-NEXT: .LBB4_3: # %do_cmpxchg397; NOZACAS-NEXT: # Parent Loop BB4_1 Depth=1398; NOZACAS-NEXT: # => This Inner Loop Header: Depth=2399; NOZACAS-NEXT: lr.w.aqrl a4, (a0)400; NOZACAS-NEXT: bne a4, a1, .LBB4_5401; NOZACAS-NEXT: # %bb.4: # %do_cmpxchg402; NOZACAS-NEXT: # in Loop: Header=BB4_3 Depth=2403; NOZACAS-NEXT: sc.w.rl a5, a2, (a0)404; NOZACAS-NEXT: bnez a5, .LBB4_3405; NOZACAS-NEXT: .LBB4_5: # %do_cmpxchg406; NOZACAS-NEXT: # in Loop: Header=BB4_1 Depth=1407; NOZACAS-NEXT: beqz a3, .LBB4_1408; NOZACAS-NEXT: # %bb.2: # %exit409; NOZACAS-NEXT: ret410;411; ZACAS-LABEL: cmpxchg_and_irrelevant_branch:412; ZACAS: # %bb.0: # %entry413; ZACAS-NEXT: .LBB4_1: # %do_cmpxchg414; ZACAS-NEXT: # =>This Inner Loop Header: Depth=1415; ZACAS-NEXT: fence rw, rw416; ZACAS-NEXT: mv a4, a1417; ZACAS-NEXT: amocas.w.aqrl a4, a2, (a0)418; ZACAS-NEXT: beqz a3, .LBB4_1419; ZACAS-NEXT: # %bb.2: # %exit420; ZACAS-NEXT: ret421entry:422 br label %do_cmpxchg423do_cmpxchg:424 %0 = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst425 %1 = extractvalue { i32, i1 } %0, 1426 br i1 %bool, label %exit, label %do_cmpxchg427exit:428 ret void429}430