brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 767ef7e Raw
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