123 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs < %s | FileCheck %s3; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=aarch64-linux %s | FileCheck --check-prefix=CHECK-CGP %s4; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -cgpp-huge-func=0 -mtriple=aarch64-linux %s | FileCheck --check-prefix=CHECK-CGP %s5 6@A = dso_local global i32 zeroinitializer7@B = dso_local global i32 zeroinitializer8@C = dso_local global i32 zeroinitializer9 10; Test that and is sunk into cmp block to form tbz.11define dso_local i32 @and_sink1(i32 %a, i1 %c) {12; CHECK-LABEL: and_sink1:13; CHECK: // %bb.0:14; CHECK-NEXT: tbz w1, #0, .LBB0_315; CHECK-NEXT: // %bb.1: // %bb016; CHECK-NEXT: adrp x8, A17; CHECK-NEXT: str wzr, [x8, :lo12:A]18; CHECK-NEXT: tbnz w0, #2, .LBB0_319; CHECK-NEXT: // %bb.2:20; CHECK-NEXT: mov w0, #1 // =0x121; CHECK-NEXT: ret22; CHECK-NEXT: .LBB0_3: // %bb223; CHECK-NEXT: mov w0, wzr24; CHECK-NEXT: ret25 26; CHECK-CGP-LABEL: @and_sink1(27; CHECK-CGP-NOT: and i3228 %and = and i32 %a, 429 br i1 %c, label %bb0, label %bb230bb0:31; CHECK-CGP-LABEL: bb0:32; CHECK-CGP: and i3233; CHECK-CGP-NEXT: icmp eq i3234; CHECK-CGP-NEXT: store35; CHECK-CGP-NEXT: br36 %cmp = icmp eq i32 %and, 037 store i32 0, ptr @A38 br i1 %cmp, label %bb1, label %bb239bb1:40 ret i32 141bb2:42 ret i32 043}44 45; Test that both 'and' and cmp get sunk to form tbz.46define dso_local i32 @and_sink2(i32 %a, i1 %c, i1 %c2) {47; CHECK-LABEL: and_sink2:48; CHECK: // %bb.0:49; CHECK-NEXT: adrp x8, A50; CHECK-NEXT: str wzr, [x8, :lo12:A]51; CHECK-NEXT: tbz w1, #0, .LBB1_552; CHECK-NEXT: // %bb.1: // %bb0.preheader53; CHECK-NEXT: adrp x8, B54; CHECK-NEXT: adrp x9, C55; CHECK-NEXT: .LBB1_2: // %bb056; CHECK-NEXT: // =>This Inner Loop Header: Depth=157; CHECK-NEXT: str wzr, [x8, :lo12:B]58; CHECK-NEXT: tbz w2, #0, .LBB1_559; CHECK-NEXT: // %bb.3: // %bb160; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=161; CHECK-NEXT: str wzr, [x9, :lo12:C]62; CHECK-NEXT: tbnz w0, #2, .LBB1_263; CHECK-NEXT: // %bb.4:64; CHECK-NEXT: mov w0, #1 // =0x165; CHECK-NEXT: ret66; CHECK-NEXT: .LBB1_5:67; CHECK-NEXT: mov w0, wzr68; CHECK-NEXT: ret69 70; CHECK-CGP-LABEL: @and_sink2(71; CHECK-CGP-NOT: and i3272 %and = and i32 %a, 473 store i32 0, ptr @A74 br i1 %c, label %bb0, label %bb375bb0:76; CHECK-CGP-LABEL: bb0:77; CHECK-CGP-NOT: and i3278; CHECK-CGP-NOT: icmp79 %cmp = icmp eq i32 %and, 080 store i32 0, ptr @B81 br i1 %c2, label %bb1, label %bb382bb1:83; CHECK-CGP-LABEL: bb1:84; CHECK-CGP: and i3285; CHECK-CGP-NEXT: icmp eq i3286; CHECK-CGP-NEXT: store87; CHECK-CGP-NEXT: br88 store i32 0, ptr @C89 br i1 %cmp, label %bb2, label %bb090bb2:91 ret i32 192bb3:93 ret i32 094}95 96; Test that 'and' is not sunk since cbz is a better alternative.97define dso_local i32 @and_sink3(i32 %a) {98; CHECK-LABEL: and_sink3:99; CHECK: // %bb.0:100; CHECK-NEXT: adrp x8, A101; CHECK-NEXT: and w9, w0, #0x3102; CHECK-NEXT: .LBB2_1: // %bb0103; CHECK-NEXT: // =>This Inner Loop Header: Depth=1104; CHECK-NEXT: str wzr, [x8, :lo12:A]105; CHECK-NEXT: cbz w9, .LBB2_1106; CHECK-NEXT: // %bb.2: // %bb2107; CHECK-NEXT: mov w0, wzr108; CHECK-NEXT: ret109 110; CHECK-CGP-LABEL: @and_sink3(111; CHECK-CGP-NEXT: and i32112 %and = and i32 %a, 3113 br label %bb0114bb0:115; CHECK-CGP-LABEL: bb0:116; CHECK-CGP-NOT: and i32117 %cmp = icmp eq i32 %and, 0118 store i32 0, ptr @A119 br i1 %cmp, label %bb0, label %bb2120bb2:121 ret i32 0122}123