296 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-apple-ios7.0 -aarch64-enable-sink-fold=true -o - %s | FileCheck %s3; RUN: llc -mtriple=aarch64-apple-ios7.0 -mattr=+outline-atomics -aarch64-enable-sink-fold=true -o - %s | FileCheck %s --check-prefix=OUTLINE-ATOMICS4 5define i32 @test_return(ptr %p, i32 %oldval, i32 %newval) {6; CHECK-LABEL: test_return:7; CHECK: ; %bb.0:8; CHECK-NEXT: LBB0_1: ; %cmpxchg.start9; CHECK-NEXT: ; =>This Inner Loop Header: Depth=110; CHECK-NEXT: ldaxr w8, [x0]11; CHECK-NEXT: cmp w8, w112; CHECK-NEXT: b.ne LBB0_413; CHECK-NEXT: ; %bb.2: ; %cmpxchg.trystore14; CHECK-NEXT: ; in Loop: Header=BB0_1 Depth=115; CHECK-NEXT: stlxr w8, w2, [x0]16; CHECK-NEXT: cbnz w8, LBB0_117; CHECK-NEXT: ; %bb.3:18; CHECK-NEXT: mov w0, #1 ; =0x119; CHECK-NEXT: ret20; CHECK-NEXT: LBB0_4: ; %cmpxchg.nostore21; CHECK-NEXT: mov w0, wzr22; CHECK-NEXT: clrex23; CHECK-NEXT: ret24;25; OUTLINE-ATOMICS-LABEL: test_return:26; OUTLINE-ATOMICS: ; %bb.0:27; OUTLINE-ATOMICS-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill28; OUTLINE-ATOMICS-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill29; OUTLINE-ATOMICS-NEXT: .cfi_def_cfa_offset 3230; OUTLINE-ATOMICS-NEXT: .cfi_offset w30, -831; OUTLINE-ATOMICS-NEXT: .cfi_offset w29, -1632; OUTLINE-ATOMICS-NEXT: .cfi_offset w19, -2433; OUTLINE-ATOMICS-NEXT: .cfi_offset w20, -3234; OUTLINE-ATOMICS-NEXT: mov x8, x035; OUTLINE-ATOMICS-NEXT: mov w19, w136; OUTLINE-ATOMICS-NEXT: mov w0, w137; OUTLINE-ATOMICS-NEXT: mov w1, w238; OUTLINE-ATOMICS-NEXT: mov x2, x839; OUTLINE-ATOMICS-NEXT: bl ___aarch64_cas4_acq_rel40; OUTLINE-ATOMICS-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload41; OUTLINE-ATOMICS-NEXT: cmp w0, w1942; OUTLINE-ATOMICS-NEXT: cset w0, eq43; OUTLINE-ATOMICS-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload44; OUTLINE-ATOMICS-NEXT: ret45 %pair = cmpxchg ptr %p, i32 %oldval, i32 %newval seq_cst seq_cst46 %success = extractvalue { i32, i1 } %pair, 147 %conv = zext i1 %success to i3248 ret i32 %conv49}50 51; FIXME: DAG combine should be able to deal with this EOR better.52define i1 @test_return_bool(ptr %value, i8 %oldValue, i8 %newValue) {53; CHECK-LABEL: test_return_bool:54; CHECK: ; %bb.0:55; CHECK-NEXT: and w8, w1, #0xff56; CHECK-NEXT: LBB1_1: ; %cmpxchg.start57; CHECK-NEXT: ; =>This Inner Loop Header: Depth=158; CHECK-NEXT: ldaxrb w9, [x0]59; CHECK-NEXT: cmp w9, w860; CHECK-NEXT: b.ne LBB1_461; CHECK-NEXT: ; %bb.2: ; %cmpxchg.trystore62; CHECK-NEXT: ; in Loop: Header=BB1_1 Depth=163; CHECK-NEXT: stlxrb w9, w2, [x0]64; CHECK-NEXT: cbnz w9, LBB1_165; CHECK-NEXT: ; %bb.3:66; CHECK-NEXT: mov w8, #1 ; =0x167; CHECK-NEXT: eor w0, w8, #0x168; CHECK-NEXT: ret69; CHECK-NEXT: LBB1_4: ; %cmpxchg.nostore70; CHECK-NEXT: eor w0, wzr, #0x171; CHECK-NEXT: clrex72; CHECK-NEXT: ret73;74; OUTLINE-ATOMICS-LABEL: test_return_bool:75; OUTLINE-ATOMICS: ; %bb.0:76; OUTLINE-ATOMICS-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill77; OUTLINE-ATOMICS-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill78; OUTLINE-ATOMICS-NEXT: .cfi_def_cfa_offset 3279; OUTLINE-ATOMICS-NEXT: .cfi_offset w30, -880; OUTLINE-ATOMICS-NEXT: .cfi_offset w29, -1681; OUTLINE-ATOMICS-NEXT: .cfi_offset w19, -2482; OUTLINE-ATOMICS-NEXT: .cfi_offset w20, -3283; OUTLINE-ATOMICS-NEXT: mov x8, x084; OUTLINE-ATOMICS-NEXT: mov w19, w185; OUTLINE-ATOMICS-NEXT: mov w0, w186; OUTLINE-ATOMICS-NEXT: mov w1, w287; OUTLINE-ATOMICS-NEXT: mov x2, x888; OUTLINE-ATOMICS-NEXT: bl ___aarch64_cas1_acq_rel89; OUTLINE-ATOMICS-NEXT: cmp w0, w19, uxtb90; OUTLINE-ATOMICS-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload91; OUTLINE-ATOMICS-NEXT: cset w8, eq92; OUTLINE-ATOMICS-NEXT: eor w0, w8, #0x193; OUTLINE-ATOMICS-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload94; OUTLINE-ATOMICS-NEXT: ret95 %pair = cmpxchg ptr %value, i8 %oldValue, i8 %newValue acq_rel monotonic96 %success = extractvalue { i8, i1 } %pair, 197 %failure = xor i1 %success, 198 ret i1 %failure99}100 101define void @test_conditional(ptr %p, i32 %oldval, i32 %newval) {102; CHECK-LABEL: test_conditional:103; CHECK: ; %bb.0:104; CHECK-NEXT: LBB2_1: ; %cmpxchg.start105; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1106; CHECK-NEXT: ldaxr w8, [x0]107; CHECK-NEXT: cmp w8, w1108; CHECK-NEXT: b.ne LBB2_4109; CHECK-NEXT: ; %bb.2: ; %cmpxchg.trystore110; CHECK-NEXT: ; in Loop: Header=BB2_1 Depth=1111; CHECK-NEXT: stlxr w8, w2, [x0]112; CHECK-NEXT: cbnz w8, LBB2_1113; CHECK-NEXT: ; %bb.3: ; %true114; CHECK-NEXT: b _bar115; CHECK-NEXT: LBB2_4: ; %cmpxchg.nostore116; CHECK-NEXT: clrex117; CHECK-NEXT: b _baz118;119; OUTLINE-ATOMICS-LABEL: test_conditional:120; OUTLINE-ATOMICS: ; %bb.0:121; OUTLINE-ATOMICS-NEXT: stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill122; OUTLINE-ATOMICS-NEXT: stp x29, x30, [sp, #16] ; 16-byte Folded Spill123; OUTLINE-ATOMICS-NEXT: .cfi_def_cfa_offset 32124; OUTLINE-ATOMICS-NEXT: .cfi_offset w30, -8125; OUTLINE-ATOMICS-NEXT: .cfi_offset w29, -16126; OUTLINE-ATOMICS-NEXT: .cfi_offset w19, -24127; OUTLINE-ATOMICS-NEXT: .cfi_offset w20, -32128; OUTLINE-ATOMICS-NEXT: mov x8, x0129; OUTLINE-ATOMICS-NEXT: mov w19, w1130; OUTLINE-ATOMICS-NEXT: mov w0, w1131; OUTLINE-ATOMICS-NEXT: mov w1, w2132; OUTLINE-ATOMICS-NEXT: mov x2, x8133; OUTLINE-ATOMICS-NEXT: bl ___aarch64_cas4_acq_rel134; OUTLINE-ATOMICS-NEXT: cmp w0, w19135; OUTLINE-ATOMICS-NEXT: b.ne LBB2_2136; OUTLINE-ATOMICS-NEXT: ; %bb.1: ; %true137; OUTLINE-ATOMICS-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload138; OUTLINE-ATOMICS-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload139; OUTLINE-ATOMICS-NEXT: b _bar140; OUTLINE-ATOMICS-NEXT: LBB2_2: ; %false141; OUTLINE-ATOMICS-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload142; OUTLINE-ATOMICS-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload143; OUTLINE-ATOMICS-NEXT: b _baz144 %pair = cmpxchg ptr %p, i32 %oldval, i32 %newval seq_cst seq_cst145 %success = extractvalue { i32, i1 } %pair, 1146 br i1 %success, label %true, label %false147 148true:149 tail call void @bar() #2150 br label %end151 152false:153 tail call void @baz() #2154 br label %end155 156end:157 ret void158}159 160declare void @bar()161declare void @baz()162 163; verify the preheader is simplified by simplifycfg.164define i1 @test_conditional2(i32 %a, i32 %b, ptr %c) {165; CHECK-LABEL: test_conditional2:166; CHECK: ; %bb.0: ; %entry167; CHECK-NEXT: stp x22, x21, [sp, #-48]! ; 16-byte Folded Spill168; CHECK-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill169; CHECK-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill170; CHECK-NEXT: .cfi_def_cfa_offset 48171; CHECK-NEXT: .cfi_offset w30, -8172; CHECK-NEXT: .cfi_offset w29, -16173; CHECK-NEXT: .cfi_offset w19, -24174; CHECK-NEXT: .cfi_offset w20, -32175; CHECK-NEXT: .cfi_offset w21, -40176; CHECK-NEXT: .cfi_offset w22, -48177; CHECK-NEXT: mov x19, x2178; CHECK-NEXT: mov w20, w1179; CHECK-NEXT: mov w21, w0180; CHECK-NEXT: LBB3_1: ; %cmpxchg.start181; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1182; CHECK-NEXT: ldaxr w8, [x19]183; CHECK-NEXT: cmp w8, w21184; CHECK-NEXT: b.ne LBB3_9185; CHECK-NEXT: ; %bb.2: ; %cmpxchg.trystore186; CHECK-NEXT: ; in Loop: Header=BB3_1 Depth=1187; CHECK-NEXT: stlxr w8, w20, [x19]188; CHECK-NEXT: cbnz w8, LBB3_1189; CHECK-NEXT: ; %bb.3:190; CHECK-NEXT: mov w8, #1 ; =0x1191; CHECK-NEXT: LBB3_4: ; %for.cond.preheader192; CHECK-NEXT: mov w22, #2 ; =0x2193; CHECK-NEXT: LBB3_5: ; %for.cond194; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1195; CHECK-NEXT: cbz w22, LBB3_8196; CHECK-NEXT: ; %bb.6: ; %for.body197; CHECK-NEXT: ; in Loop: Header=BB3_5 Depth=1198; CHECK-NEXT: sub w22, w22, #1199; CHECK-NEXT: orr w9, w21, w20200; CHECK-NEXT: ldr w10, [x19, w22, sxtw #2]201; CHECK-NEXT: cmp w9, w10202; CHECK-NEXT: b.eq LBB3_5203; CHECK-NEXT: ; %bb.7: ; %if.then204; CHECK-NEXT: ; in Loop: Header=BB3_5 Depth=1205; CHECK-NEXT: str w9, [x19, w22, sxtw #2]206; CHECK-NEXT: bl _foo207; CHECK-NEXT: mov w8, wzr208; CHECK-NEXT: b LBB3_5209; CHECK-NEXT: LBB3_8: ; %for.cond.cleanup210; CHECK-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload211; CHECK-NEXT: and w0, w8, #0x1212; CHECK-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload213; CHECK-NEXT: ldp x22, x21, [sp], #48 ; 16-byte Folded Reload214; CHECK-NEXT: ret215; CHECK-NEXT: LBB3_9: ; %cmpxchg.nostore216; CHECK-NEXT: mov w8, wzr217; CHECK-NEXT: clrex218; CHECK-NEXT: b LBB3_4219;220; OUTLINE-ATOMICS-LABEL: test_conditional2:221; OUTLINE-ATOMICS: ; %bb.0: ; %entry222; OUTLINE-ATOMICS-NEXT: stp x22, x21, [sp, #-48]! ; 16-byte Folded Spill223; OUTLINE-ATOMICS-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill224; OUTLINE-ATOMICS-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill225; OUTLINE-ATOMICS-NEXT: .cfi_def_cfa_offset 48226; OUTLINE-ATOMICS-NEXT: .cfi_offset w30, -8227; OUTLINE-ATOMICS-NEXT: .cfi_offset w29, -16228; OUTLINE-ATOMICS-NEXT: .cfi_offset w19, -24229; OUTLINE-ATOMICS-NEXT: .cfi_offset w20, -32230; OUTLINE-ATOMICS-NEXT: .cfi_offset w21, -40231; OUTLINE-ATOMICS-NEXT: .cfi_offset w22, -48232; OUTLINE-ATOMICS-NEXT: mov x19, x2233; OUTLINE-ATOMICS-NEXT: mov w20, w1234; OUTLINE-ATOMICS-NEXT: mov w21, w0235; OUTLINE-ATOMICS-NEXT: bl ___aarch64_cas4_acq_rel236; OUTLINE-ATOMICS-NEXT: cmp w0, w21237; OUTLINE-ATOMICS-NEXT: mov w22, #2 ; =0x2238; OUTLINE-ATOMICS-NEXT: cset w8, eq239; OUTLINE-ATOMICS-NEXT: LBB3_1: ; %for.cond240; OUTLINE-ATOMICS-NEXT: ; =>This Inner Loop Header: Depth=1241; OUTLINE-ATOMICS-NEXT: cbz w22, LBB3_4242; OUTLINE-ATOMICS-NEXT: ; %bb.2: ; %for.body243; OUTLINE-ATOMICS-NEXT: ; in Loop: Header=BB3_1 Depth=1244; OUTLINE-ATOMICS-NEXT: sub w22, w22, #1245; OUTLINE-ATOMICS-NEXT: orr w9, w21, w20246; OUTLINE-ATOMICS-NEXT: ldr w10, [x19, w22, sxtw #2]247; OUTLINE-ATOMICS-NEXT: cmp w9, w10248; OUTLINE-ATOMICS-NEXT: b.eq LBB3_1249; OUTLINE-ATOMICS-NEXT: ; %bb.3: ; %if.then250; OUTLINE-ATOMICS-NEXT: ; in Loop: Header=BB3_1 Depth=1251; OUTLINE-ATOMICS-NEXT: str w9, [x19, w22, sxtw #2]252; OUTLINE-ATOMICS-NEXT: bl _foo253; OUTLINE-ATOMICS-NEXT: mov w8, wzr254; OUTLINE-ATOMICS-NEXT: b LBB3_1255; OUTLINE-ATOMICS-NEXT: LBB3_4: ; %for.cond.cleanup256; OUTLINE-ATOMICS-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload257; OUTLINE-ATOMICS-NEXT: and w0, w8, #0x1258; OUTLINE-ATOMICS-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload259; OUTLINE-ATOMICS-NEXT: ldp x22, x21, [sp], #48 ; 16-byte Folded Reload260; OUTLINE-ATOMICS-NEXT: ret261entry:262 %pair = cmpxchg ptr %c, i32 %a, i32 %b seq_cst seq_cst263 %success = extractvalue { i32, i1 } %pair, 1264 br label %for.cond265 266for.cond: ; preds = %if.end, %entry267 %i.0 = phi i32 [ 2, %entry ], [ %dec, %if.end ]268 %changed.0.off0 = phi i1 [ %success, %entry ], [ %changed.1.off0, %if.end ]269 %dec = add nsw i32 %i.0, -1270 %tobool = icmp eq i32 %i.0, 0271 br i1 %tobool, label %for.cond.cleanup, label %for.body272 273for.cond.cleanup: ; preds = %for.cond274 %changed.0.off0.lcssa = phi i1 [ %changed.0.off0, %for.cond ]275 ret i1 %changed.0.off0.lcssa276 277for.body: ; preds = %for.cond278 %or = or i32 %a, %b279 %idxprom = sext i32 %dec to i64280 %arrayidx = getelementptr inbounds i32, ptr %c, i64 %idxprom281 %0 = load i32, ptr %arrayidx, align 4282 %cmp = icmp eq i32 %or, %0283 br i1 %cmp, label %if.end, label %if.then284 285if.then: ; preds = %for.body286 store i32 %or, ptr %arrayidx, align 4287 tail call void @foo()288 br label %if.end289 290if.end: ; preds = %for.body, %if.then291 %changed.1.off0 = phi i1 [ false, %if.then ], [ %changed.0.off0, %for.body ]292 br label %for.cond293}294 295declare void @foo()296