1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

final patch for very long conditional branches for mips16 constant islands.

this completes the basic port of ARM constant islands to Mips16.
More testing, code review, cleanup is in order but basically everything
seems to be working. A bug in gas is preventing some of the runtime
testing but I hope to resolve this soon.

llvm-svn: 196331
This commit is contained in:
Reed Kotler 2013-12-03 23:42:51 +00:00
parent 63cd9136f2
commit 45b4f281f2
3 changed files with 327 additions and 5 deletions

View File

@ -712,41 +712,49 @@ initializeFunctionInfo(const std::vector<MachineInstr*> &CPEMIs) {
isCond = false;
break;
case Mips::BeqzRxImm16:
UOpc=Mips::Bimm16;
Bits = 8;
Scale = 2;
isCond = true;
break;
case Mips::BeqzRxImmX16:
UOpc=Mips::Bimm16;
Bits = 16;
Scale = 2;
isCond = true;
break;
case Mips::BnezRxImm16:
UOpc=Mips::Bimm16;
Bits = 8;
Scale = 2;
isCond = true;
break;
case Mips::BnezRxImmX16:
UOpc=Mips::Bimm16;
Bits = 16;
Scale = 2;
isCond = true;
break;
case Mips::Bteqz16:
UOpc=Mips::Bimm16;
Bits = 8;
Scale = 2;
isCond = true;
break;
case Mips::BteqzX16:
UOpc=Mips::Bimm16;
Bits = 16;
Scale = 2;
isCond = true;
break;
case Mips::Btnez16:
UOpc=Mips::Bimm16;
Bits = 8;
Scale = 2;
isCond = true;
break;
case Mips::BtnezX16:
UOpc=Mips::Bimm16;
Bits = 16;
Scale = 2;
isCond = true;
@ -1617,7 +1625,7 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) {
MachineBasicBlock *MBB = MI->getParent();
MachineInstr *BMI = &MBB->back();
bool NeedSplit = (BMI != MI) || !BBHasFallthrough(MBB);
unsigned OppositeBranchOpcode=TII->getOppositeBranchOpc(Opcode);
++NumCBrFixed;
if (BMI != MI) {
@ -1636,7 +1644,7 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) {
if (isBBInRange(MI, NewDest, Br.MaxDisp)) {
DEBUG(dbgs() << " Invert Bcc condition and swap its destination with "
<< *BMI);
MI->setDesc(TII->get(TII->getOppositeBranchOpc(Opcode)));
MI->setDesc(TII->get(OppositeBranchOpcode));
BMI->getOperand(BMITargetOperand).setMBB(DestBB);
MI->getOperand(TargetOperand).setMBB(NewDest);
return true;
@ -1644,7 +1652,6 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) {
}
}
llvm_unreachable("unsupported range of unconditional branch");
if (NeedSplit) {
splitBlockBeforeInstr(MI);
@ -1663,8 +1670,14 @@ MipsConstantIslands::fixupConditionalBr(ImmBranch &Br) {
// Insert a new conditional branch and a new unconditional branch.
// Also update the ImmBranch as well as adding a new entry for the new branch.
BuildMI(MBB, DebugLoc(), TII->get(MI->getOpcode()))
if (MI->getNumExplicitOperands() == 2) {
BuildMI(MBB, DebugLoc(), TII->get(OppositeBranchOpcode))
.addReg(MI->getOperand(0).getReg())
.addMBB(NextBB);
}
else { BuildMI(MBB, DebugLoc(), TII->get(OppositeBranchOpcode))
.addMBB(NextBB);
}
Br.MI = &MBB->back();
BBInfo[MBB->getNumber()].Size += TII->GetInstSizeInBytes(&MBB->back());
BuildMI(MBB, DebugLoc(), TII->get(Br.UncondBr)).addMBB(DestBB);

View File

@ -0,0 +1,69 @@
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=static < %s | FileCheck %s -check-prefix=ci
@i = global i32 0, align 4
@j = common global i32 0, align 4
@k = common global i32 0, align 4
; Function Attrs: nounwind optsize
define i32 @foo() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
tail call void asm sideeffect ".space 1000", ""() #1, !srcloc !5
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 1004", ""() #1, !srcloc !6
br label %if.end
if.end: ; preds = %if.else, %if.then
%storemerge = phi i32 [ 1, %if.else ], [ 0, %if.then ]
store i32 %storemerge, i32* @i, align 4, !tbaa !1
ret i32 0
}
; ci: beqz $3, $BB0_2
; ci: # BB#1: # %if.else
; Function Attrs: nounwind optsize
define i32 @goo() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
tail call void asm sideeffect ".space 1000000", ""() #1, !srcloc !7
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 1000004", ""() #1, !srcloc !8
br label %if.end
if.end: ; preds = %if.else, %if.then
%storemerge = phi i32 [ 1, %if.else ], [ 0, %if.then ]
store i32 %storemerge, i32* @i, align 4, !tbaa !1
ret i32 0
}
; ci: bnez $3, $BB1_1 # 16 bit inst
; ci: jal $BB1_2 # branch
; ci: nop
; ci: $BB1_1: # %if.else
attributes #0 = { nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}
!5 = metadata !{i32 58}
!6 = metadata !{i32 108}
!7 = metadata !{i32 190}
!8 = metadata !{i32 243}

240
test/CodeGen/Mips/lcb5.ll Normal file
View File

@ -0,0 +1,240 @@
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=static < %s | FileCheck %s -check-prefix=ci
@i = global i32 0, align 4
@j = common global i32 0, align 4
@k = common global i32 0, align 4
; Function Attrs: nounwind optsize
define i32 @x0() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
tail call void asm sideeffect ".space 1000", ""() #1, !srcloc !5
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 1004", ""() #1, !srcloc !6
br label %if.end
if.end: ; preds = %if.else, %if.then
%storemerge = phi i32 [ 1, %if.else ], [ 0, %if.then ]
store i32 %storemerge, i32* @i, align 4, !tbaa !1
ret i32 0
}
; ci: .ent x0
; ci: beqz $3, $BB0_2
; ci: $BB0_2:
; ci: .end x0
; Function Attrs: nounwind optsize
define i32 @x1() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
tail call void asm sideeffect ".space 1000000", ""() #1, !srcloc !7
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 1000004", ""() #1, !srcloc !8
br label %if.end
if.end: ; preds = %if.else, %if.then
%storemerge = phi i32 [ 1, %if.else ], [ 0, %if.then ]
store i32 %storemerge, i32* @i, align 4, !tbaa !1
ret i32 0
}
; ci: .ent x1
; ci: bnez $3, $BB1_1 # 16 bit inst
; ci: jal $BB1_2 # branch
; ci: nop
; ci: $BB1_1:
; ci: .end x1
; Function Attrs: nounwind optsize
define i32 @y0() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 10, i32* @j, align 4, !tbaa !1
tail call void asm sideeffect ".space 1000", ""() #1, !srcloc !9
br label %if.end
if.else: ; preds = %entry
store i32 55, i32* @j, align 4, !tbaa !1
tail call void asm sideeffect ".space 1004", ""() #1, !srcloc !10
br label %if.end
if.end: ; preds = %if.else, %if.then
ret i32 0
}
; ci: .ent y0
; ci: beqz $2, $BB2_2
; ci: .end y0
; Function Attrs: nounwind optsize
define i32 @y1() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%cmp = icmp eq i32 %0, 0
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 10, i32* @j, align 4, !tbaa !1
tail call void asm sideeffect ".space 1000000", ""() #1, !srcloc !11
br label %if.end
if.else: ; preds = %entry
store i32 55, i32* @j, align 4, !tbaa !1
tail call void asm sideeffect ".space 1000004", ""() #1, !srcloc !12
br label %if.end
if.end: ; preds = %if.else, %if.then
ret i32 0
}
; ci: .ent y1
; ci: bnez $2, $BB3_1 # 16 bit inst
; ci: jal $BB3_2 # branch
; ci: nop
; ci: $BB3_1:
; ci: .end y1
; Function Attrs: nounwind optsize
define void @z0() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%1 = load i32* @j, align 4, !tbaa !1
%cmp = icmp eq i32 %0, %1
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 1, i32* @k, align 4, !tbaa !1
tail call void asm sideeffect ".space 10000", ""() #1, !srcloc !13
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 10004", ""() #1, !srcloc !14
store i32 2, i32* @k, align 4, !tbaa !1
br label %if.end
if.end: ; preds = %if.else, %if.then
ret void
}
; ci: .ent z0
; ci: btnez $BB4_2
; ci: .end z0
; Function Attrs: nounwind optsize
define void @z1() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%1 = load i32* @j, align 4, !tbaa !1
%cmp = icmp eq i32 %0, %1
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 1, i32* @k, align 4, !tbaa !1
tail call void asm sideeffect ".space 10000000", ""() #1, !srcloc !15
br label %if.end
if.else: ; preds = %entry
tail call void asm sideeffect ".space 10000004", ""() #1, !srcloc !16
store i32 2, i32* @k, align 4, !tbaa !1
br label %if.end
if.end: ; preds = %if.else, %if.then
ret void
}
; ci: .ent z1
; ci: bteqz $BB5_1 # 16 bit inst
; ci: jal $BB5_2 # branch
; ci: nop
; ci: $BB5_1:
; ci: .end z1
; Function Attrs: nounwind optsize
define void @z3() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%1 = load i32* @j, align 4, !tbaa !1
%cmp1 = icmp sgt i32 %0, %1
br i1 %cmp1, label %if.then, label %if.end
if.then: ; preds = %entry, %if.then
tail call void asm sideeffect ".space 10000", ""() #1, !srcloc !17
%2 = load i32* @i, align 4, !tbaa !1
%3 = load i32* @j, align 4, !tbaa !1
%cmp = icmp sgt i32 %2, %3
br i1 %cmp, label %if.then, label %if.end
if.end: ; preds = %if.then, %entry
ret void
}
; ci: .ent z3
; ci: bteqz $BB6_2
; ci: .end z3
; Function Attrs: nounwind optsize
define void @z4() #0 {
entry:
%0 = load i32* @i, align 4, !tbaa !1
%1 = load i32* @j, align 4, !tbaa !1
%cmp1 = icmp sgt i32 %0, %1
br i1 %cmp1, label %if.then, label %if.end
if.then: ; preds = %entry, %if.then
tail call void asm sideeffect ".space 10000000", ""() #1, !srcloc !18
%2 = load i32* @i, align 4, !tbaa !1
%3 = load i32* @j, align 4, !tbaa !1
%cmp = icmp sgt i32 %2, %3
br i1 %cmp, label %if.then, label %if.end
if.end: ; preds = %if.then, %entry
ret void
}
; ci: .ent z4
; ci: btnez $BB7_1 # 16 bit inst
; ci: jal $BB7_2 # branch
; ci: nop
; ci: .align 2
; ci: $BB7_1:
; ci: .end z4
attributes #0 = { nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}
!5 = metadata !{i32 57}
!6 = metadata !{i32 107}
!7 = metadata !{i32 188}
!8 = metadata !{i32 241}
!9 = metadata !{i32 338}
!10 = metadata !{i32 391}
!11 = metadata !{i32 477}
!12 = metadata !{i32 533}
!13 = metadata !{i32 621}
!14 = metadata !{i32 663}
!15 = metadata !{i32 747}
!16 = metadata !{i32 792}
!17 = metadata !{i32 867}
!18 = metadata !{i32 953}