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

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: Code review feedback 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 BooleanVariable *BoolDest = nullptr;
397 isComparison(Opcode) ? IceType_i32 : Left.toOperand()->getType()); 397 Ice::Variable *Dest = nullptr;
Jim Stichnoth 2016/05/06 21:09:17 s/Ice::Variable/Variable/
Eric Holk 2016/05/06 21:28:15 Done. I had to add `using Variable = Ice::Variable
398 if (isComparison(Opcode)) {
399 BoolDest = makeVariable<BooleanVariable>(IceType_i32);
400 Dest = BoolDest;
401 } else {
402 Dest = makeVariable(Left.toOperand()->getType());
403 }
398 switch (Opcode) { 404 switch (Opcode) {
399 case kExprI32Add: 405 case kExprI32Add:
400 case kExprI64Add: 406 case kExprI64Add:
401 Control()->appendInst( 407 Control()->appendInst(
402 InstArithmetic::create(Func, InstArithmetic::Add, Dest, Left, Right)); 408 InstArithmetic::create(Func, InstArithmetic::Add, Dest, Left, Right));
403 break; 409 break;
404 case kExprF32Add: 410 case kExprF32Add:
405 case kExprF64Add: 411 case kExprF64Add:
406 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Fadd, 412 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Fadd,
407 Dest, Left, Right)); 413 Dest, Left, Right));
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 case kExprI32And: 537 case kExprI32And:
532 case kExprI64And: 538 case kExprI64And:
533 Control()->appendInst( 539 Control()->appendInst(
534 InstArithmetic::create(Func, InstArithmetic::And, Dest, Left, Right)); 540 InstArithmetic::create(Func, InstArithmetic::And, Dest, Left, Right));
535 break; 541 break;
536 case kExprI32Ne: 542 case kExprI32Ne:
537 case kExprI64Ne: { 543 case kExprI64Ne: {
538 auto *TmpDest = makeVariable(IceType_i1); 544 auto *TmpDest = makeVariable(IceType_i1);
539 Control()->appendInst( 545 Control()->appendInst(
540 InstIcmp::create(Func, InstIcmp::Ne, TmpDest, Left, Right)); 546 InstIcmp::create(Func, InstIcmp::Ne, TmpDest, Left, Right));
547 BoolDest->setBoolSource(TmpDest);
541 Control()->appendInst( 548 Control()->appendInst(
542 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 549 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
543 break; 550 break;
544 } 551 }
545 case kExprI32Eq: 552 case kExprI32Eq:
546 case kExprI64Eq: { 553 case kExprI64Eq: {
547 auto *TmpDest = makeVariable(IceType_i1); 554 auto *TmpDest = makeVariable(IceType_i1);
548 Control()->appendInst( 555 Control()->appendInst(
549 InstIcmp::create(Func, InstIcmp::Eq, TmpDest, Left, Right)); 556 InstIcmp::create(Func, InstIcmp::Eq, TmpDest, Left, Right));
557 BoolDest->setBoolSource(TmpDest);
550 Control()->appendInst( 558 Control()->appendInst(
551 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 559 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
552 break; 560 break;
553 } 561 }
554 case kExprI32LtS: 562 case kExprI32LtS:
555 case kExprI64LtS: { 563 case kExprI64LtS: {
556 auto *TmpDest = makeVariable(IceType_i1); 564 auto *TmpDest = makeVariable(IceType_i1);
557 Control()->appendInst( 565 Control()->appendInst(
558 InstIcmp::create(Func, InstIcmp::Slt, TmpDest, Left, Right)); 566 InstIcmp::create(Func, InstIcmp::Slt, TmpDest, Left, Right));
567 BoolDest->setBoolSource(TmpDest);
559 Control()->appendInst( 568 Control()->appendInst(
560 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 569 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
561 break; 570 break;
562 } 571 }
563 case kExprI32LeS: 572 case kExprI32LeS:
564 case kExprI64LeS: { 573 case kExprI64LeS: {
565 auto *TmpDest = makeVariable(IceType_i1); 574 auto *TmpDest = makeVariable(IceType_i1);
566 Control()->appendInst( 575 Control()->appendInst(
567 InstIcmp::create(Func, InstIcmp::Sle, TmpDest, Left, Right)); 576 InstIcmp::create(Func, InstIcmp::Sle, TmpDest, Left, Right));
577 BoolDest->setBoolSource(TmpDest);
568 Control()->appendInst( 578 Control()->appendInst(
569 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 579 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
570 break; 580 break;
571 } 581 }
572 case kExprI32GeU: 582 case kExprI32GeU:
573 case kExprI64GeU: { 583 case kExprI64GeU: {
574 auto *TmpDest = makeVariable(IceType_i1); 584 auto *TmpDest = makeVariable(IceType_i1);
575 Control()->appendInst( 585 Control()->appendInst(
576 InstIcmp::create(Func, InstIcmp::Uge, TmpDest, Left, Right)); 586 InstIcmp::create(Func, InstIcmp::Uge, TmpDest, Left, Right));
587 BoolDest->setBoolSource(TmpDest);
577 Control()->appendInst( 588 Control()->appendInst(
578 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 589 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
579 break; 590 break;
580 } 591 }
581 case kExprI32LeU: 592 case kExprI32LeU:
582 case kExprI64LeU: { 593 case kExprI64LeU: {
583 auto *TmpDest = makeVariable(IceType_i1); 594 auto *TmpDest = makeVariable(IceType_i1);
584 Control()->appendInst( 595 Control()->appendInst(
585 InstIcmp::create(Func, InstIcmp::Ule, TmpDest, Left, Right)); 596 InstIcmp::create(Func, InstIcmp::Ule, TmpDest, Left, Right));
597 BoolDest->setBoolSource(TmpDest);
586 Control()->appendInst( 598 Control()->appendInst(
587 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 599 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
588 break; 600 break;
589 } 601 }
590 case kExprI32LtU: 602 case kExprI32LtU:
591 case kExprI64LtU: { 603 case kExprI64LtU: {
592 auto *TmpDest = makeVariable(IceType_i1); 604 auto *TmpDest = makeVariable(IceType_i1);
593 Control()->appendInst( 605 Control()->appendInst(
594 InstIcmp::create(Func, InstIcmp::Ult, TmpDest, Left, Right)); 606 InstIcmp::create(Func, InstIcmp::Ult, TmpDest, Left, Right));
607 BoolDest->setBoolSource(TmpDest);
595 Control()->appendInst( 608 Control()->appendInst(
596 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 609 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
597 break; 610 break;
598 } 611 }
599 case kExprI32GeS: 612 case kExprI32GeS:
600 case kExprI64GeS: { 613 case kExprI64GeS: {
601 auto *TmpDest = makeVariable(IceType_i1); 614 auto *TmpDest = makeVariable(IceType_i1);
602 Control()->appendInst( 615 Control()->appendInst(
603 InstIcmp::create(Func, InstIcmp::Sge, TmpDest, Left, Right)); 616 InstIcmp::create(Func, InstIcmp::Sge, TmpDest, Left, Right));
617 BoolDest->setBoolSource(TmpDest);
604 Control()->appendInst( 618 Control()->appendInst(
605 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 619 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
606 break; 620 break;
607 } 621 }
608 case kExprI32GtS: 622 case kExprI32GtS:
609 case kExprI64GtS: { 623 case kExprI64GtS: {
610 auto *TmpDest = makeVariable(IceType_i1); 624 auto *TmpDest = makeVariable(IceType_i1);
611 Control()->appendInst( 625 Control()->appendInst(
612 InstIcmp::create(Func, InstIcmp::Sgt, TmpDest, Left, Right)); 626 InstIcmp::create(Func, InstIcmp::Sgt, TmpDest, Left, Right));
627 BoolDest->setBoolSource(TmpDest);
613 Control()->appendInst( 628 Control()->appendInst(
614 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 629 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
615 break; 630 break;
616 } 631 }
617 case kExprI32GtU: 632 case kExprI32GtU:
618 case kExprI64GtU: { 633 case kExprI64GtU: {
619 auto *TmpDest = makeVariable(IceType_i1); 634 auto *TmpDest = makeVariable(IceType_i1);
620 Control()->appendInst( 635 Control()->appendInst(
621 InstIcmp::create(Func, InstIcmp::Ugt, TmpDest, Left, Right)); 636 InstIcmp::create(Func, InstIcmp::Ugt, TmpDest, Left, Right));
637 BoolDest->setBoolSource(TmpDest);
622 Control()->appendInst( 638 Control()->appendInst(
623 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 639 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
624 break; 640 break;
625 } 641 }
626 case kExprF32Eq: 642 case kExprF32Eq:
627 case kExprF64Eq: { 643 case kExprF64Eq: {
628 auto *TmpDest = makeVariable(IceType_i1); 644 auto *TmpDest = makeVariable(IceType_i1);
629 Control()->appendInst( 645 Control()->appendInst(
630 InstFcmp::create(Func, InstFcmp::Ueq, TmpDest, Left, Right)); 646 InstFcmp::create(Func, InstFcmp::Ueq, TmpDest, Left, Right));
647 BoolDest->setBoolSource(TmpDest);
631 Control()->appendInst( 648 Control()->appendInst(
632 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 649 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
633 break; 650 break;
634 } 651 }
635 case kExprF32Ne: 652 case kExprF32Ne:
636 case kExprF64Ne: { 653 case kExprF64Ne: {
637 auto *TmpDest = makeVariable(IceType_i1); 654 auto *TmpDest = makeVariable(IceType_i1);
638 Control()->appendInst( 655 Control()->appendInst(
639 InstFcmp::create(Func, InstFcmp::Une, TmpDest, Left, Right)); 656 InstFcmp::create(Func, InstFcmp::Une, TmpDest, Left, Right));
657 BoolDest->setBoolSource(TmpDest);
640 Control()->appendInst( 658 Control()->appendInst(
641 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 659 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
642 break; 660 break;
643 } 661 }
644 case kExprF32Le: 662 case kExprF32Le:
645 case kExprF64Le: { 663 case kExprF64Le: {
646 auto *TmpDest = makeVariable(IceType_i1); 664 auto *TmpDest = makeVariable(IceType_i1);
647 Control()->appendInst( 665 Control()->appendInst(
648 InstFcmp::create(Func, InstFcmp::Ule, TmpDest, Left, Right)); 666 InstFcmp::create(Func, InstFcmp::Ule, TmpDest, Left, Right));
667 BoolDest->setBoolSource(TmpDest);
649 Control()->appendInst( 668 Control()->appendInst(
650 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 669 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
651 break; 670 break;
652 } 671 }
653 case kExprF32Lt: 672 case kExprF32Lt:
654 case kExprF64Lt: { 673 case kExprF64Lt: {
655 auto *TmpDest = makeVariable(IceType_i1); 674 auto *TmpDest = makeVariable(IceType_i1);
656 Control()->appendInst( 675 Control()->appendInst(
657 InstFcmp::create(Func, InstFcmp::Ult, TmpDest, Left, Right)); 676 InstFcmp::create(Func, InstFcmp::Ult, TmpDest, Left, Right));
677 BoolDest->setBoolSource(TmpDest);
658 Control()->appendInst( 678 Control()->appendInst(
659 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 679 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
660 break; 680 break;
661 } 681 }
662 case kExprF32Ge: 682 case kExprF32Ge:
663 case kExprF64Ge: { 683 case kExprF64Ge: {
664 auto *TmpDest = makeVariable(IceType_i1); 684 auto *TmpDest = makeVariable(IceType_i1);
665 Control()->appendInst( 685 Control()->appendInst(
666 InstFcmp::create(Func, InstFcmp::Uge, TmpDest, Left, Right)); 686 InstFcmp::create(Func, InstFcmp::Uge, TmpDest, Left, Right));
687 BoolDest->setBoolSource(TmpDest);
667 Control()->appendInst( 688 Control()->appendInst(
668 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 689 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
669 break; 690 break;
670 } 691 }
671 case kExprF32Gt: 692 case kExprF32Gt:
672 case kExprF64Gt: { 693 case kExprF64Gt: {
673 auto *TmpDest = makeVariable(IceType_i1); 694 auto *TmpDest = makeVariable(IceType_i1);
674 Control()->appendInst( 695 Control()->appendInst(
675 InstFcmp::create(Func, InstFcmp::Ugt, TmpDest, Left, Right)); 696 InstFcmp::create(Func, InstFcmp::Ugt, TmpDest, Left, Right));
697 BoolDest->setBoolSource(TmpDest);
676 Control()->appendInst( 698 Control()->appendInst(
677 InstCast::create(Func, InstCast::Zext, Dest, TmpDest)); 699 InstCast::create(Func, InstCast::Zext, Dest, TmpDest));
678 break; 700 break;
679 } 701 }
680 default: 702 default:
681 LOG(out << "Unknown binop: " << WasmOpcodes::OpcodeName(Opcode) << "\n"); 703 LOG(out << "Unknown binop: " << WasmOpcodes::OpcodeName(Opcode) << "\n");
682 llvm::report_fatal_error("Uncovered or invalid binop."); 704 llvm::report_fatal_error("Uncovered or invalid binop.");
683 return OperandNode(nullptr); 705 return OperandNode(nullptr);
684 } 706 }
685 LOG(out << Dest << "\n"); 707 LOG(out << Dest << "\n");
686 return OperandNode(Dest); 708 return OperandNode(Dest);
687 } 709 }
688 Node Unop(wasm::WasmOpcode Opcode, Node Input) { 710 Node Unop(wasm::WasmOpcode Opcode, Node Input) {
689 LOG(out << "Unop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Input 711 LOG(out << "Unop(" << WasmOpcodes::OpcodeName(Opcode) << ", " << Input
690 << ") = "); 712 << ") = ");
691 Ice::Variable *Dest = nullptr; 713 Ice::Variable *Dest = nullptr;
692 switch (Opcode) { 714 switch (Opcode) {
693 // TODO (eholk): merge these next two cases using getConstantInteger 715 // TODO (eholk): merge these next two cases using getConstantInteger
694 case kExprI32Eqz: { 716 case kExprI32Eqz: {
695 Dest = makeVariable(IceType_i32); 717 auto *BoolDest = makeVariable<BooleanVariable>(IceType_i32);
718 Dest = BoolDest;
696 auto *Tmp = makeVariable(IceType_i1); 719 auto *Tmp = makeVariable(IceType_i1);
697 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input, 720 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input,
698 Ctx->getConstantInt32(0))); 721 Ctx->getConstantInt32(0)));
722 BoolDest->setBoolSource(Tmp);
699 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp)); 723 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp));
700 break; 724 break;
701 } 725 }
702 case kExprI64Eqz: { 726 case kExprI64Eqz: {
703 Dest = makeVariable(IceType_i32); 727 auto *BoolDest = makeVariable<BooleanVariable>(IceType_i32);
728 Dest = BoolDest;
704 auto *Tmp = makeVariable(IceType_i1); 729 auto *Tmp = makeVariable(IceType_i1);
705 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input, 730 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Eq, Tmp, Input,
706 Ctx->getConstantInt64(0))); 731 Ctx->getConstantInt64(0)));
732 BoolDest->setBoolSource(Tmp);
707 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp)); 733 Control()->appendInst(InstCast::create(Func, InstCast::Zext, Dest, Tmp));
708 break; 734 break;
709 } 735 }
710 case kExprI32Ctz: { 736 case kExprI32Ctz: {
711 Dest = makeVariable(IceType_i32); 737 Dest = makeVariable(IceType_i32);
712 const auto FnName = Ctx->getGlobalString("llvm.cttz.i32"); 738 const auto FnName = Ctx->getGlobalString("llvm.cttz.i32");
713 bool BadInstrinsic = false; 739 bool BadInstrinsic = false;
714 const auto *Info = Ctx->getIntrinsicsInfo().find(FnName, BadInstrinsic); 740 const auto *Info = Ctx->getIntrinsicsInfo().find(FnName, BadInstrinsic);
715 assert(!BadInstrinsic); 741 assert(!BadInstrinsic);
716 assert(Info); 742 assert(Info);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 967
942 // save control here because true_node appears to alias control. 968 // save control here because true_node appears to alias control.
943 auto *Ctrl = Control(); 969 auto *Ctrl = Control();
944 970
945 *TrueNode = OperandNode(Func->makeNode()); 971 *TrueNode = OperandNode(Func->makeNode());
946 *FalseNode = OperandNode(Func->makeNode()); 972 *FalseNode = OperandNode(Func->makeNode());
947 973
948 LOG(out << *TrueNode << ", " << *FalseNode << ")" 974 LOG(out << *TrueNode << ", " << *FalseNode << ")"
949 << "\n"); 975 << "\n");
950 976
951 auto *CondBool = makeVariable(IceType_i1); 977 auto *CondBool = Cond.toOperand()->asBoolean();
952 Ctrl->appendInst(InstIcmp::create(Func, InstIcmp::Ne, CondBool, Cond, 978 if (!CondBool) {
Jim Stichnoth 2016/05/06 21:09:17 if (CondBool == nullptr)
Eric Holk 2016/05/06 21:28:15 Done.
953 Ctx->getConstantInt32(0))); 979 CondBool = makeVariable(IceType_i1);
980 Ctrl->appendInst(InstIcmp::create(Func, InstIcmp::Ne, CondBool, Cond,
981 Ctx->getConstantInt32(0)));
982 }
954 983
955 Ctrl->appendInst(InstBr::create(Func, CondBool, *TrueNode, *FalseNode)); 984 Ctrl->appendInst(InstBr::create(Func, CondBool, *TrueNode, *FalseNode));
956 return OperandNode(nullptr); 985 return OperandNode(nullptr);
957 } 986 }
958 InstSwitch *CurrentSwitch = nullptr; 987 InstSwitch *CurrentSwitch = nullptr;
959 CfgNode *SwitchNode = nullptr; 988 CfgNode *SwitchNode = nullptr;
960 SizeT SwitchIndex = 0; 989 SizeT SwitchIndex = 0;
961 Node Switch(uint32_t Count, Node Key) { 990 Node Switch(uint32_t Count, Node Key) {
962 LOG(out << "Switch(" << Count << ", " << Key << ")\n"); 991 LOG(out << "Switch(" << Count << ", " << Key << ")\n");
963 992
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 return nullptr; 1300 return nullptr;
1272 } 1301 }
1273 return Iter->second; 1302 return Iter->second;
1274 } 1303 }
1275 1304
1276 void setDefiningInst(Operand *Op, InstPhi *Phi) { 1305 void setDefiningInst(Operand *Op, InstPhi *Phi) {
1277 LOG(out << "\n== setDefiningInst(" << Op << ", " << Phi << ") ==\n"); 1306 LOG(out << "\n== setDefiningInst(" << Op << ", " << Phi << ") ==\n");
1278 PhiMap.emplace(Op, Phi); 1307 PhiMap.emplace(Op, Phi);
1279 } 1308 }
1280 1309
1281 Ice::Variable *makeVariable(Ice::Type Type) { 1310 template <typename T = Ice::Variable> T *makeVariable(Ice::Type Type) {
1282 return makeVariable(Type, Control()); 1311 return makeVariable<T>(Type, Control());
1283 } 1312 }
1284 1313
1285 Ice::Variable *makeVariable(Ice::Type Type, CfgNode *DefNode) { 1314 template <typename T = Ice::Variable>
1286 auto *Var = Func->makeVariable(Type); 1315 T *makeVariable(Ice::Type Type, CfgNode *DefNode) {
1316 auto *Var = Func->makeVariable<T>(Type);
1287 DefNodeMap.emplace(Var, DefNode); 1317 DefNodeMap.emplace(Var, DefNode);
1288 return Var; 1318 return Var;
1289 } 1319 }
1290 1320
1291 CfgNode *getDefNode(Operand *Op) const { 1321 CfgNode *getDefNode(Operand *Op) const {
1292 const auto &Iter = DefNodeMap.find(Op); 1322 const auto &Iter = DefNodeMap.find(Op);
1293 if (Iter == DefNodeMap.end()) { 1323 if (Iter == DefNodeMap.end()) {
1294 return nullptr; 1324 return nullptr;
1295 } 1325 }
1296 return Iter->second; 1326 return Iter->second;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 ConstZeroBase = (0 == RealOffset); 1383 ConstZeroBase = (0 == RealOffset);
1354 } else if (0 != Offset) { 1384 } else if (0 != Offset) {
1355 auto *Addr = makeVariable(Ice::getPointerType()); 1385 auto *Addr = makeVariable(Ice::getPointerType());
1356 auto *OffsetConstant = Ctx->getConstantInt32(Offset); 1386 auto *OffsetConstant = Ctx->getConstantInt32(Offset);
1357 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Add, 1387 Control()->appendInst(InstArithmetic::create(Func, InstArithmetic::Add,
1358 Addr, Base, OffsetConstant)); 1388 Addr, Base, OffsetConstant));
1359 1389
1360 Base = Addr; 1390 Base = Addr;
1361 } 1391 }
1362 1392
1363 // Do the bounds check. 1393 // Do the bounds check if enabled
1364 // 1394 if (getFlags().getWasmBoundsCheck() &&
1365 // TODO (eholk): Add a command line argument to control whether bounds 1395 !llvm::isa<ConstantInteger32>(Base)) {
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 1396 // 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 1397 // terrible (see https://goo.gl/Zj7DTr). Try adding a new instruction that
1371 // encapsulates this "abort if false" pattern. 1398 // encapsulates this "abort if false" pattern.
1372 auto *CheckPassed = Func->makeNode(); 1399 auto *CheckPassed = Func->makeNode();
1373 auto *CheckFailed = getBoundsFailTarget(); 1400 auto *CheckFailed = getBoundsFailTarget();
1374 1401
1375 auto *Check = makeVariable(IceType_i1); 1402 auto *Check = makeVariable(IceType_i1);
1376 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Ult, Check, Base, 1403 Control()->appendInst(InstIcmp::create(Func, InstIcmp::Ult, Check, Base,
1377 Ctx->getConstantInt32(MemSize))); 1404 Ctx->getConstantInt32(MemSize)));
1378 Control()->appendInst( 1405 Control()->appendInst(
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 Func->setFunctionName(Ctx->getGlobalString(FnName)); 1641 Func->setFunctionName(Ctx->getGlobalString(FnName));
1615 } 1642 }
1616 Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func))); 1643 Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func)));
1617 LOG(out << "done.\n"); 1644 LOG(out << "done.\n");
1618 } 1645 }
1619 1646
1620 return; 1647 return;
1621 } 1648 }
1622 1649
1623 #endif // ALLOW_WASM 1650 #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