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

Add soft-float to the key for the subtarget lookup in the TargetMachine

map, this makes sure that we can compile the same code for two different
ABIs (hard and soft float) in the same module.

Update one testcase accordingly (and fix some confusing naming) and
add a new testcase as well with the ordering swapped which would
highlight the problem.

llvm-svn: 218632
This commit is contained in:
Eric Christopher 2014-09-29 21:57:54 +00:00
parent 9cf7af11f4
commit dbc01e6de2
3 changed files with 64 additions and 7 deletions

View File

@ -105,12 +105,24 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
!FnAttrs.getAttribute(AttributeSet::FunctionIndex, "nomips16") !FnAttrs.getAttribute(AttributeSet::FunctionIndex, "nomips16")
.hasAttribute(Attribute::None); .hasAttribute(Attribute::None);
// FIXME: This is related to the code below to reset the target options,
// we need to know whether or not the soft float flag is set on the
// function before we can generate a subtarget. We also need to use
// it as a key for the subtarget since that can be the only difference
// between two functions.
Attribute SFAttr =
FnAttrs.getAttribute(AttributeSet::FunctionIndex, "use-soft-float");
bool softFloat = !SFAttr.hasAttribute(Attribute::None)
? (SFAttr.getValueAsString() == "true" ? true : false)
: Options.UseSoftFloat;
if (hasMips16Attr) if (hasMips16Attr)
FS += FS.empty() ? "+mips16" : ",+mips16"; FS += FS.empty() ? "+mips16" : ",+mips16";
else if (hasNoMips16Attr) else if (hasNoMips16Attr)
FS += FS.empty() ? "-mips16" : ",-mips16"; FS += FS.empty() ? "-mips16" : ",-mips16";
auto &I = SubtargetMap[CPU + FS]; auto &I = SubtargetMap[CPU + FS + (softFloat ? "use-soft-float=true"
: "use-soft-float=false")];
if (!I) { if (!I) {
// This needs to be done before we create a new subtarget since any // This needs to be done before we create a new subtarget since any
// creation will depend on the TM and the code generation flags on the // creation will depend on the TM and the code generation flags on the

View File

@ -0,0 +1,45 @@
; Check that stubs generation for mips16 hard-float mode does not depend
; on the function 'use-soft-float' attribute's value.
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel \
; RUN: -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s
define void @bar_sf() #1 {
; CHECK: bar_sf:
entry:
%call1 = call float @foo(float 1.000000e+00)
; CHECK: lw $3, %call16(foo)($2)
; CHECK-NOT: lw $5, %got(__mips16_call_stub_sf_1)($3)
ret void
}
define void @bar_hf() #0 {
; CHECK: bar_hf:
entry:
%call1 = call float @foo(float 1.000000e+00)
; CHECK: lw $2, %call16(foo)($3)
; CHECK: lw $5, %got(__mips16_call_stub_sf_1)($3)
ret void
}
declare float @foo(float) #2
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"="false"
}
attributes #1 = {
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 #2 = {
"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"
}

View File

@ -3,8 +3,8 @@
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel \ ; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel \
; RUN: -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s ; RUN: -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s
define void @bar_sf() #0 { define void @bar_hf() #0 {
; CHECK: bar_sf: ; CHECK: bar_hf:
entry: entry:
%call1 = call float @foo(float 1.000000e+00) %call1 = call float @foo(float 1.000000e+00)
; CHECK: lw $2, %call16(foo)($3) ; CHECK: lw $2, %call16(foo)($3)
@ -12,12 +12,12 @@ entry:
ret void ret void
} }
define void @bar_hf() #1 { define void @bar_sf() #1 {
; CHECK: bar_hf: ; CHECK: bar_sf:
entry: entry:
%call1 = call float @foo(float 1.000000e+00) %call1 = call float @foo(float 1.000000e+00)
; CHECK: lw $2, %call16(foo)($3) ; CHECK: lw $3, %call16(foo)($2)
; CHECK: lw $5, %got(__mips16_call_stub_sf_1)($3) ; CHECK-NOT: lw $5, %got(__mips16_call_stub_sf_1)($3)
ret void ret void
} }