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