218 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -debugify-and-strip-all-safe < %s -O3 -mtriple=aarch64 -verify-machineinstrs | FileCheck %s3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"5target triple = "aarch64"6 7; CMN is an alias of ADDS.8 9define void @test_add_cbz(i32 %a, i32 %b, ptr %ptr) {10; CHECK-LABEL: test_add_cbz:11; CHECK: // %bb.0: // %common.ret12; CHECK-NEXT: cmn w0, w113; CHECK-NEXT: cset w8, eq14; CHECK-NEXT: str w8, [x2]15; CHECK-NEXT: ret16 %c = add nsw i32 %a, %b17 %d = icmp ne i32 %c, 018 br i1 %d, label %L1, label %L219L1:20 store i32 0, ptr %ptr, align 421 ret void22L2:23 store i32 1, ptr %ptr, align 424 ret void25}26 27define void @test_add_cbz_multiple_use(i32 %a, i32 %b, ptr %ptr) {28; CHECK-LABEL: test_add_cbz_multiple_use:29; CHECK: // %bb.0: // %common.ret30; CHECK-NEXT: adds w8, w0, w131; CHECK-NEXT: mov w9, #10 // =0xa32; CHECK-NEXT: csel w8, w9, w8, ne33; CHECK-NEXT: str w8, [x2]34; CHECK-NEXT: ret35 %c = add nsw i32 %a, %b36 %d = icmp ne i32 %c, 037 br i1 %d, label %L1, label %L238L1:39 store i32 10, ptr %ptr, align 440 ret void41L2:42 store i32 %c, ptr %ptr, align 443 ret void44}45 46define void @test_add_cbz_64(i64 %a, i64 %b, ptr %ptr) {47; CHECK-LABEL: test_add_cbz_64:48; CHECK: // %bb.0: // %common.ret49; CHECK-NEXT: cmn x0, x150; CHECK-NEXT: cset w8, eq51; CHECK-NEXT: str x8, [x2]52; CHECK-NEXT: ret53 %c = add nsw i64 %a, %b54 %d = icmp ne i64 %c, 055 br i1 %d, label %L1, label %L256L1:57 store i64 0, ptr %ptr, align 458 ret void59L2:60 store i64 1, ptr %ptr, align 461 ret void62}63 64define void @test_and_cbz(i32 %a, ptr %ptr) {65; CHECK-LABEL: test_and_cbz:66; CHECK: // %bb.0: // %common.ret67; CHECK-NEXT: tst w0, #0x668; CHECK-NEXT: cset w8, eq69; CHECK-NEXT: str w8, [x1]70; CHECK-NEXT: ret71 %c = and i32 %a, 672 %d = icmp ne i32 %c, 073 br i1 %d, label %L1, label %L274L1:75 store i32 0, ptr %ptr, align 476 ret void77L2:78 store i32 1, ptr %ptr, align 479 ret void80}81 82define void @test_bic_cbnz(i32 %a, i32 %b, ptr %ptr) {83; CHECK-LABEL: test_bic_cbnz:84; CHECK: // %bb.0: // %common.ret85; CHECK-NEXT: bics wzr, w1, w086; CHECK-NEXT: cset w8, ne87; CHECK-NEXT: str w8, [x2]88; CHECK-NEXT: ret89 %c = and i32 %a, %b90 %d = icmp eq i32 %c, %b91 br i1 %d, label %L1, label %L292L1:93 store i32 0, ptr %ptr, align 494 ret void95L2:96 store i32 1, ptr %ptr, align 497 ret void98}99 100define void @test_add_tbz(i32 %a, i32 %b, ptr %ptr) {101; CHECK-LABEL: test_add_tbz:102; CHECK: // %bb.0: // %entry103; CHECK-NEXT: adds w8, w0, w1104; CHECK-NEXT: b.pl .LBB5_2105; CHECK-NEXT: // %bb.1: // %L1106; CHECK-NEXT: str w8, [x2]107; CHECK-NEXT: .LBB5_2: // %L2108; CHECK-NEXT: ret109entry:110 %add = add nsw i32 %a, %b111 %cmp36 = icmp sge i32 %add, 0112 br i1 %cmp36, label %L2, label %L1113L1:114 store i32 %add, ptr %ptr, align 8115 br label %L2116L2:117 ret void118}119 120define void @test_subs_tbz(i32 %a, i32 %b, ptr %ptr) {121; CHECK-LABEL: test_subs_tbz:122; CHECK: // %bb.0: // %entry123; CHECK-NEXT: subs w8, w0, w1124; CHECK-NEXT: b.pl .LBB6_2125; CHECK-NEXT: // %bb.1: // %L1126; CHECK-NEXT: str w8, [x2]127; CHECK-NEXT: .LBB6_2: // %L2128; CHECK-NEXT: ret129entry:130 %sub = sub nsw i32 %a, %b131 %cmp36 = icmp sge i32 %sub, 0132 br i1 %cmp36, label %L2, label %L1133L1:134 store i32 %sub, ptr %ptr, align 8135 br label %L2136L2:137 ret void138}139 140define void @test_add_tbnz(i32 %a, i32 %b, ptr %ptr) {141; CHECK-LABEL: test_add_tbnz:142; CHECK: // %bb.0: // %entry143; CHECK-NEXT: adds w8, w0, w1144; CHECK-NEXT: b.mi .LBB7_2145; CHECK-NEXT: // %bb.1: // %L1146; CHECK-NEXT: str w8, [x2]147; CHECK-NEXT: .LBB7_2: // %L2148; CHECK-NEXT: ret149entry:150 %add = add nsw i32 %a, %b151 %cmp36 = icmp slt i32 %add, 0152 br i1 %cmp36, label %L2, label %L1153L1:154 store i32 %add, ptr %ptr, align 8155 br label %L2156L2:157 ret void158}159 160define void @test_subs_tbnz(i32 %a, i32 %b, ptr %ptr) {161; CHECK-LABEL: test_subs_tbnz:162; CHECK: // %bb.0: // %entry163; CHECK-NEXT: subs w8, w0, w1164; CHECK-NEXT: b.mi .LBB8_2165; CHECK-NEXT: // %bb.1: // %L1166; CHECK-NEXT: str w8, [x2]167; CHECK-NEXT: .LBB8_2: // %L2168; CHECK-NEXT: ret169entry:170 %sub = sub nsw i32 %a, %b171 %cmp36 = icmp slt i32 %sub, 0172 br i1 %cmp36, label %L2, label %L1173L1:174 store i32 %sub, ptr %ptr, align 8175 br label %L2176L2:177 ret void178}179 180declare void @foo()181declare void @bar(i32)182 183; Don't transform since the call will clobber the NZCV bits.184define void @test_call_clobber(i32 %unused, i32 %a) uwtable {185; CHECK-LABEL: test_call_clobber:186; CHECK: // %bb.0: // %entry187; CHECK-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill188; CHECK-NEXT: .cfi_def_cfa_offset 16189; CHECK-NEXT: .cfi_offset w19, -8190; CHECK-NEXT: .cfi_offset w30, -16191; CHECK-NEXT: .cfi_remember_state192; CHECK-NEXT: and w19, w1, #0x6193; CHECK-NEXT: mov w0, w19194; CHECK-NEXT: bl bar195; CHECK-NEXT: cbnz w19, .LBB9_2196; CHECK-NEXT: // %bb.1: // %if.end197; CHECK-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload198; CHECK-NEXT: .cfi_def_cfa_offset 0199; CHECK-NEXT: .cfi_restore w19200; CHECK-NEXT: .cfi_restore w30201; CHECK-NEXT: ret202; CHECK-NEXT: .LBB9_2: // %if.then203; CHECK-NEXT: .cfi_restore_state204; CHECK-NEXT: bl foo205entry:206 %c = and i32 %a, 6207 call void @bar(i32 %c)208 %tobool = icmp eq i32 %c, 0209 br i1 %tobool, label %if.end, label %if.then210 211if.then:212 tail call void @foo()213 unreachable214 215if.end:216 ret void217}218