WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED DUPLICATE of
bug 151246
151146
Air::spillEverything and Air::iteratedRegisterCoalescing don't take into account Inst::extraClobberedRegs()
https://bugs.webkit.org/show_bug.cgi?id=151146
Summary
Air::spillEverything and Air::iteratedRegisterCoalescing don't take into acco...
Filip Pizlo
Reported
2015-11-11 11:48:08 PST
Both allocators have a loop devoted to ensuring that all Def's interfere with each other. Inst::extraClobberedRegs() is like an extra set of Def's. This is important because it's what ensures that we don't put something into a register that is clobbered by a call.
Attachments
Add attachment
proposed patch, testcase, etc.
Filip Pizlo
Comment 1
2015-11-11 11:58:09 PST
I think that both allocators want an abstraction like: inst.forEachTmpIncludingExtra( [&] (Tmp tmp, Arg::Role role, Arg::Type type) { // tmp is not a reference, since we cannot edit an extraClobberedReg. }); This could be implemented as: template<typename Functor> void forEachTmpIncludingExtra(const Functor& functor) { forEachTmp( [&] (Tmp& tmp, Arg::Role role, Arg::Type type) { functor(tmp, role, type); }); if (hasSpecial()) { extraClobberedRegs().forEach( [&] (Reg reg) { functor(Tmp(reg), Arg::Def, reg.isGPR() ? Arg::GP : Arg::FP); }); } } Armed with such an abstraction, we could fix the bug by just changing which method the register allocators call when handling Def-to-Def interference.
Benjamin Poulain
Comment 2
2015-11-16 16:49:23 PST
Fixed in
https://bugs.webkit.org/show_bug.cgi?id=151246
*** This bug has been marked as a duplicate of
bug 151246
***
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug