Skip to content

Commit

Permalink
Mostly finish up constant islands port for Mips for load constants.
Browse files Browse the repository at this point in the history
Still need to finish the branch part. Still lots more review of the code,
clean up and testing. 



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194337 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Reed Kotler committed Nov 10, 2013
1 parent 1343fbc commit 50d3b27
Show file tree
Hide file tree
Showing 4 changed files with 364 additions and 67 deletions.
23 changes: 20 additions & 3 deletions lib/Target/Mips/MipsConstantIslandPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ static cl::opt<int> ConstantIslandsSmallOffset(
cl::desc("Make small offsets be this amount for testing purposes"),
cl::Hidden);

//
// For testing purposes we tell it to not use relaxed load forms so that it
// will split blocks.
//
static cl::opt<bool> NoLoadRelaxation(
"mips-constant-islands-no-load-relaxation",
cl::init(false),
cl::desc("Don't relax loads to long loads - for testing purposes"),
cl::Hidden);


namespace {

Expand Down Expand Up @@ -169,6 +179,9 @@ namespace {
ConstantIslandsSmallOffset: MaxDisp;
return xMaxDisp;
}
void setMaxDisp(unsigned val) {
MaxDisp = val;
}
unsigned getLongFormMaxDisp() const {
return LongFormMaxDisp;
}
Expand Down Expand Up @@ -615,6 +628,8 @@ initializeFunctionInfo(const std::vector<MachineInstr*> &CPEMIs) {
Bits = 8;
Scale = 4;
LongFormOpcode = Mips::LwRxPcTcpX16;
LongFormBits = 16;
LongFormScale = 1;
break;
case Mips::LwRxPcTcpX16:
Bits = 16;
Expand Down Expand Up @@ -977,6 +992,7 @@ int MipsConstantIslands::findLongFormInRangeCPEntry
true)) {
DEBUG(dbgs() << "In range\n");
UserMI->setDesc(TII->get(U.getLongFormOpcode()));
U.setMaxDisp(U.getLongFormMaxDisp());
return 2; // instruction is longer length now
}

Expand Down Expand Up @@ -1214,9 +1230,10 @@ bool MipsConstantIslands::handleConstantPoolUser(unsigned CPUserIndex) {
// No water found.
// we first see if a longer form of the instrucion could have reached
// the constant. in that case we won't bother to split
#ifdef IN_PROGRESS
result = findLongFormInRangeCPEntry(U, UserOffset);
#endif
if (!NoLoadRelaxation) {
result = findLongFormInRangeCPEntry(U, UserOffset);
if (result != 0) return true;
}
DEBUG(dbgs() << "No water found\n");
createNewWater(CPUserIndex, UserOffset, NewMBB);

Expand Down
64 changes: 0 additions & 64 deletions test/CodeGen/Mips/const4.ll

This file was deleted.

180 changes: 180 additions & 0 deletions test/CodeGen/Mips/const4a.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic -mips16-constant-islands -mips-constant-islands-no-load-relaxation < %s | FileCheck %s -check-prefix=no-load-relax

; ModuleID = 'const4.c'
target datalayout = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64"
target triple = "mips--linux-gnu"

@i = common global i32 0, align 4
@b = common global i32 0, align 4
@j = common global i32 0, align 4
@k = common global i32 0, align 4
@l = common global i32 0, align 4

; Function Attrs: nounwind
define void @t() #0 {
entry:
store i32 -559023410, i32* @i, align 4
%0 = load i32* @b, align 4
; no-load-relax lw ${{[0-9]+}}, $CPI0_1 # 16 bit inst
%tobool = icmp ne i32 %0, 0
br i1 %tobool, label %if.then, label %if.else
; no-load-relax: beqz ${{[0-9]+}}, $BB0_3
; no-load-relax: lw ${{[0-9]+}}, %call16(foo)(${{[0-9]+}})
; no-load-relax: b $BB0_4
; no-load-relax: .align 2
; no-load-relax: $CPI0_0:
; no-load-relax: .4byte 3735943886
; no-load-relax: $BB0_3:
; no-load-relax: lw ${{[0-9]+}}, %call16(goo)(${{[0-9]+}})
if.then: ; preds = %entry
call void bitcast (void (...)* @foo to void ()*)()
br label %if.end

if.else: ; preds = %entry
call void bitcast (void (...)* @goo to void ()*)()
br label %if.end

if.end: ; preds = %if.else, %if.then
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
call void bitcast (void (...)* @hoo to void ()*)()
ret void
}

declare void @foo(...) #1

declare void @goo(...) #1

declare void @hoo(...) #1

attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" }

!llvm.ident = !{!0}

!0 = metadata !{metadata !"clang version 3.4 ([email protected]:clang.git b310439121c875937d78cc49cc969bc1197fc025) ([email protected]:llvm.git 7fc0ca9656ebec8dad61f72f5a5ddfb232c070fd)"}
Loading

0 comments on commit 50d3b27

Please sign in to comment.