213 lines · plain
1;RUN: llc -mtriple=sparc < %s -verify-machineinstrs | FileCheck %s2;RUN: llc -mtriple=sparc -O0 < %s -verify-machineinstrs | FileCheck %s -check-prefix=UNOPT3 4target triple = "sparc-unknown-linux-gnu"5 6define i32 @test(i32 %a) #0 {7entry:8; CHECK: test9; CHECK: call bar10; CHECK-NOT: nop11; CHECK: ret12; CHECK-NEXT: restore13 %0 = tail call i32 @bar(i32 %a) nounwind14 ret i32 %015}16 17define i32 @test_jmpl(ptr nocapture %f, i32 %a, i32 %b) #0 {18entry:19; CHECK: test_jmpl20; CHECK: call21; CHECK-NOT: nop22; CHECK: ret23; CHECK-NEXT: restore24 %0 = tail call i32 %f(i32 %a, i32 %b) nounwind25 ret i32 %026}27 28define i32 @test_loop(i32 %a, i32 %b) nounwind readnone {29; CHECK: test_loop30entry:31 %0 = icmp sgt i32 %b, 032 br i1 %0, label %bb, label %bb533 34bb: ; preds = %entry, %bb35 %a_addr.18 = phi i32 [ %a_addr.0, %bb ], [ %a, %entry ]36 %1 = phi i32 [ %3, %bb ], [ 0, %entry ]37 %tmp9 = mul i32 %1, %b38 %2 = and i32 %1, 139 %tmp = xor i32 %2, 140 %.pn = shl i32 %tmp9, %tmp41 %a_addr.0 = add i32 %.pn, %a_addr.1842 %3 = add nsw i32 %1, 143 %exitcond = icmp eq i32 %3, %b44;CHECK: cmp45;CHECK: bne46;CHECK-NOT: nop47 br i1 %exitcond, label %bb5, label %bb48 49bb5: ; preds = %bb, %entry50 %a_addr.1.lcssa = phi i32 [ %a, %entry ], [ %a_addr.0, %bb ]51;CHECK: retl52;CHECK-NOT: restore53 ret i32 %a_addr.1.lcssa54}55 56define i32 @test_inlineasm(i32 %a) #0 {57entry:58;CHECK-LABEL: test_inlineasm:59;CHECK: cmp60;CHECK: sethi61;CHECK: !NO_APP62;CHECK-NEXT: ble63;CHECK-NEXT: nop64 tail call void asm sideeffect "sethi 0, %g0", ""() nounwind65 %0 = icmp slt i32 %a, 066 br i1 %0, label %bb, label %bb167 68bb: ; preds = %entry69 %1 = tail call i32 (...) @foo(i32 %a) nounwind70 ret i32 %171 72bb1: ; preds = %entry73 %2 = tail call i32 @bar(i32 %a) nounwind74 ret i32 %275}76 77declare i32 @foo(...)78 79declare i32 @bar(i32)80 81 82define i32 @test_implicit_def() #0 {83entry:84;UNOPT-LABEL: test_implicit_def:85;UNOPT: call func86;UNOPT-NEXT: nop87 %0 = tail call i32 @func(ptr undef) nounwind88 ret i32 089}90 91define i32 @prevent_o7_in_call_delay_slot(i32 %i0) #0 {92entry:93;CHECK-LABEL: prevent_o7_in_call_delay_slot:94;CHECK: add %i0, 2, %o595;CHECK: add %i0, 3, %o796;CHECK: add %o5, %o7, %o097;CHECK: call bar98;CHECK-NEXT: nop99 %0 = add nsw i32 %i0, 2100 %1 = add nsw i32 %i0, 3101 tail call void asm sideeffect "", "r,r,~{l0},~{l1},~{l2},~{l3},~{l4},~{l5},~{l6},~{l7},~{i0},~{i1},~{i2},~{i3},~{i4},~{i5},~{i6},~{i7},~{o0},~{o1},~{o2},~{o3},~{o4},~{o6},~{g1},~{g2},~{g3},~{g4},~{g5},~{g6},~{g7}"(i32 %0, i32 %1)102 %2 = add nsw i32 %0, %1103 %3 = tail call i32 @bar(i32 %2)104 ret i32 %3105}106 107 108declare i32 @func(ptr)109 110 111define i32 @restore_add(i32 %a, i32 %b) {112entry:113;CHECK-LABEL: restore_add:114;CHECK: ret115;CHECK: restore %o0, %i1, %o0116 %0 = tail call i32 @bar(i32 %a) nounwind117 %1 = add nsw i32 %0, %b118 ret i32 %1119}120 121define i32 @restore_add_imm(i32 %a) {122entry:123;CHECK-LABEL: restore_add_imm:124;CHECK: ret125;CHECK: restore %o0, 20, %o0126 %0 = tail call i32 @bar(i32 %a) nounwind127 %1 = add nsw i32 %0, 20128 ret i32 %1129}130 131define i32 @restore_or(i32 %a) #0 {132entry:133;CHECK-LABEL: restore_or:134;CHECK: ret135;CHECK: restore %g0, %o0, %o0136 %0 = tail call i32 @bar(i32 %a) nounwind137 ret i32 %0138}139 140define i32 @restore_or_imm(i32 %a) {141entry:142;CHECK-LABEL: restore_or_imm:143;CHECK: or %o0, 20, %i0144;CHECK: ret145;CHECK-NOT: restore %g0, %g0, %g0146;CHECK: restore147 %0 = tail call i32 @bar(i32 %a) nounwind148 %1 = or i32 %0, 20149 ret i32 %1150}151 152 153define i32 @restore_sethi(i32 %a) {154entry:155;CHECK-LABEL: restore_sethi:156;CHECK-NOT: sethi 3157;CHECK: restore %g0, 3072, %o0158 %0 = tail call i32 @bar(i32 %a) nounwind159 %1 = icmp ne i32 %0, 0160 %2 = select i1 %1, i32 3072, i32 0161 ret i32 %2162}163 164define i32 @restore_sethi_3bit(i32 %a) {165entry:166;CHECK-LABEL: restore_sethi_3bit:167;CHECK: sethi 6168;CHECK-NOT: restore %g0, 6144, %o0169 %0 = tail call i32 @bar(i32 %a) nounwind170 %1 = icmp ne i32 %0, 0171 %2 = select i1 %1, i32 6144, i32 0172 ret i32 %2173}174 175define i32 @restore_sethi_large(i32 %a) {176entry:177;CHECK-LABEL: restore_sethi_large:178;CHECK: sethi 4000, %i0179;CHECK-NOT: restore %g0, %g0, %g0180;CHECK: restore181 %0 = tail call i32 @bar(i32 %a) nounwind182 %1 = icmp ne i32 %0, 0183 %2 = select i1 %1, i32 4096000, i32 0184 ret i32 %2185}186 187define i32 @test_generic_inst(i32 %arg) #0 {188;CHECK-LABEL: test_generic_inst:189;CHECK: ! fake_use: {{.*}}190;CHECK: bne {{.*}}191;CHECK-NEXT: nop192 %bar1 = call i32 @bar(i32 %arg)193 %even = and i32 %bar1, 1194 %cmp = icmp eq i32 %even, 0195 ; This shouldn't get reordered into a delay slot196 call void (...) @llvm.fake.use(i32 %arg)197 br i1 %cmp, label %true, label %false198true:199 %bar2 = call i32 @bar(i32 %bar1)200 br label %cont201 202false:203 %inc = add nsw i32 %bar1, 1204 br label %cont205 206cont:207 %ret = phi i32 [ %bar2, %true ], [ %inc, %false ]208 ret i32 %ret209}210 211declare void @llvm.fake.use(...)212attributes #0 = { nounwind "disable-tail-calls"="true" }213