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

Side by Side Diff: src/WasmTranslator.cpp

Issue 1961583002: Subzero WASM: avoid needless comparisons, add bounds check flag option (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Add BooleanVariable::classof Created 4 years, 7 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
« src/IceClFlags.def ('K') | « src/IceOperand.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/WasmTranslator.cpp - WASM to Subzero Translation -------===// 1 //===- subzero/src/WasmTranslator.cpp - WASM to Subzero Translation -------===//
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 /// \file 10 /// \file
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 Node Float64Constant(double Value) { 386 Node Float64Constant(double Value) {
387 LOG(out << "Float64Constant(" << Value << ") = "); 387 LOG(out << "Float64Constant(" << Value << ") = ");
388 auto *Const = Ctx->getConstantDouble(Value); 388 auto *Const = Ctx->getConstantDouble(Value);
389 assert(Const); 389 assert(Const);
390 LOG(out << Node(Const) << "\n"); 390 LOG(out << Node(Const) << "\n");
391 return OperandNode(Const); 391 return OperandNode(Const);
392 } 392 }
393 Node Binop(wasm::WasmOpcode Opcode, Node Left, Node Right) { 393 Node Binop(wasm::WasmOpcode Opcode, Node Left, Node Right) {
394 LOG(out << "Binop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Left 394 LOG(out << "Binop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Left
395 << ", " << Right << ") = "); 395 << ", " << Right << ") = ");
396 auto *Dest = makeVariable( 396 auto *Dest = isComparison(Opcode)
Jim Stichnoth 2016/05/06 20:37:51 I'm surprised "auto" works here, given "bool ? Boo
Eric Holk 2016/05/06 20:56:21 Now that you mention it, I guess I'm a little surp
397 isComparison(Opcode) ? IceType_i32 : Left.toOperand()->getType()); 397 ? makeVariable<BooleanVariable>(IceType_i32)
398 : makeVariable(Left.toOperand()->getType());
398 switch (Opcode) { 399 switch (Opcode) {
399 case kExprI32Add: 400 case kExprI32Add:
400 case kExprI64Add: 401 case kExprI64Add:
401 Control()->appendInst( 402 Control()->appendInst(
402 InstArithmetic::create(Func, InstArithmetic::Add, Dest, Left, Right)); 403 InstArithmetic::create(Func, InstArithmetic::Add, Dest, Left, Right));
403 break; 404 break;
404 case kExprF32Add: 405 case kExprF32Add:
405 case kExprF64Add: 406 case kExprF64Add:
406 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Fadd, 407 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Fadd,
407 Dest, Left, Right)); 408 Dest, Left, Right));
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 case kExprI32And: 532 case kExprI32And:
532 case kExprI64And: 533 case kExprI64And:
533 Control()->appendInst( 534 Control()->appendInst(
534 InstArithmetic::create(Func, InstArithmetic::And, Dest, Left, Right)); 535 InstArithmetic::create(Func, InstArithmetic::And, Dest, Left, Right));
535 break; 536 break;
536 case kExprI32Ne: 537 case kExprI32Ne:
537 case kExprI64Ne: { 538 case kExprI64Ne: {
538 auto *TmpDest = makeVariable(IceType_i1); 539 auto *TmpDest = makeVariable(IceType_i1);
539 Control()->appendInst( 540 Control()->appendInst(
540 InstIcmp::create(Func, InstIcmp::Ne, TmpDest, Left, Right)); 541 InstIcmp::create(Func, InstIcmp::Ne, TmpDest, Left, Right));
542 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
541 Control()->appendInst( 543 Control()->appendInst(
542 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 544 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
543 break; 545 break;
544 } 546 }
545 case kExprI32Eq: 547 case kExprI32Eq:
546 case kExprI64Eq: { 548 case kExprI64Eq: {
547 auto *TmpDest = makeVariable(IceType_i1); 549 auto *TmpDest = makeVariable(IceType_i1);
548 Control()->appendInst( 550 Control()->appendInst(
549 InstIcmp::create(Func, InstIcmp::Eq, TmpDest, Left, Right)); 551 InstIcmp::create(Func, InstIcmp::Eq, TmpDest, Left, Right));
552 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
550 Control()->appendInst( 553 Control()->appendInst(
551 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 554 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
552 break; 555 break;
553 } 556 }
554 case kExprI32LtS: 557 case kExprI32LtS:
555 case kExprI64LtS: { 558 case kExprI64LtS: {
556 auto *TmpDest = makeVariable(IceType_i1); 559 auto *TmpDest = makeVariable(IceType_i1);
557 Control()->appendInst( 560 Control()->appendInst(
558 InstIcmp::create(Func, InstIcmp::Slt, TmpDest, Left, Right)); 561 InstIcmp::create(Func, InstIcmp::Slt, TmpDest, Left, Right));
562 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
559 Control()->appendInst( 563 Control()->appendInst(
560 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 564 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
561 break; 565 break;
562 } 566 }
563 case kExprI32LeS: 567 case kExprI32LeS:
564 case kExprI64LeS: { 568 case kExprI64LeS: {
565 auto *TmpDest = makeVariable(IceType_i1); 569 auto *TmpDest = makeVariable(IceType_i1);
566 Control()->appendInst( 570 Control()->appendInst(
567 InstIcmp::create(Func, InstIcmp::Sle, TmpDest, Left, Right)); 571 InstIcmp::create(Func, InstIcmp::Sle, TmpDest, Left, Right));
572 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
568 Control()->appendInst( 573 Control()->appendInst(
569 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 574 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
570 break; 575 break;
571 } 576 }
572 case kExprI32GeU: 577 case kExprI32GeU:
573 case kExprI64GeU: { 578 case kExprI64GeU: {
574 auto *TmpDest = makeVariable(IceType_i1); 579 auto *TmpDest = makeVariable(IceType_i1);
575 Control()->appendInst( 580 Control()->appendInst(
576 InstIcmp::create(Func, InstIcmp::Uge, TmpDest, Left, Right)); 581 InstIcmp::create(Func, InstIcmp::Uge, TmpDest, Left, Right));
582 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
577 Control()->appendInst( 583 Control()->appendInst(
578 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 584 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
579 break; 585 break;
580 } 586 }
581 case kExprI32LeU: 587 case kExprI32LeU:
582 case kExprI64LeU: { 588 case kExprI64LeU: {
583 auto *TmpDest = makeVariable(IceType_i1); 589 auto *TmpDest = makeVariable(IceType_i1);
584 Control()->appendInst( 590 Control()->appendInst(
585 InstIcmp::create(Func, InstIcmp::Ule, TmpDest, Left, Right)); 591 InstIcmp::create(Func, InstIcmp::Ule, TmpDest, Left, Right));
592 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
586 Control()->appendInst( 593 Control()->appendInst(
587 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 594 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
588 break; 595 break;
589 } 596 }
590 case kExprI32LtU: 597 case kExprI32LtU:
591 case kExprI64LtU: { 598 case kExprI64LtU: {
592 auto *TmpDest = makeVariable(IceType_i1); 599 auto *TmpDest = makeVariable(IceType_i1);
593 Control()->appendInst( 600 Control()->appendInst(
594 InstIcmp::create(Func, InstIcmp::Ult, TmpDest, Left, Right)); 601 InstIcmp::create(Func, InstIcmp::Ult, TmpDest, Left, Right));
602 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
595 Control()->appendInst( 603 Control()->appendInst(
596 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 604 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
597 break; 605 break;
598 } 606 }
599 case kExprI32GeS: 607 case kExprI32GeS:
600 case kExprI64GeS: { 608 case kExprI64GeS: {
601 auto *TmpDest = makeVariable(IceType_i1); 609 auto *TmpDest = makeVariable(IceType_i1);
602 Control()->appendInst( 610 Control()->appendInst(
603 InstIcmp::create(Func, InstIcmp::Sge, TmpDest, Left, Right)); 611 InstIcmp::create(Func, InstIcmp::Sge, TmpDest, Left, Right));
612 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
604 Control()->appendInst( 613 Control()->appendInst(
605 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 614 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
606 break; 615 break;
607 } 616 }
608 case kExprI32GtS: 617 case kExprI32GtS:
609 case kExprI64GtS: { 618 case kExprI64GtS: {
610 auto *TmpDest = makeVariable(IceType_i1); 619 auto *TmpDest = makeVariable(IceType_i1);
611 Control()->appendInst( 620 Control()->appendInst(
612 InstIcmp::create(Func, InstIcmp::Sgt, TmpDest, Left, Right)); 621 InstIcmp::create(Func, InstIcmp::Sgt, TmpDest, Left, Right));
622 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
613 Control()->appendInst( 623 Control()->appendInst(
614 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 624 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
615 break; 625 break;
616 } 626 }
617 case kExprI32GtU: 627 case kExprI32GtU:
618 case kExprI64GtU: { 628 case kExprI64GtU: {
619 auto *TmpDest = makeVariable(IceType_i1); 629 auto *TmpDest = makeVariable(IceType_i1);
620 Control()->appendInst( 630 Control()->appendInst(
621 InstIcmp::create(Func, InstIcmp::Ugt, TmpDest, Left, Right)); 631 InstIcmp::create(Func, InstIcmp::Ugt, TmpDest, Left, Right));
632 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
622 Control()->appendInst( 633 Control()->appendInst(
623 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 634 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
624 break; 635 break;
625 } 636 }
626 case kExprF32Eq: 637 case kExprF32Eq:
627 case kExprF64Eq: { 638 case kExprF64Eq: {
628 auto *TmpDest = makeVariable(IceType_i1); 639 auto *TmpDest = makeVariable(IceType_i1);
629 Control()->appendInst( 640 Control()->appendInst(
630 InstFcmp::create(Func, InstFcmp::Ueq, TmpDest, Left, Right)); 641 InstFcmp::create(Func, InstFcmp::Ueq, TmpDest, Left, Right));
642 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
631 Control()->appendInst( 643 Control()->appendInst(
632 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 644 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
633 break; 645 break;
634 } 646 }
635 case kExprF32Ne: 647 case kExprF32Ne:
636 case kExprF64Ne: { 648 case kExprF64Ne: {
637 auto *TmpDest = makeVariable(IceType_i1); 649 auto *TmpDest = makeVariable(IceType_i1);
638 Control()->appendInst( 650 Control()->appendInst(
639 InstFcmp::create(Func, InstFcmp::Une, TmpDest, Left, Right)); 651 InstFcmp::create(Func, InstFcmp::Une, TmpDest, Left, Right));
652 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
640 Control()->appendInst( 653 Control()->appendInst(
641 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 654 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
642 break; 655 break;
643 } 656 }
644 case kExprF32Le: 657 case kExprF32Le:
645 case kExprF64Le: { 658 case kExprF64Le: {
646 auto *TmpDest = makeVariable(IceType_i1); 659 auto *TmpDest = makeVariable(IceType_i1);
647 Control()->appendInst( 660 Control()->appendInst(
648 InstFcmp::create(Func, InstFcmp::Ule, TmpDest, Left, Right)); 661 InstFcmp::create(Func, InstFcmp::Ule, TmpDest, Left, Right));
662 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
649 Control()->appendInst( 663 Control()->appendInst(
650 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 664 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
651 break; 665 break;
652 } 666 }
653 case kExprF32Lt: 667 case kExprF32Lt:
654 case kExprF64Lt: { 668 case kExprF64Lt: {
655 auto *TmpDest = makeVariable(IceType_i1); 669 auto *TmpDest = makeVariable(IceType_i1);
656 Control()->appendInst( 670 Control()->appendInst(
657 InstFcmp::create(Func, InstFcmp::Ult, TmpDest, Left, Right)); 671 InstFcmp::create(Func, InstFcmp::Ult, TmpDest, Left, Right));
672 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
658 Control()->appendInst( 673 Control()->appendInst(
659 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 674 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
660 break; 675 break;
661 } 676 }
662 case kExprF32Ge: 677 case kExprF32Ge:
663 case kExprF64Ge: { 678 case kExprF64Ge: {
664 auto *TmpDest = makeVariable(IceType_i1); 679 auto *TmpDest = makeVariable(IceType_i1);
665 Control()->appendInst( 680 Control()->appendInst(
666 InstFcmp::create(Func, InstFcmp::Uge, TmpDest, Left, Right)); 681 InstFcmp::create(Func, InstFcmp::Uge, TmpDest, Left, Right));
682 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
667 Control()->appendInst( 683 Control()->appendInst(
668 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 684 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
669 break; 685 break;
670 } 686 }
671 case kExprF32Gt: 687 case kExprF32Gt:
672 case kExprF64Gt: { 688 case kExprF64Gt: {
673 auto *TmpDest = makeVariable(IceType_i1); 689 auto *TmpDest = makeVariable(IceType_i1);
674 Control()->appendInst( 690 Control()->appendInst(
675 InstFcmp::create(Func, InstFcmp::Ugt, TmpDest, Left, Right)); 691 InstFcmp::create(Func, InstFcmp::Ugt, TmpDest, Left, Right));
692 llvm::cast<BooleanVariable>(Dest)->setBoolSource(TmpDest);
676 Control()->appendInst( 693 Control()->appendInst(
677 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 694 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
678 break; 695 break;
679 } 696 }
680 default: 697 default:
681 LOG(out << "Unknown binop: " << WasmOpcodes::OpcodeName(Opcode) << "\n"); 698 LOG(out << "Unknown binop: " << WasmOpcodes::OpcodeName(Opcode) << "\n");
682 llvm::report_fatal_error("Uncovered or invalid binop."); 699 llvm::report_fatal_error("Uncovered or invalid binop.");
683 return OperandNode(nullptr); 700 return OperandNode(nullptr);
684 } 701 }
685 LOG(out << Dest << "\n"); 702 LOG(out << Dest << "\n");
686 return OperandNode(Dest); 703 return OperandNode(Dest);
687 } 704 }
688 Node Unop(wasm::WasmOpcode Opcode, Node Input) { 705 Node Unop(wasm::WasmOpcode Opcode, Node Input) {
689 LOG(out << "Unop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Input 706 LOG(out << "Unop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Input
690 << ") = "); 707 << ") = ");
691 Ice::Variable *Dest = nullptr; 708 Ice::Variable *Dest = nullptr;
692 switch (Opcode) { 709 switch (Opcode) {
693 // TODO (eholk): merge these next two cases using getConstantInteger 710 // TODO (eholk): merge these next two cases using getConstantInteger
694 case kExprI32Eqz: { 711 case kExprI32Eqz: {
695 Dest = makeVariable(IceType_i32); 712 Dest = makeVariable<BooleanVariable>(IceType_i32);
696 auto *Tmp = makeVariable(IceType_i1); 713 auto *Tmp = makeVariable(IceType_i1);
697 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input, 714 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input,
698 Ctx->getConstantInt32(0))); 715 Ctx->getConstantInt32(0)));
716 llvm::cast<BooleanVariable>(Dest)->setBoolSource(Tmp);
699 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp)); 717 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp));
700 break; 718 break;
701 } 719 }
702 case kExprI64Eqz: { 720 case kExprI64Eqz: {
703 Dest = makeVariable(IceType_i32); 721 Dest = makeVariable<BooleanVariable>(IceType_i32);
704 auto *Tmp = makeVariable(IceType_i1); 722 auto *Tmp = makeVariable(IceType_i1);
705 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input, 723 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input,
706 Ctx->getConstantInt64(0))); 724 Ctx->getConstantInt64(0)));
725 llvm::cast<BooleanVariable>(Dest)->setBoolSource(Tmp);
707 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp)); 726 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp));
708 break; 727 break;
709 } 728 }
710 case kExprI32Ctz: { 729 case kExprI32Ctz: {
711 Dest = makeVariable(IceType_i32); 730 Dest = makeVariable(IceType_i32);
712 const auto FnName = Ctx->getGlobalString("llvm.cttz.i32"); 731 const auto FnName = Ctx->getGlobalString("llvm.cttz.i32");
713 bool BadInstrinsic = false; 732 bool BadInstrinsic = false;
714 const auto *Info = Ctx->getIntrinsicsInfo().find(FnName, BadInstrinsic); 733 const auto *Info = Ctx->getIntrinsicsInfo().find(FnName, BadInstrinsic);
715 assert(!BadInstrinsic); 734 assert(!BadInstrinsic);
716 assert(Info); 735 assert(Info);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 960
942 // save control here because true_node appears to alias control. 961 // save control here because true_node appears to alias control.
943 auto *Ctrl = Control(); 962 auto *Ctrl = Control();
944 963
945 *TrueNode = OperandNode(Func->makeNode()); 964 *TrueNode = OperandNode(Func->makeNode());
946 *FalseNode = OperandNode(Func->makeNode()); 965 *FalseNode = OperandNode(Func->makeNode());
947 966
948 LOG(out << *TrueNode << ", " << *FalseNode << ")" 967 LOG(out << *TrueNode << ", " << *FalseNode << ")"
949 << "\n"); 968 << "\n");
950 969
951 auto *CondBool = makeVariable(IceType_i1); 970 auto *CondBool = Cond.toOperand()->asBoolean();
952 Ctrl->appendInst(InstIcmp::create(Func, InstIcmp::Ne, CondBool, Cond, 971 if (!CondBool) {
953 Ctx->getConstantInt32(0))); 972 CondBool = makeVariable(IceType_i1);
973 Ctrl->appendInst(InstIcmp::create(Func, InstIcmp::Ne, CondBool, Cond,
974 Ctx->getConstantInt32(0)));
975 }
954 976
955 Ctrl->appendInst(InstBr::create(Func, CondBool, *TrueNode, *FalseNode)); 977 Ctrl->appendInst(InstBr::create(Func, CondBool, *TrueNode, *FalseNode));
956 return OperandNode(nullptr); 978 return OperandNode(nullptr);
957 } 979 }
958 InstSwitch *CurrentSwitch = nullptr; 980 InstSwitch *CurrentSwitch = nullptr;
959 CfgNode *SwitchNode = nullptr; 981 CfgNode *SwitchNode = nullptr;
960 SizeT SwitchIndex = 0; 982 SizeT SwitchIndex = 0;
961 Node Switch(uint32_t Count, Node Key) { 983 Node Switch(uint32_t Count, Node Key) {
962 LOG(out << "Switch(" << Count << ", " << Key << ")\n"); 984 LOG(out << "Switch(" << Count << ", " << Key << ")\n");
963 985
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 return nullptr; 1293 return nullptr;
1272 } 1294 }
1273 return Iter->second; 1295 return Iter->second;
1274 } 1296 }
1275 1297
1276 void setDefiningInst(Operand *Op, InstPhi *Phi) { 1298 void setDefiningInst(Operand *Op, InstPhi *Phi) {
1277 LOG(out << "\n== setDefiningInst(" << Op << ", " << Phi << ") ==\n"); 1299 LOG(out << "\n== setDefiningInst(" << Op << ", " << Phi << ") ==\n");
1278 PhiMap.emplace(Op, Phi); 1300 PhiMap.emplace(Op, Phi);
1279 } 1301 }
1280 1302
1281 Ice::Variable *makeVariable(Ice::Type Type) { 1303 template <typename T = Ice::Variable> T *makeVariable(Ice::Type Type) {
1282 return makeVariable(Type, Control()); 1304 return makeVariable<T>(Type, Control());
1283 } 1305 }
1284 1306
1285 Ice::Variable *makeVariable(Ice::Type Type, CfgNode *DefNode) { 1307 template <typename T = Ice::Variable>
1286 auto *Var = Func->makeVariable(Type); 1308 T *makeVariable(Ice::Type Type, CfgNode *DefNode) {
1309 auto *Var = Func->makeVariable<T>(Type);
1287 DefNodeMap.emplace(Var, DefNode); 1310 DefNodeMap.emplace(Var, DefNode);
1288 return Var; 1311 return Var;
1289 } 1312 }
1290 1313
1291 CfgNode *getDefNode(Operand *Op) const { 1314 CfgNode *getDefNode(Operand *Op) const {
1292 const auto &Iter = DefNodeMap.find(Op); 1315 const auto &Iter = DefNodeMap.find(Op);
1293 if (Iter == DefNodeMap.end()) { 1316 if (Iter == DefNodeMap.end()) {
1294 return nullptr; 1317 return nullptr;
1295 } 1318 }
1296 return Iter->second; 1319 return Iter->second;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 ConstZeroBase = (0 == RealOffset); 1376 ConstZeroBase = (0 == RealOffset);
1354 } else if (0 != Offset) { 1377 } else if (0 != Offset) {
1355 auto *Addr = makeVariable(Ice::getPointerType()); 1378 auto *Addr = makeVariable(Ice::getPointerType());
1356 auto *OffsetConstant = Ctx->getConstantInt32(Offset); 1379 auto *OffsetConstant = Ctx->getConstantInt32(Offset);
1357 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Add, 1380 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Add,
1358 Addr, Base, OffsetConstant)); 1381 Addr, Base, OffsetConstant));
1359 1382
1360 Base = Addr; 1383 Base = Addr;
1361 } 1384 }
1362 1385
1363 // Do the bounds check. 1386 // Do the bounds check if enabled
1364 // 1387 if (!getFlags().getWasmNoBoundsCheck() &&
1365 // TODO (eholk): Add a command line argument to control whether bounds 1388 !llvm::dyn_cast<ConstantInteger32>(Base)) {
Jim Stichnoth 2016/05/06 20:37:51 Use isa<> instead of !dyn_cast<> here.
Eric Holk 2016/05/06 20:56:21 Done.
1366 // checks are inserted, and maybe add a way to duplicate bounds checks to
1367 // get a better sense of the overhead.
1368 if (!llvm::dyn_cast<ConstantInteger32>(Base)) {
1369 // TODO (eholk): creating a new basic block on every memory access is 1389 // TODO (eholk): creating a new basic block on every memory access is
1370 // terrible (see https://goo.gl/Zj7DTr). Try adding a new instruction that 1390 // terrible (see https://goo.gl/Zj7DTr). Try adding a new instruction that
1371 // encapsulates this "abort if false" pattern. 1391 // encapsulates this "abort if false" pattern.
1372 auto *CheckPassed = Func->makeNode(); 1392 auto *CheckPassed = Func->makeNode();
1373 auto *CheckFailed = getBoundsFailTarget(); 1393 auto *CheckFailed = getBoundsFailTarget();
1374 1394
1375 auto *Check = makeVariable(IceType_i1); 1395 auto *Check = makeVariable(IceType_i1);
1376 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Ult, Check, Base, 1396 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Ult, Check, Base,
1377 Ctx->getConstantInt32(MemSize))); 1397 Ctx->getConstantInt32(MemSize)));
1378 Control()->appendInst( 1398 Control()->appendInst(
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 Func->setFunctionName(Ctx->getGlobalString(FnName)); 1634 Func->setFunctionName(Ctx->getGlobalString(FnName));
1615 } 1635 }
1616 Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func))); 1636 Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func)));
1617 LOG(out << "done.\n"); 1637 LOG(out << "done.\n");
1618 } 1638 }
1619 1639
1620 return; 1640 return;
1621 } 1641 }
1622 1642
1623 #endif // ALLOW_WASM 1643 #endif // ALLOW_WASM
OLDNEW
« src/IceClFlags.def ('K') | « src/IceOperand.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698