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

Side by Side Diff: src/IceTargetLoweringX8632.cpp

Issue 652633002: Subzero: Improve performance of liveness analysis and live range construction. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix non-debug build Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements the TargetLoweringX8632 class, which 10 // This file implements the TargetLoweringX8632 class, which
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 446
447 Variable *TargetX8632::getPhysicalRegister(SizeT RegNum) { 447 Variable *TargetX8632::getPhysicalRegister(SizeT RegNum) {
448 assert(RegNum < PhysicalRegisters.size()); 448 assert(RegNum < PhysicalRegisters.size());
449 Variable *Reg = PhysicalRegisters[RegNum]; 449 Variable *Reg = PhysicalRegisters[RegNum];
450 if (Reg == NULL) { 450 if (Reg == NULL) {
451 Reg = Func->makeVariable(IceType_i32); 451 Reg = Func->makeVariable(IceType_i32);
452 Reg->setRegNum(RegNum); 452 Reg->setRegNum(RegNum);
453 PhysicalRegisters[RegNum] = Reg; 453 PhysicalRegisters[RegNum] = Reg;
454 // Specially mark esp as an "argument" so that it is considered 454 // Specially mark esp as an "argument" so that it is considered
455 // live upon function entry. 455 // live upon function entry.
456 if (RegNum == RegX8632::Reg_esp) 456 if (RegNum == RegX8632::Reg_esp) {
457 Func->addImplicitArg(Reg); 457 Func->addImplicitArg(Reg);
458 Reg->setIgnoreLiveness();
459 }
458 } 460 }
459 return Reg; 461 return Reg;
460 } 462 }
461 463
462 IceString TargetX8632::getRegName(SizeT RegNum, Type Ty) const { 464 IceString TargetX8632::getRegName(SizeT RegNum, Type Ty) const {
463 assert(RegNum < RegX8632::Reg_NUM); 465 assert(RegNum < RegX8632::Reg_NUM);
464 static IceString RegNames8[] = { 466 static IceString RegNames8[] = {
465 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \ 467 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
466 frameptr, isI8, isInt, isFP) \ 468 frameptr, isI8, isInt, isFP) \
467 name8, 469 name8,
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 InstX8632Label *Label = InstX8632Label::create(Func, this); 1253 InstX8632Label *Label = InstX8632Label::create(Func, this);
1252 _mov(T_1, Src1Lo, RegX8632::Reg_ecx); 1254 _mov(T_1, Src1Lo, RegX8632::Reg_ecx);
1253 _mov(T_2, Src0Lo); 1255 _mov(T_2, Src0Lo);
1254 _mov(T_3, Src0Hi); 1256 _mov(T_3, Src0Hi);
1255 _shld(T_3, T_2, T_1); 1257 _shld(T_3, T_2, T_1);
1256 _shl(T_2, T_1); 1258 _shl(T_2, T_1);
1257 _test(T_1, BitTest); 1259 _test(T_1, BitTest);
1258 _br(CondX86::Br_e, Label); 1260 _br(CondX86::Br_e, Label);
1259 // Because of the intra-block control flow, we need to fake a use 1261 // Because of the intra-block control flow, we need to fake a use
1260 // of T_3 to prevent its earlier definition from being dead-code 1262 // of T_3 to prevent its earlier definition from being dead-code
1261 // eliminated in the presence of its later definition. 1263 // eliminated in the presence of its later definition.
jvoung (off chromium) 2014/10/13 20:50:50 Now that the fakeuse is removed, can the comment b
Jim Stichnoth 2014/10/13 23:15:22 Done.
1262 Context.insert(InstFakeUse::create(Func, T_3)); 1264 _mov_nonkillable(T_3, T_2);
1263 _mov(T_3, T_2); 1265 _mov_nonkillable(T_2, Zero);
1264 _mov(T_2, Zero);
1265 Context.insert(Label); 1266 Context.insert(Label);
1266 _mov(DestLo, T_2); 1267 _mov(DestLo, T_2);
1267 _mov(DestHi, T_3); 1268 _mov(DestHi, T_3);
1268 } break; 1269 } break;
1269 case InstArithmetic::Lshr: { 1270 case InstArithmetic::Lshr: {
1270 // a=b>>c (unsigned) ==> 1271 // a=b>>c (unsigned) ==>
1271 // t1:ecx = c.lo & 0xff 1272 // t1:ecx = c.lo & 0xff
1272 // t2 = b.lo 1273 // t2 = b.lo
1273 // t3 = b.hi 1274 // t3 = b.hi
1274 // t2 = shrd t2, t3, t1 1275 // t2 = shrd t2, t3, t1
(...skipping 13 matching lines...) Expand all
1288 _mov(T_1, Src1Lo, RegX8632::Reg_ecx); 1289 _mov(T_1, Src1Lo, RegX8632::Reg_ecx);
1289 _mov(T_2, Src0Lo); 1290 _mov(T_2, Src0Lo);
1290 _mov(T_3, Src0Hi); 1291 _mov(T_3, Src0Hi);
1291 _shrd(T_2, T_3, T_1); 1292 _shrd(T_2, T_3, T_1);
1292 _shr(T_3, T_1); 1293 _shr(T_3, T_1);
1293 _test(T_1, BitTest); 1294 _test(T_1, BitTest);
1294 _br(CondX86::Br_e, Label); 1295 _br(CondX86::Br_e, Label);
1295 // Because of the intra-block control flow, we need to fake a use 1296 // Because of the intra-block control flow, we need to fake a use
1296 // of T_3 to prevent its earlier definition from being dead-code 1297 // of T_3 to prevent its earlier definition from being dead-code
1297 // eliminated in the presence of its later definition. 1298 // eliminated in the presence of its later definition.
1298 Context.insert(InstFakeUse::create(Func, T_2)); 1299 _mov_nonkillable(T_2, T_3);
1299 _mov(T_2, T_3); 1300 _mov_nonkillable(T_3, Zero);
1300 _mov(T_3, Zero);
1301 Context.insert(Label); 1301 Context.insert(Label);
1302 _mov(DestLo, T_2); 1302 _mov(DestLo, T_2);
1303 _mov(DestHi, T_3); 1303 _mov(DestHi, T_3);
1304 } break; 1304 } break;
1305 case InstArithmetic::Ashr: { 1305 case InstArithmetic::Ashr: {
1306 // a=b>>c (signed) ==> 1306 // a=b>>c (signed) ==>
1307 // t1:ecx = c.lo & 0xff 1307 // t1:ecx = c.lo & 0xff
1308 // t2 = b.lo 1308 // t2 = b.lo
1309 // t3 = b.hi 1309 // t3 = b.hi
1310 // t2 = shrd t2, t3, t1 1310 // t2 = shrd t2, t3, t1
(...skipping 13 matching lines...) Expand all
1324 _mov(T_1, Src1Lo, RegX8632::Reg_ecx); 1324 _mov(T_1, Src1Lo, RegX8632::Reg_ecx);
1325 _mov(T_2, Src0Lo); 1325 _mov(T_2, Src0Lo);
1326 _mov(T_3, Src0Hi); 1326 _mov(T_3, Src0Hi);
1327 _shrd(T_2, T_3, T_1); 1327 _shrd(T_2, T_3, T_1);
1328 _sar(T_3, T_1); 1328 _sar(T_3, T_1);
1329 _test(T_1, BitTest); 1329 _test(T_1, BitTest);
1330 _br(CondX86::Br_e, Label); 1330 _br(CondX86::Br_e, Label);
1331 // Because of the intra-block control flow, we need to fake a use 1331 // Because of the intra-block control flow, we need to fake a use
1332 // of T_3 to prevent its earlier definition from being dead-code 1332 // of T_3 to prevent its earlier definition from being dead-code
1333 // eliminated in the presence of its later definition. 1333 // eliminated in the presence of its later definition.
1334 Context.insert(InstFakeUse::create(Func, T_2)); 1334 _mov_nonkillable(T_2, T_3);
1335 _mov(T_2, T_3);
1336 _sar(T_3, SignExtend); 1335 _sar(T_3, SignExtend);
1337 Context.insert(Label); 1336 Context.insert(Label);
1338 _mov(DestLo, T_2); 1337 _mov(DestLo, T_2);
1339 _mov(DestHi, T_3); 1338 _mov(DestHi, T_3);
1340 } break; 1339 } break;
1341 case InstArithmetic::Udiv: { 1340 case InstArithmetic::Udiv: {
1342 const SizeT MaxSrcs = 2; 1341 const SizeT MaxSrcs = 2;
1343 InstCall *Call = makeHelperCall("__udivdi3", Dest, MaxSrcs); 1342 InstCall *Call = makeHelperCall("__udivdi3", Dest, MaxSrcs);
1344 Call->addArg(Inst->getSrc(0)); 1343 Call->addArg(Inst->getSrc(0));
1345 Call->addArg(Inst->getSrc(1)); 1344 Call->addArg(Inst->getSrc(1));
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after
2508 } 2507 }
2509 Constant *Default = 2508 Constant *Default =
2510 Ctx->getConstantInt32(IceType_i32, TableFcmp[Index].Default); 2509 Ctx->getConstantInt32(IceType_i32, TableFcmp[Index].Default);
2511 _mov(Dest, Default); 2510 _mov(Dest, Default);
2512 if (HasC1) { 2511 if (HasC1) {
2513 InstX8632Label *Label = InstX8632Label::create(Func, this); 2512 InstX8632Label *Label = InstX8632Label::create(Func, this);
2514 _br(TableFcmp[Index].C1, Label); 2513 _br(TableFcmp[Index].C1, Label);
2515 if (HasC2) { 2514 if (HasC2) {
2516 _br(TableFcmp[Index].C2, Label); 2515 _br(TableFcmp[Index].C2, Label);
2517 } 2516 }
2518 Context.insert(InstFakeUse::create(Func, Dest));
2519 Constant *NonDefault = 2517 Constant *NonDefault =
2520 Ctx->getConstantInt32(IceType_i32, !TableFcmp[Index].Default); 2518 Ctx->getConstantInt32(IceType_i32, !TableFcmp[Index].Default);
2521 _mov(Dest, NonDefault); 2519 _mov_nonkillable(Dest, NonDefault);
2522 Context.insert(Label); 2520 Context.insert(Label);
2523 } 2521 }
2524 } 2522 }
2525 2523
2526 void TargetX8632::lowerIcmp(const InstIcmp *Inst) { 2524 void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
2527 Operand *Src0 = legalize(Inst->getSrc(0)); 2525 Operand *Src0 = legalize(Inst->getSrc(0));
2528 Operand *Src1 = legalize(Inst->getSrc(1)); 2526 Operand *Src1 = legalize(Inst->getSrc(1));
2529 Variable *Dest = Inst->getDest(); 2527 Variable *Dest = Inst->getDest();
2530 2528
2531 if (isVectorType(Dest->getType())) { 2529 if (isVectorType(Dest->getType())) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2667 Operand *Src0HiRM = legalize(hiOperand(Src0), Legal_Reg | Legal_Mem); 2665 Operand *Src0HiRM = legalize(hiOperand(Src0), Legal_Reg | Legal_Mem);
2668 Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm); 2666 Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm);
2669 Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm); 2667 Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm);
2670 if (Condition == InstIcmp::Eq || Condition == InstIcmp::Ne) { 2668 if (Condition == InstIcmp::Eq || Condition == InstIcmp::Ne) {
2671 InstX8632Label *Label = InstX8632Label::create(Func, this); 2669 InstX8632Label *Label = InstX8632Label::create(Func, this);
2672 _mov(Dest, (Condition == InstIcmp::Eq ? Zero : One)); 2670 _mov(Dest, (Condition == InstIcmp::Eq ? Zero : One));
2673 _cmp(Src0LoRM, Src1LoRI); 2671 _cmp(Src0LoRM, Src1LoRI);
2674 _br(CondX86::Br_ne, Label); 2672 _br(CondX86::Br_ne, Label);
2675 _cmp(Src0HiRM, Src1HiRI); 2673 _cmp(Src0HiRM, Src1HiRI);
2676 _br(CondX86::Br_ne, Label); 2674 _br(CondX86::Br_ne, Label);
2677 Context.insert(InstFakeUse::create(Func, Dest)); 2675 _mov_nonkillable(Dest, (Condition == InstIcmp::Eq ? One : Zero));
2678 _mov(Dest, (Condition == InstIcmp::Eq ? One : Zero));
2679 Context.insert(Label); 2676 Context.insert(Label);
2680 } else { 2677 } else {
2681 InstX8632Label *LabelFalse = InstX8632Label::create(Func, this); 2678 InstX8632Label *LabelFalse = InstX8632Label::create(Func, this);
2682 InstX8632Label *LabelTrue = InstX8632Label::create(Func, this); 2679 InstX8632Label *LabelTrue = InstX8632Label::create(Func, this);
2683 _mov(Dest, One); 2680 _mov(Dest, One);
2684 _cmp(Src0HiRM, Src1HiRI); 2681 _cmp(Src0HiRM, Src1HiRI);
2685 _br(TableIcmp64[Index].C1, LabelTrue); 2682 _br(TableIcmp64[Index].C1, LabelTrue);
2686 _br(TableIcmp64[Index].C2, LabelFalse); 2683 _br(TableIcmp64[Index].C2, LabelFalse);
2687 _cmp(Src0LoRM, Src1LoRI); 2684 _cmp(Src0LoRM, Src1LoRI);
2688 _br(TableIcmp64[Index].C3, LabelTrue); 2685 _br(TableIcmp64[Index].C3, LabelTrue);
2689 Context.insert(LabelFalse); 2686 Context.insert(LabelFalse);
2690 Context.insert(InstFakeUse::create(Func, Dest)); 2687 _mov_nonkillable(Dest, Zero);
2691 _mov(Dest, Zero);
2692 Context.insert(LabelTrue); 2688 Context.insert(LabelTrue);
2693 } 2689 }
2694 return; 2690 return;
2695 } 2691 }
2696 2692
2697 // cmp b, c 2693 // cmp b, c
2698 Operand *Src0RM = 2694 Operand *Src0RM =
2699 legalize(Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg); 2695 legalize(Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg);
2700 InstX8632Label *Label = InstX8632Label::create(Func, this); 2696 InstX8632Label *Label = InstX8632Label::create(Func, this);
2701 _cmp(Src0RM, Src1); 2697 _cmp(Src0RM, Src1);
2702 _mov(Dest, One); 2698 _mov(Dest, One);
2703 _br(getIcmp32Mapping(Inst->getCondition()), Label); 2699 _br(getIcmp32Mapping(Inst->getCondition()), Label);
2704 Context.insert(InstFakeUse::create(Func, Dest)); 2700 _mov_nonkillable(Dest, Zero);
2705 _mov(Dest, Zero);
2706 Context.insert(Label); 2701 Context.insert(Label);
2707 } 2702 }
2708 2703
2709 void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) { 2704 void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
2710 Operand *SourceVectNotLegalized = Inst->getSrc(0); 2705 Operand *SourceVectNotLegalized = Inst->getSrc(0);
2711 Operand *ElementToInsertNotLegalized = Inst->getSrc(1); 2706 Operand *ElementToInsertNotLegalized = Inst->getSrc(1);
2712 ConstantInteger32 *ElementIndex = 2707 ConstantInteger32 *ElementIndex =
2713 llvm::dyn_cast<ConstantInteger32>(Inst->getSrc(2)); 2708 llvm::dyn_cast<ConstantInteger32>(Inst->getSrc(2));
2714 // Only constant indices are allowed in PNaCl IR. 2709 // Only constant indices are allowed in PNaCl IR.
2715 assert(ElementIndex); 2710 assert(ElementIndex);
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
3126 return; 3121 return;
3127 } 3122 }
3128 case Intrinsics::Stacksave: { 3123 case Intrinsics::Stacksave: {
3129 Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp); 3124 Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
3130 Variable *Dest = Instr->getDest(); 3125 Variable *Dest = Instr->getDest();
3131 _mov(Dest, esp); 3126 _mov(Dest, esp);
3132 return; 3127 return;
3133 } 3128 }
3134 case Intrinsics::Stackrestore: { 3129 case Intrinsics::Stackrestore: {
3135 Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp); 3130 Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
3136 _mov(esp, Instr->getArg(0)); 3131 _mov_nonkillable(esp, Instr->getArg(0));
3137 return; 3132 return;
3138 } 3133 }
3139 case Intrinsics::Trap: 3134 case Intrinsics::Trap:
3140 _ud2(); 3135 _ud2();
3141 return; 3136 return;
3142 case Intrinsics::UnknownIntrinsic: 3137 case Intrinsics::UnknownIntrinsic:
3143 Func->setError("Should not be lowering UnknownIntrinsic"); 3138 Func->setError("Should not be lowering UnknownIntrinsic");
3144 return; 3139 return;
3145 } 3140 }
3146 return; 3141 return;
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
3935 3930
3936 if (Dest->getType() == IceType_i64) { 3931 if (Dest->getType() == IceType_i64) {
3937 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); 3932 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest));
3938 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); 3933 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest));
3939 Operand *SrcLoRI = legalize(loOperand(SrcT), Legal_Reg | Legal_Imm); 3934 Operand *SrcLoRI = legalize(loOperand(SrcT), Legal_Reg | Legal_Imm);
3940 Operand *SrcHiRI = legalize(hiOperand(SrcT), Legal_Reg | Legal_Imm); 3935 Operand *SrcHiRI = legalize(hiOperand(SrcT), Legal_Reg | Legal_Imm);
3941 _cmp(ConditionRM, Zero); 3936 _cmp(ConditionRM, Zero);
3942 _mov(DestLo, SrcLoRI); 3937 _mov(DestLo, SrcLoRI);
3943 _mov(DestHi, SrcHiRI); 3938 _mov(DestHi, SrcHiRI);
3944 _br(CondX86::Br_ne, Label); 3939 _br(CondX86::Br_ne, Label);
3945 Context.insert(InstFakeUse::create(Func, DestLo));
3946 Context.insert(InstFakeUse::create(Func, DestHi));
3947 Operand *SrcFLo = loOperand(SrcF); 3940 Operand *SrcFLo = loOperand(SrcF);
3948 Operand *SrcFHi = hiOperand(SrcF); 3941 Operand *SrcFHi = hiOperand(SrcF);
3949 SrcLoRI = legalize(SrcFLo, Legal_Reg | Legal_Imm); 3942 SrcLoRI = legalize(SrcFLo, Legal_Reg | Legal_Imm);
3950 SrcHiRI = legalize(SrcFHi, Legal_Reg | Legal_Imm); 3943 SrcHiRI = legalize(SrcFHi, Legal_Reg | Legal_Imm);
3951 _mov(DestLo, SrcLoRI); 3944 _mov_nonkillable(DestLo, SrcLoRI);
3952 _mov(DestHi, SrcHiRI); 3945 _mov_nonkillable(DestHi, SrcHiRI);
3953 } else { 3946 } else {
3954 _cmp(ConditionRM, Zero); 3947 _cmp(ConditionRM, Zero);
3955 SrcT = legalize(SrcT, Legal_Reg | Legal_Imm); 3948 SrcT = legalize(SrcT, Legal_Reg | Legal_Imm);
3956 _mov(Dest, SrcT); 3949 _mov(Dest, SrcT);
3957 _br(CondX86::Br_ne, Label); 3950 _br(CondX86::Br_ne, Label);
3958 Context.insert(InstFakeUse::create(Func, Dest));
3959 SrcF = legalize(SrcF, Legal_Reg | Legal_Imm); 3951 SrcF = legalize(SrcF, Legal_Reg | Legal_Imm);
3960 _mov(Dest, SrcF); 3952 _mov_nonkillable(Dest, SrcF);
3961 } 3953 }
3962 3954
3963 Context.insert(Label); 3955 Context.insert(Label);
3964 } 3956 }
3965 3957
3966 void TargetX8632::lowerStore(const InstStore *Inst) { 3958 void TargetX8632::lowerStore(const InstStore *Inst) {
3967 Operand *Value = Inst->getData(); 3959 Operand *Value = Inst->getData();
3968 Operand *Addr = Inst->getAddr(); 3960 Operand *Addr = Inst->getAddr();
3969 OperandX8632Mem *NewAddr = FormMemoryOperand(Addr, Value->getType()); 3961 OperandX8632Mem *NewAddr = FormMemoryOperand(Addr, Value->getType());
3970 Type Ty = NewAddr->getType(); 3962 Type Ty = NewAddr->getType();
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
4291 assert(Type != IceType_i64); 4283 assert(Type != IceType_i64);
4292 Variable *Reg = Func->makeVariable(Type); 4284 Variable *Reg = Func->makeVariable(Type);
4293 if (RegNum == Variable::NoRegister) 4285 if (RegNum == Variable::NoRegister)
4294 Reg->setWeightInfinite(); 4286 Reg->setWeightInfinite();
4295 else 4287 else
4296 Reg->setRegNum(RegNum); 4288 Reg->setRegNum(RegNum);
4297 return Reg; 4289 return Reg;
4298 } 4290 }
4299 4291
4300 void TargetX8632::postLower() { 4292 void TargetX8632::postLower() {
4301 if (Ctx->getOptLevel() != Opt_m1) 4293 if (Ctx->getOptLevel() != Opt_m1) {
4294 // Find non-SSA instructions where Dest==Src0, and set the
jvoung (off chromium) 2014/10/13 20:50:50 Add a note to clarify that this is for two-address
Jim Stichnoth 2014/10/13 23:15:22 Done.
4295 // DestNonKillable flag to keep liveness analysis consistent.
4296 for (Inst *Inst : Context) {
4297 if (Inst->isDeleted())
4298 continue;
4299 if (Variable *Dest = Inst->getDest()) {
4300 // TODO(stichnot): We may need to consider all source
4301 // operands, not just the first one, if using 3-address
4302 // instructions.
4303 if (Inst->getSrcSize() > 0 && Inst->getSrc(0) == Dest)
4304 Inst->setDestNonKillable();
4305 }
4306 }
4302 return; 4307 return;
4303 TimerMarker T(TimerStack::TT_postLower, Func); 4308 }
jvoung (off chromium) 2014/10/13 20:50:50 Is this removal intentional? Otherwise, you could
Jim Stichnoth 2014/10/13 23:15:22 Removed the enum value. I removed the TimerMarker
4304 // TODO: Avoid recomputing WhiteList every instruction. 4309 // TODO: Avoid recomputing WhiteList every instruction.
4305 RegSetMask RegInclude = RegSet_All; 4310 RegSetMask RegInclude = RegSet_All;
4306 RegSetMask RegExclude = RegSet_StackPointer; 4311 RegSetMask RegExclude = RegSet_StackPointer;
4307 if (hasFramePointer()) 4312 if (hasFramePointer())
4308 RegExclude |= RegSet_FramePointer; 4313 RegExclude |= RegSet_FramePointer;
4309 llvm::SmallBitVector WhiteList = getRegisterSet(RegInclude, RegExclude); 4314 llvm::SmallBitVector WhiteList = getRegisterSet(RegInclude, RegExclude);
4310 // Make one pass to black-list pre-colored registers. TODO: If 4315 // Make one pass to black-list pre-colored registers. TODO: If
4311 // there was some prior register allocation pass that made register 4316 // there was some prior register allocation pass that made register
4312 // assignments, those registers need to be black-listed here as 4317 // assignments, those registers need to be black-listed here as
4313 // well. 4318 // well.
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
4537 llvm::report_fatal_error(StrBuf.str()); 4542 llvm::report_fatal_error(StrBuf.str());
4538 break; 4543 break;
4539 } 4544 }
4540 } 4545 }
4541 } 4546 }
4542 Str << "\t.size\t" << MangledName << ", " << Global.getNumBytes() << "\n"; 4547 Str << "\t.size\t" << MangledName << ", " << Global.getNumBytes() << "\n";
4543 } 4548 }
4544 } 4549 }
4545 4550
4546 } // end of namespace Ice 4551 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698