Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(904)

Unified Diff: src/IceTargetLoweringARM32.cpp

Issue 1372083002: Subzero. Eliminates the use of Variable64On32 as operands in ARM. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Removes Variable64On32 Operands. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceTargetLoweringARM32.h ('k') | tests_lit/llvm2ice_tests/fp.convert.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceTargetLoweringARM32.cpp
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index b5495017c01eff52db765ab404e26490c1432381..99be924fd7c131c2f06fd205d73962d90af9a3ce 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -441,13 +441,7 @@ void TargetARM32::emitVariable(const Variable *Var) const {
Offset += getStackAdjustment();
}
const Type VarTy = Var->getType();
- // In general, no Variable64On32 should be emited in textual asm output. It
- // turns out that some lowering sequences Fake-Def/Fake-Use such a variables.
- // If they end up being assigned an illegal offset we get a runtime error. We
- // liberally allow Variable64On32 to have illegal offsets because offsets
- // don't matter in FakeDefs/FakeUses.
- if (!llvm::isa<Variable64On32>(Var) &&
- !isLegalVariableStackOffset(VarTy, Offset)) {
+ if (!isLegalVariableStackOffset(VarTy, Offset)) {
llvm::report_fatal_error("Illegal stack offset");
}
Str << "[" << getRegName(BaseRegNum, VarTy);
@@ -684,8 +678,14 @@ void TargetARM32::addProlog(CfgNode *Node) {
uint32_t SpillAreaAlignmentBytes = 0;
// For now, we don't have target-specific variables that need special
// treatment (no stack-slot-linked SpillVariable type).
- std::function<bool(Variable *)> TargetVarHook =
- [](Variable *) { return false; };
+ std::function<bool(Variable *)> TargetVarHook = [](Variable *Var) {
+ static constexpr bool AssignStackSlot = false;
+ static constexpr bool DontAssignStackSlot = !AssignStackSlot;
+ if (llvm::isa<Variable64On32>(Var)) {
+ return DontAssignStackSlot;
+ }
+ return AssignStackSlot;
+ };
// Compute the list of spilled variables and bounds for GlobalsSize, etc.
getVarStackSlotParams(SortedSpilledVariables, RegsUsed, &GlobalsSize,
@@ -1979,7 +1979,8 @@ void TargetARM32::lowerCall(const InstCall *Instr) {
}
namespace {
-void forceHiLoInReg(Variable64On32 *Var) {
+void configureBitcastTemporary(Variable64On32 *Var) {
+ Var->setMustNotHaveReg();
Var->getHi()->setMustHaveReg();
Var->getLo()->setMustHaveReg();
}
@@ -2265,15 +2266,12 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
assert(Src0->getType() == IceType_f64);
auto *T = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64));
T->initHiLo(Func);
- forceHiLoInReg(T);
+ configureBitcastTemporary(T);
Variable *Src0R = legalizeToReg(Src0);
_mov(T, Src0R);
- Context.insert(InstFakeDef::create(Func, T->getLo()));
- Context.insert(InstFakeDef::create(Func, T->getHi()));
auto *Dest64On32 = llvm::cast<Variable64On32>(Dest);
lowerAssign(InstAssign::create(Func, Dest64On32->getLo(), T->getLo()));
lowerAssign(InstAssign::create(Func, Dest64On32->getHi(), T->getHi()));
- Context.insert(InstFakeUse::create(Func, T));
break;
}
case IceType_f64: {
@@ -2284,16 +2282,10 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
assert(Src0->getType() == IceType_i64);
auto *Src64 = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64));
Src64->initHiLo(Func);
- forceHiLoInReg(Src64);
- Variable *T = Src64->getLo();
- _mov(T, legalizeToReg(loOperand(Src0)));
- T = Src64->getHi();
- _mov(T, legalizeToReg(hiOperand(Src0)));
- T = makeReg(IceType_f64);
- Context.insert(InstFakeDef::create(Func, Src64));
+ configureBitcastTemporary(Src64);
+ lowerAssign(InstAssign::create(Func, Src64, Src0));
+ Variable *T = makeReg(IceType_f64);
_mov(T, Src64);
- Context.insert(InstFakeUse::create(Func, Src64->getLo()));
- Context.insert(InstFakeUse::create(Func, Src64->getHi()));
lowerAssign(InstAssign::create(Func, Dest, T));
break;
}
« no previous file with comments | « src/IceTargetLoweringARM32.h ('k') | tests_lit/llvm2ice_tests/fp.convert.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698