1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -O0 < %s | FileCheck %s -check-prefix=None 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=pic < %s | \ 3*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=Default 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -O1 -relocation-model=static < %s | \ 5*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=STATICO1 6*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -disable-mips-df-forward-search=false \ 7*9880d681SAndroid Build Coastguard Worker; RUN: -relocation-model=static < %s | FileCheck %s -check-prefix=FORWARD 8*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -disable-mips-df-backward-search -relocation-model=pic \ 9*9880d681SAndroid Build Coastguard Worker; RUN: -disable-mips-df-succbb-search=false -disable-preheader-prot=true < %s | \ 10*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=SUCCBB 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @foo1() nounwind { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker; Default: jalr 15*9880d681SAndroid Build Coastguard Worker; Default-NOT: nop 16*9880d681SAndroid Build Coastguard Worker; Default: jr 17*9880d681SAndroid Build Coastguard Worker; Default-NOT: nop 18*9880d681SAndroid Build Coastguard Worker; Default: .end 19*9880d681SAndroid Build Coastguard Worker; None: jalr 20*9880d681SAndroid Build Coastguard Worker; None: nop 21*9880d681SAndroid Build Coastguard Worker; None: jr 22*9880d681SAndroid Build Coastguard Worker; None: nop 23*9880d681SAndroid Build Coastguard Worker; None: .end 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker tail call void @foo2(i32 3) nounwind 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdeclare void @foo2(i32) 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; Check that cvt.d.w goes into jalr's delay slot. 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Workerdefine void @foo3(i32 %a) nounwind { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker; Default-LABEL: foo3: 36*9880d681SAndroid Build Coastguard Worker; Default: jalr 37*9880d681SAndroid Build Coastguard Worker; Default: cvt.d.w 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker %conv = sitofp i32 %a to double 40*9880d681SAndroid Build Coastguard Worker tail call void @foo4(double %conv) nounwind 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdeclare void @foo4(double) 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker@g2 = external global i32 47*9880d681SAndroid Build Coastguard Worker@g1 = external global i32 48*9880d681SAndroid Build Coastguard Worker@g3 = external global i32 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; Check that branch delay slot can be filled with an instruction with operand 51*9880d681SAndroid Build Coastguard Worker; $1. 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Worker; Default-LABEL: foo5: 54*9880d681SAndroid Build Coastguard Worker; Default-NOT: nop 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine void @foo5(i32 %a) nounwind { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @g2, align 4 59*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %a, 0 60*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerif.then: 63*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @g1, align 4 64*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %0 65*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* @g1, align 4 66*9880d681SAndroid Build Coastguard Worker br label %if.end 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerif.else: 69*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* @g3, align 4 70*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 %2, %0 71*9880d681SAndroid Build Coastguard Worker store i32 %sub, i32* @g3, align 4 72*9880d681SAndroid Build Coastguard Worker br label %if.end 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerif.end: 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; Check that delay slot filler can place mov.s or mov.d in delay slot. 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker; Default-LABEL: foo6: 81*9880d681SAndroid Build Coastguard Worker; Default-NOT: nop 82*9880d681SAndroid Build Coastguard Worker; Default: .end foo6 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine void @foo6(float %a0, double %a1) nounwind { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker tail call void @foo7(double %a1, float %a0) nounwind 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdeclare void @foo7(double, float) 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; Check that a store can move past other memory instructions. 93*9880d681SAndroid Build Coastguard Worker; 94*9880d681SAndroid Build Coastguard Worker; STATICO1-LABEL: foo8: 95*9880d681SAndroid Build Coastguard Worker; STATICO1: jalr ${{[0-9]+}} 96*9880d681SAndroid Build Coastguard Worker; STATICO1-NEXT: sw ${{[0-9]+}}, %lo(g1) 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker@foo9 = common global void ()* null, align 4 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine i32 @foo8(i32 %a) nounwind { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker store i32 %a, i32* @g1, align 4 103*9880d681SAndroid Build Coastguard Worker %0 = load void ()*, void ()** @foo9, align 4 104*9880d681SAndroid Build Coastguard Worker tail call void %0() nounwind 105*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @g1, align 4 106*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %a 107*9880d681SAndroid Build Coastguard Worker ret i32 %add 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; Test searchForward. Check that the second jal's slot is filled with another 111*9880d681SAndroid Build Coastguard Worker; instruction in the same block. 112*9880d681SAndroid Build Coastguard Worker; 113*9880d681SAndroid Build Coastguard Worker; FORWARD-LABEL: foo10: 114*9880d681SAndroid Build Coastguard Worker; FORWARD: jal foo11 115*9880d681SAndroid Build Coastguard Worker; FORWARD: jal foo11 116*9880d681SAndroid Build Coastguard Worker; FORWARD-NOT: nop 117*9880d681SAndroid Build Coastguard Worker; FORWARD: end foo10 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine void @foo10() nounwind { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker tail call void @foo11() nounwind 122*9880d681SAndroid Build Coastguard Worker tail call void @foo11() nounwind 123*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @g1, align 4 124*9880d681SAndroid Build Coastguard Worker tail call void @foo11() nounwind 125*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @g1, align 4 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdeclare void @foo11() 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Check that delay slots of branches in both the entry block and loop body are 132*9880d681SAndroid Build Coastguard Worker; filled. 133*9880d681SAndroid Build Coastguard Worker; 134*9880d681SAndroid Build Coastguard Worker; SUCCBB-LABEL: succbbs_loop1: 135*9880d681SAndroid Build Coastguard Worker; SUCCBB: blez $5, $BB 136*9880d681SAndroid Build Coastguard Worker; SUCCBB-NEXT: addiu 137*9880d681SAndroid Build Coastguard Worker; SUCCBB: bnez ${{[0-9]+}}, $BB 138*9880d681SAndroid Build Coastguard Worker; SUCCBB-NEXT: addiu 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine i32 @succbbs_loop1(i32* nocapture %a, i32 %n) { 141*9880d681SAndroid Build Coastguard Workerentry: 142*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp sgt i32 %n, 0 143*9880d681SAndroid Build Coastguard Worker br i1 %cmp4, label %for.body, label %for.end 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 146*9880d681SAndroid Build Coastguard Worker %s.06 = phi i32 [ %add, %for.body ], [ 0, %entry ] 147*9880d681SAndroid Build Coastguard Worker %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 148*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i32 %i.05 149*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 150*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %s.06 151*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.05, 1 152*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, %n 153*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body, %entry 156*9880d681SAndroid Build Coastguard Worker %s.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ] 157*9880d681SAndroid Build Coastguard Worker ret i32 %s.0.lcssa 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; Check that the first branch has its slot filled. 161*9880d681SAndroid Build Coastguard Worker; 162*9880d681SAndroid Build Coastguard Worker; SUCCBB-LABEL: succbbs_br1: 163*9880d681SAndroid Build Coastguard Worker; SUCCBB: beqz ${{[0-9]+}}, $BB 164*9880d681SAndroid Build Coastguard Worker; SUCCBB-NEXT: lw ${{[0-9]+}}, %got(foo101)(${{[0-9]+}}) 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine internal fastcc void @foo101() { 167*9880d681SAndroid Build Coastguard Workerentry: 168*9880d681SAndroid Build Coastguard Worker tail call void @foo100() 169*9880d681SAndroid Build Coastguard Worker tail call void @foo100() 170*9880d681SAndroid Build Coastguard Worker ret void 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine void @succbbs_br1(i32 %a) { 174*9880d681SAndroid Build Coastguard Workerentry: 175*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %a, 0 176*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 179*9880d681SAndroid Build Coastguard Worker tail call fastcc void @foo101() 180*9880d681SAndroid Build Coastguard Worker br label %if.end 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 183*9880d681SAndroid Build Coastguard Worker ret void 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdeclare void @foo100() 187