Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |