1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=sparcv9 -disable-sparc-leaf-proc | FileCheck %s 3 4;; 1. When emitting code for v9, CCR branches should always explicitly specify 5;; %icc or %xcc. 6;; 2. Branches on the result of a 64-bit compare with constant zero should be 7;; lowered into an instruction in the BPr class (§A.3 in V9 spec). 8;; 3. There should never be a `ba` that jumps into two instructions immediately 9;; following it. 10 11define void @bricc(i32 signext %sel) { 12; CHECK-LABEL: bricc: 13; CHECK: .cfi_startproc 14; CHECK-NEXT: ! %bb.0: ! %entry 15; CHECK-NEXT: save %sp, -176, %sp 16; CHECK-NEXT: .cfi_def_cfa_register %fp 17; CHECK-NEXT: .cfi_window_save 18; CHECK-NEXT: .cfi_register %o7, %i7 19; CHECK-NEXT: cmp %i0, 0 20; CHECK-NEXT: be %icc, .LBB0_2 21; CHECK-NEXT: nop 22; CHECK-NEXT: ! %bb.1: ! %fbb 23; CHECK-NEXT: call f2 24; CHECK-NEXT: nop 25; CHECK-NEXT: ba .LBB0_3 26; CHECK-NEXT: nop 27; CHECK-NEXT: .LBB0_2: ! %tbb 28; CHECK-NEXT: call f1 29; CHECK-NEXT: nop 30; CHECK-NEXT: .LBB0_3: ! %end 31; CHECK-NEXT: call f3 32; CHECK-NEXT: nop 33; CHECK-NEXT: ret 34; CHECK-NEXT: restore 35entry: 36 %cond = icmp eq i32 %sel, 0 37 br i1 %cond, label %tbb, label %fbb 38 39fbb: 40 call void @f2() 41 br label %end 42 43tbb: 44 call void @f1() 45 br label %end 46 47end: 48 call void @f3() 49 ret void 50} 51 52define void @brxcc(i64 %sel) { 53; CHECK-LABEL: brxcc: 54; CHECK: .cfi_startproc 55; CHECK-NEXT: ! %bb.0: ! %entry 56; CHECK-NEXT: save %sp, -176, %sp 57; CHECK-NEXT: .cfi_def_cfa_register %fp 58; CHECK-NEXT: .cfi_window_save 59; CHECK-NEXT: .cfi_register %o7, %i7 60; CHECK-NEXT: cmp %i0, 1 61; CHECK-NEXT: bne %xcc, .LBB1_2 62; CHECK-NEXT: nop 63; CHECK-NEXT: ! %bb.1: ! %tbb 64; CHECK-NEXT: call f1 65; CHECK-NEXT: nop 66; CHECK-NEXT: ba .LBB1_3 67; CHECK-NEXT: nop 68; CHECK-NEXT: .LBB1_2: ! %fbb 69; CHECK-NEXT: call f2 70; CHECK-NEXT: nop 71; CHECK-NEXT: .LBB1_3: ! %end 72; CHECK-NEXT: call f3 73; CHECK-NEXT: nop 74; CHECK-NEXT: ret 75; CHECK-NEXT: restore 76entry: 77 ;; Using 1 here because compares with zero 78 ;; will be lowered into a `brz`, not `be`. 79 %cond = icmp eq i64 %sel, 1 80 br i1 %cond, label %tbb, label %fbb 81 82fbb: 83 call void @f2() 84 br label %end 85 86tbb: 87 call void @f1() 88 br label %end 89 90end: 91 call void @f3() 92 ret void 93} 94 95define void @brreg(i64 %sel) { 96; CHECK-LABEL: brreg: 97; CHECK: .cfi_startproc 98; CHECK-NEXT: ! %bb.0: ! %entry 99; CHECK-NEXT: save %sp, -176, %sp 100; CHECK-NEXT: .cfi_def_cfa_register %fp 101; CHECK-NEXT: .cfi_window_save 102; CHECK-NEXT: .cfi_register %o7, %i7 103; CHECK-NEXT: brz %i0, .LBB2_2 104; CHECK-NEXT: nop 105; CHECK-NEXT: ! %bb.1: ! %fbb 106; CHECK-NEXT: call f2 107; CHECK-NEXT: nop 108; CHECK-NEXT: ba .LBB2_3 109; CHECK-NEXT: nop 110; CHECK-NEXT: .LBB2_2: ! %tbb 111; CHECK-NEXT: call f1 112; CHECK-NEXT: nop 113; CHECK-NEXT: .LBB2_3: ! %end 114; CHECK-NEXT: call f3 115; CHECK-NEXT: nop 116; CHECK-NEXT: ret 117; CHECK-NEXT: restore 118entry: 119 %cond = icmp eq i64 %sel, 0 120 br i1 %cond, label %tbb, label %fbb 121 122fbb: 123 call void @f2() 124 br label %end 125 126tbb: 127 call void @f1() 128 br label %end 129 130end: 131 call void @f3() 132 ret void 133} 134 135declare void @f1(...) 136 137declare void @f2(...) 138 139declare void @f3(...) 140 141