Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
llvm-epi-0.8
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
Roger Ferrer
llvm-epi-0.8
Commits
89183dcc
Commit
89183dcc
authored
17 years ago
by
Duraid Madina
Browse files
Options
Downloads
Patches
Plain Diff
ok, this much doesn't seem to bork anything
llvm-svn: 37749
parent
a415dcaa
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
llvm/lib/CodeGen/RegAllocBigBlock.cpp
+48
-25
48 additions, 25 deletions
llvm/lib/CodeGen/RegAllocBigBlock.cpp
with
48 additions
and
25 deletions
llvm/lib/CodeGen/RegAllocBigBlock.cpp
+
48
−
25
View file @
89183dcc
...
...
@@ -357,18 +357,7 @@ void RABigBlock::spillPhysReg(MachineBasicBlock &MBB, MachineInstr *I,
*
AliasSet
;
++
AliasSet
)
if
(
PhysRegsUsed
[
*
AliasSet
]
!=
-
1
&&
// Spill aliased register.
PhysRegsUsed
[
*
AliasSet
]
!=
-
2
)
// If allocatable.
if
(
PhysRegsUsed
[
*
AliasSet
]
==
0
)
{
// This must have been a dead def due to something like this:
// %EAX :=
// := op %AL
// No more use of %EAX, %AH, etc.
// %EAX isn't dead upon definition, but %AH is. However %AH isn't
// an operand of definition MI so it's not marked as such.
DOUT
<<
" Register "
<<
RegInfo
->
getName
(
*
AliasSet
)
<<
" [%reg"
<<
*
AliasSet
<<
"] is never used, removing it frame live list
\n
"
;
removePhysReg
(
*
AliasSet
);
}
else
if
(
PhysRegsUsed
[
*
AliasSet
])
spillVirtReg
(
MBB
,
I
,
PhysRegsUsed
[
*
AliasSet
],
*
AliasSet
);
}
}
...
...
@@ -582,6 +571,30 @@ void RABigBlock::FillVRegReadTable(MachineBasicBlock &MBB) {
}
}
/// isReadModWriteImplicitKill - True if this is an implicit kill for a
/// read/mod/write register, i.e. update partial register.
static
bool
isReadModWriteImplicitKill
(
MachineInstr
*
MI
,
unsigned
Reg
)
{
for
(
unsigned
i
=
0
,
e
=
MI
->
getNumOperands
();
i
!=
e
;
++
i
)
{
MachineOperand
&
MO
=
MI
->
getOperand
(
i
);
if
(
MO
.
isRegister
()
&&
MO
.
getReg
()
==
Reg
&&
MO
.
isImplicit
()
&&
MO
.
isDef
()
&&
!
MO
.
isDead
())
return
true
;
}
return
false
;
}
/// isReadModWriteImplicitDef - True if this is an implicit def for a
/// read/mod/write register, i.e. update partial register.
static
bool
isReadModWriteImplicitDef
(
MachineInstr
*
MI
,
unsigned
Reg
)
{
for
(
unsigned
i
=
0
,
e
=
MI
->
getNumOperands
();
i
!=
e
;
++
i
)
{
MachineOperand
&
MO
=
MI
->
getOperand
(
i
);
if
(
MO
.
isRegister
()
&&
MO
.
getReg
()
==
Reg
&&
MO
.
isImplicit
()
&&
!
MO
.
isDef
()
&&
MO
.
isKill
())
return
true
;
}
return
false
;
}
void
RABigBlock
::
AllocateBasicBlock
(
MachineBasicBlock
&
MBB
)
{
// loop over each instruction
...
...
@@ -599,7 +612,7 @@ void RABigBlock::AllocateBasicBlock(MachineBasicBlock &MBB) {
unsigned
Reg
=
I
->
first
;
MF
->
setPhysRegUsed
(
Reg
);
PhysRegsUsed
[
Reg
]
=
0
;
// It is free and reserved now
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
AliasSet
(
Reg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
SubRegisters
(
Reg
);
*
AliasSet
;
++
AliasSet
)
{
if
(
PhysRegsUsed
[
*
AliasSet
]
!=
-
2
)
{
PhysRegsUsed
[
*
AliasSet
]
=
0
;
// It is free and reserved now
...
...
@@ -626,8 +639,15 @@ void RABigBlock::AllocateBasicBlock(MachineBasicBlock &MBB) {
SmallVector
<
unsigned
,
8
>
Kills
;
for
(
unsigned
i
=
0
,
e
=
MI
->
getNumOperands
();
i
!=
e
;
++
i
)
{
MachineOperand
&
MO
=
MI
->
getOperand
(
i
);
if
(
MO
.
isRegister
()
&&
MO
.
isKill
())
Kills
.
push_back
(
MO
.
getReg
());
if
(
MO
.
isRegister
()
&&
MO
.
isKill
())
{
if
(
!
MO
.
isImplicit
())
Kills
.
push_back
(
MO
.
getReg
());
else
if
(
!
isReadModWriteImplicitKill
(
MI
,
MO
.
getReg
()))
// These are extra physical register kills when a sub-register
// is defined (def of a sub-register is a read/mod/write of the
// larger registers). Ignore.
Kills
.
push_back
(
MO
.
getReg
());
}
}
// Get the used operands into registers. This has the potential to spill
...
...
@@ -660,13 +680,16 @@ void RABigBlock::AllocateBasicBlock(MachineBasicBlock &MBB) {
}
else
if
(
PhysRegsUsed
[
PhysReg
]
==
-
2
)
{
// Unallocatable register dead, ignore.
continue
;
}
else
{
assert
(
!
PhysRegsUsed
[
PhysReg
]
||
PhysRegsUsed
[
PhysReg
]
==
-
1
&&
"Silently clearing a virtual register?"
);
}
if
(
PhysReg
)
{
DOUT
<<
" Last use of "
<<
RegInfo
->
getName
(
PhysReg
)
<<
"[%reg"
<<
VirtReg
<<
"], removing it from live set
\n
"
;
removePhysReg
(
PhysReg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
AliasSet
(
PhysReg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
SubRegisters
(
PhysReg
);
*
AliasSet
;
++
AliasSet
)
{
if
(
PhysRegsUsed
[
*
AliasSet
]
!=
-
2
)
{
DOUT
<<
" Last use of "
...
...
@@ -686,11 +709,15 @@ void RABigBlock::AllocateBasicBlock(MachineBasicBlock &MBB) {
MRegisterInfo
::
isPhysicalRegister
(
MO
.
getReg
()))
{
unsigned
Reg
=
MO
.
getReg
();
if
(
PhysRegsUsed
[
Reg
]
==
-
2
)
continue
;
// Something like ESP.
// These are extra physical register defs when a sub-register
// is defined (def of a sub-register is a read/mod/write of the
// larger registers). Ignore.
if
(
isReadModWriteImplicitDef
(
MI
,
MO
.
getReg
()))
continue
;
MF
->
setPhysRegUsed
(
Reg
);
spillPhysReg
(
MBB
,
MI
,
Reg
,
true
);
// Spill any existing value in reg
PhysRegsUsed
[
Reg
]
=
0
;
// It is free and reserved now
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
AliasSet
(
Reg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
get
SubRegisters
(
Reg
);
*
AliasSet
;
++
AliasSet
)
{
if
(
PhysRegsUsed
[
*
AliasSet
]
!=
-
2
)
{
PhysRegsUsed
[
*
AliasSet
]
=
0
;
// It is free and reserved now
...
...
@@ -705,19 +732,15 @@ void RABigBlock::AllocateBasicBlock(MachineBasicBlock &MBB) {
for
(
const
unsigned
*
ImplicitDefs
=
TID
.
ImplicitDefs
;
*
ImplicitDefs
;
++
ImplicitDefs
)
{
unsigned
Reg
=
*
ImplicitDefs
;
bool
IsNonAllocatable
=
PhysRegsUsed
[
Reg
]
==
-
2
;
if
(
!
IsNonAllocatable
)
{
if
(
PhysRegsUsed
[
Reg
]
!=
-
2
)
{
spillPhysReg
(
MBB
,
MI
,
Reg
,
true
);
PhysRegsUsed
[
Reg
]
=
0
;
// It is free and reserved now
}
MF
->
setPhysRegUsed
(
Reg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
getAliasSet
(
Reg
);
for
(
const
unsigned
*
AliasSet
=
RegInfo
->
getSubRegisters
(
Reg
);
*
AliasSet
;
++
AliasSet
)
{
if
(
PhysRegsUsed
[
*
AliasSet
]
!=
-
2
)
{
if
(
!
IsNonAllocatable
)
{
PhysRegsUsed
[
*
AliasSet
]
=
0
;
// It is free and reserved now
}
PhysRegsUsed
[
*
AliasSet
]
=
0
;
// It is free and reserved now
MF
->
setPhysRegUsed
(
*
AliasSet
);
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment