brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 87a315a Raw
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