X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2FCodeGen%2FMips%2Fbrdelayslot.ll;h=2deb037c9c3906077f8502697f9abe50e6f28bcb;hb=ae9f07e0b8332181e9a79cffc7dea99f3bc9bea8;hp=897fc9768f936043dbf13ab435895863755f1078;hpb=a032dbd62f46a40b2cf759ce0dd0ebd41ef0614c;p=oota-llvm.git diff --git a/test/CodeGen/Mips/brdelayslot.ll b/test/CodeGen/Mips/brdelayslot.ll index 897fc9768f9..2deb037c9c3 100644 --- a/test/CodeGen/Mips/brdelayslot.ll +++ b/test/CodeGen/Mips/brdelayslot.ll @@ -1,5 +1,12 @@ ; RUN: llc -march=mipsel -O0 < %s | FileCheck %s -check-prefix=None ; RUN: llc -march=mipsel < %s | FileCheck %s -check-prefix=Default +; RUN: llc -march=mipsel -O1 -relocation-model=static < %s | \ +; RUN: FileCheck %s -check-prefix=STATICO1 +; RUN: llc -march=mipsel -disable-mips-df-forward-search=false \ +; RUN: -relocation-model=static < %s | FileCheck %s -check-prefix=FORWARD +; RUN: llc -march=mipsel -disable-mips-df-backward-search \ +; RUN: -disable-mips-df-succbb-search=false < %s | \ +; RUN: FileCheck %s -check-prefix=SUCCBB define void @foo1() nounwind { entry: @@ -67,3 +74,105 @@ if.end: ret void } +; Check that delay slot filler can place mov.s or mov.d in delay slot. +; +; Default: foo6: +; Default-NOT: nop +; Default: .end foo6 + +define void @foo6(float %a0, double %a1) nounwind { +entry: + tail call void @foo7(double %a1, float %a0) nounwind + ret void +} + +declare void @foo7(double, float) + +; Check that a store can move past other memory instructions. +; +; STATICO1: foo8: +; STATICO1: jalr ${{[0-9]+}} +; STATICO1-NEXT: sw ${{[0-9]+}}, %lo(g1) + +@foo9 = common global void ()* null, align 4 + +define i32 @foo8(i32 %a) nounwind { +entry: + store i32 %a, i32* @g1, align 4 + %0 = load void ()** @foo9, align 4 + tail call void %0() nounwind + %1 = load i32* @g1, align 4 + %add = add nsw i32 %1, %a + ret i32 %add +} + +; Test searchForward. Check that the second jal's slot is filled with another +; instruction in the same block. +; +; FORWARD: foo10: +; FORWARD: jal foo11 +; FORWARD: jal foo11 +; FORWARD-NOT: nop +; FORWARD: end foo10 + +define void @foo10() nounwind { +entry: + tail call void @foo11() nounwind + tail call void @foo11() nounwind + store i32 0, i32* @g1, align 4 + tail call void @foo11() nounwind + store i32 0, i32* @g1, align 4 + ret void +} + +declare void @foo11() + +; Check that delay slots of branches in both the entry block and loop body are +; filled. +; +; SUCCBB: succbbs_loop1: +; SUCCBB: bne ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: addiu +; SUCCBB: bne ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: addiu + +define i32 @succbbs_loop1(i32* nocapture %a, i32 %n) { +entry: + %cmp4 = icmp sgt i32 %n, 0 + br i1 %cmp4, label %for.body, label %for.end + +for.body: ; preds = %entry, %for.body + %s.06 = phi i32 [ %add, %for.body ], [ 0, %entry ] + %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] + %arrayidx = getelementptr inbounds i32* %a, i32 %i.05 + %0 = load i32* %arrayidx, align 4 + %add = add nsw i32 %0, %s.06 + %inc = add nsw i32 %i.05, 1 + %exitcond = icmp eq i32 %inc, %n + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body, %entry + %s.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ] + ret i32 %s.0.lcssa +} + +; Check that the first branch has its slot filled. +; +; SUCCBB: succbbs_br1: +; SUCCBB: beq ${{[0-9]+}}, $zero, $BB +; SUCCBB-NEXT: lw $25, %call16(foo100) + +define void @succbbs_br1(i32 %a) { +entry: + %tobool = icmp eq i32 %a, 0 + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @foo100() #1 + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +} + +declare void @foo100()