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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 794823002: Remove using LLVM tools to check correctness of cast operation. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Try once more. Created 6 years 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
« no previous file with comments | « src/IceInst.cpp ('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/PNaClTranslator.cpp - ICE from bitcode -----------------===// 1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements the PNaCl bitcode file to Ice, to machine code 10 // This file implements the PNaCl bitcode file to Ice, to machine code
(...skipping 1586 matching lines...) Expand 10 before | Expand all | Expand 10 after
1597 return isValidIntegerLogicalOp(Op, Ty); 1597 return isValidIntegerLogicalOp(Op, Ty);
1598 case naclbitc::BINOP_OR: 1598 case naclbitc::BINOP_OR:
1599 Op = Ice::InstArithmetic::Or; 1599 Op = Ice::InstArithmetic::Or;
1600 return isValidIntegerLogicalOp(Op, Ty); 1600 return isValidIntegerLogicalOp(Op, Ty);
1601 case naclbitc::BINOP_XOR: 1601 case naclbitc::BINOP_XOR:
1602 Op = Ice::InstArithmetic::Xor; 1602 Op = Ice::InstArithmetic::Xor;
1603 return isValidIntegerLogicalOp(Op, Ty); 1603 return isValidIntegerLogicalOp(Op, Ty);
1604 } 1604 }
1605 } 1605 }
1606 1606
1607 /// Converts an LLVM cast opcode LLVMCastOp to the corresponding Ice 1607 /// Simplifies out vector types from Type1 and Type2, if both are vectors
1608 /// cast opcode and assigns to CastKind. Returns true if successful, 1608 /// of the same size.
1609 /// false otherwise. 1609 void simplifyOutCommonVectorType(Ice::Type &Type1, Ice::Type &Type2) const {
Jim Stichnoth 2014/12/12 22:47:54 All of these new functions, up to and including is
Karl 2014/12/15 17:40:18 Done.
1610 bool convertLLVMCastOpToIceOp(Instruction::CastOps LLVMCastOp, 1610 bool IsType1Vector = isVectorType(Type1);
1611 Ice::InstCast::OpKind &CastKind) const { 1611 bool IsType2Vector = isVectorType(Type2);
1612 switch (LLVMCastOp) { 1612 if (IsType1Vector != IsType2Vector)
1613 case Instruction::ZExt: 1613 return;
1614 CastKind = Ice::InstCast::Zext; 1614 if (IsType1Vector) {
1615 break; 1615 if (typeNumElements(Type1) != typeNumElements(Type2))
1616 case Instruction::SExt: 1616 return;
1617 CastKind = Ice::InstCast::Sext; 1617 Type1 = typeElementType(Type1);
1618 break; 1618 Type2 = typeElementType(Type2);
1619 case Instruction::Trunc: 1619 }
1620 CastKind = Ice::InstCast::Trunc; 1620 }
1621 break; 1621
1622 case Instruction::FPTrunc: 1622 /// Returns true iff an integer truncation from SourceType to TargetType is
1623 CastKind = Ice::InstCast::Fptrunc; 1623 /// valid.
1624 break; 1624 bool isIntTruncCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
1625 case Instruction::FPExt: 1625 if (!(Ice::isIntegerType(SourceType) && Ice::isIntegerType(TargetType)))
1626 CastKind = Ice::InstCast::Fpext;
1627 break;
1628 case Instruction::FPToSI:
1629 CastKind = Ice::InstCast::Fptosi;
1630 break;
1631 case Instruction::FPToUI:
1632 CastKind = Ice::InstCast::Fptoui;
1633 break;
1634 case Instruction::SIToFP:
1635 CastKind = Ice::InstCast::Sitofp;
1636 break;
1637 case Instruction::UIToFP:
1638 CastKind = Ice::InstCast::Uitofp;
1639 break;
1640 case Instruction::BitCast:
1641 CastKind = Ice::InstCast::Bitcast;
1642 break;
1643 default:
1644 return false; 1626 return false;
1627 simplifyOutCommonVectorType(SourceType, TargetType);
1628 return Ice::getScalarIntBitWidth(SourceType) >
jvoung (off chromium) 2014/12/12 23:46:45 nit: One of the getScalarIntBitWidth is prefixed w
Karl 2014/12/15 17:40:18 Good point. When I factored this out, I forgot to
1629 getScalarIntBitWidth(TargetType);
1630 }
1631
1632 /// Returns true iff a floating type truncation form SoruceType to TargetType
Jim Stichnoth 2014/12/12 22:47:54 SourceType
Karl 2014/12/15 17:40:18 Done. Also fixed "form" -> "from".
1633 /// is valid.
1634 bool isFloatTruncCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
1635 if (!(Ice::isFloatingType(SourceType) && Ice::isFloatingType(TargetType)))
1636 return false;
1637 simplifyOutCommonVectorType(SourceType, TargetType);
1638 return SourceType == Ice::IceType_f64 and TargetType == Ice::IceType_f32;
Jim Stichnoth 2014/12/12 22:47:54 "and"? wow.
Karl 2014/12/15 17:40:18 Done.
1639 }
1640
1641 /// Returns true iff an integer extension from SourceType to TargetType is
1642 /// valid.
1643 bool isIntExtCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
1644 return isIntTruncCastValid(TargetType, SourceType);
1645 }
1646
1647 /// Returns true iff a floating type extension form SourceType to TargetType
Jim Stichnoth 2014/12/12 22:47:54 from
Karl 2014/12/15 17:40:18 Done.
1648 /// is valid.
1649 bool isFloatExtCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
1650 return isFloatTruncCastValid(TargetType, SourceType);
1651 }
1652
1653 /// Returns true if a floating type SourceType to integer type TargetType
Jim Stichnoth 2014/12/12 22:47:54 Use "iff" for consistency? Also, I think the word
Karl 2014/12/15 17:40:18 Done and Done.
1654 /// is valid.
1655 bool isFPToICastValid(Ice::Type SourceType, Ice::Type TargetType) const {
Jim Stichnoth 2014/12/12 22:47:54 name it isFloatToIntCastValid for consistency?
Karl 2014/12/15 17:40:18 Done.
1656 if (!(Ice::isFloatingType(SourceType) && Ice::isIntegerType(TargetType)))
1657 return false;
1658 bool IsSourceVector = isVectorType(SourceType);
1659 bool IsTargetVector = isVectorType(TargetType);
1660 if (IsSourceVector != IsTargetVector)
1661 return false;
1662 if (IsSourceVector) {
1663 if (typeNumElements(SourceType) != typeNumElements(TargetType))
Jim Stichnoth 2014/12/12 22:47:54 Might be better to just use: return typeNumEleme
Karl 2014/12/15 17:40:18 Done.
1664 return false;
1645 } 1665 }
1646 return true; 1666 return true;
1647 } 1667 }
1648 1668
1669 /// Returns true iff an integer type SourceType to floating type TargetType
Jim Stichnoth 2014/12/12 22:47:55 add "cast" to the comment?
Karl 2014/12/15 17:40:18 Done.
1670 /// is valid.
1671 bool isIToFPCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
Jim Stichnoth 2014/12/12 22:47:55 suggest isIntToFloatCastValid
Karl 2014/12/15 17:40:18 Done.
1672 return isFPToICastValid(TargetType, SourceType);
1673 }
1674
1675 /// Returns the number of bits used to model type Ty when defining the
1676 /// bitcast instruction.
1677 Ice::SizeT bitcastSizeInBits(Ice::Type Ty) const {
1678 if (Ice::isVectorType(Ty))
1679 return Ice::typeNumElements(Ty) *
1680 bitcastSizeInBits(Ice::typeElementType(Ty));
1681 if (Ty == Ice::IceType_i1)
1682 return 1;
1683 return Ice::typeWidthInBytes(Ty) * CHAR_BIT;
1684 }
1685
1686 /// Returns true if a bitcast from SourceType to TargetType is allowed.
1687 bool isBitcastCastValid(Ice::Type SourceType, Ice::Type TargetType) const {
Jim Stichnoth 2014/12/12 22:47:54 maybe just call it isBitcastValid()?
Karl 2014/12/15 17:40:18 Done.
1688 return bitcastSizeInBits(SourceType) == bitcastSizeInBits(TargetType);
1689 }
1690
1691 /// Returns true if the NaCl bitcode Opcode is a valid cast opcode
1692 /// for converting SourceType to TargetType. Updates CastKind to the
1693 /// corresponding instruction cast opcode. Also generates error message
Jim Stichnoth 2014/12/12 22:47:54 generates *an* error message
Karl 2014/12/15 17:40:19 Done.
1694 /// if function returns false.
Jim Stichnoth 2014/12/12 22:47:55 what function?
Karl 2014/12/15 17:40:18 Added "this" and replaced "if" with "when".
1695 bool convertCastOpToIceOp(uint64_t Opcode, Ice::Type SourceType,
1696 Ice::Type TargetType,
1697 Ice::InstCast::OpKind &CastKind) {
1698 bool Result;
1699 switch (Opcode) {
1700 default: {
1701 std::string Buffer;
1702 raw_string_ostream StrBuf(Buffer);
1703 StrBuf << "Cast opcode " << Opcode << " not understood.\n";
1704 Error(StrBuf.str());
1705 // TODO(kschimpf) Remove error recovery once implementation complete.
1706 CastKind = Ice::InstCast::Bitcast;
1707 return false;
1708 }
1709 case naclbitc::CAST_TRUNC:
1710 CastKind = Ice::InstCast::Trunc;
1711 Result = isIntTruncCastValid(SourceType, TargetType);
1712 break;
1713 case naclbitc::CAST_ZEXT:
1714 CastKind = Ice::InstCast::Zext;
1715 Result = isIntExtCastValid(SourceType, TargetType);
1716 break;
1717 case naclbitc::CAST_SEXT:
1718 CastKind = Ice::InstCast::Sext;
1719 Result = isIntExtCastValid(SourceType, TargetType);
1720 break;
1721 case naclbitc::CAST_FPTOUI:
1722 CastKind = Ice::InstCast::Fptoui;
1723 Result = isFPToICastValid(SourceType, TargetType);
1724 break;
1725 case naclbitc::CAST_FPTOSI:
1726 CastKind = Ice::InstCast::Fptosi;
1727 Result = isFPToICastValid(SourceType, TargetType);
1728 break;
1729 case naclbitc::CAST_UITOFP:
1730 CastKind = Ice::InstCast::Uitofp;
1731 Result = isIToFPCastValid(SourceType, TargetType);
1732 break;
1733 case naclbitc::CAST_SITOFP:
1734 CastKind = Ice::InstCast::Sitofp;
1735 Result = isIToFPCastValid(SourceType, TargetType);
1736 break;
1737 case naclbitc::CAST_FPTRUNC:
1738 CastKind = Ice::InstCast::Fptrunc;
1739 Result = isFloatTruncCastValid(SourceType, TargetType);
1740 break;
1741 case naclbitc::CAST_FPEXT:
1742 CastKind = Ice::InstCast::Fpext;
1743 Result = isFloatExtCastValid(SourceType, TargetType);
1744 break;
1745 case naclbitc::CAST_BITCAST:
1746 CastKind = Ice::InstCast::Bitcast;
1747 Result = isBitcastCastValid(SourceType, TargetType);
1748 break;
1749 }
1750 if (!Result) {
1751 std::string Buffer;
1752 raw_string_ostream StrBuf(Buffer);
1753 StrBuf << "Illegal cast: " << Ice::InstCast::getCastName(CastKind) << " "
1754 << SourceType << " to " << TargetType;
1755 Error(StrBuf.str());
1756 }
1757 return Result;
1758 }
1759
1649 // Converts PNaCl bitcode Icmp operator to corresponding ICE op. 1760 // Converts PNaCl bitcode Icmp operator to corresponding ICE op.
1650 // Returns true if able to convert, false otherwise. 1761 // Returns true if able to convert, false otherwise.
1651 bool convertNaClBitcICmpOpToIce(uint64_t Op, 1762 bool convertNaClBitcICmpOpToIce(uint64_t Op,
1652 Ice::InstIcmp::ICond &Cond) const { 1763 Ice::InstIcmp::ICond &Cond) const {
1653 switch (Op) { 1764 switch (Op) {
1654 case naclbitc::ICMP_EQ: 1765 case naclbitc::ICMP_EQ:
1655 Cond = Ice::InstIcmp::Eq; 1766 Cond = Ice::InstIcmp::Eq;
1656 return true; 1767 return true;
1657 case naclbitc::ICMP_NE: 1768 case naclbitc::ICMP_NE:
1658 Cond = Ice::InstIcmp::Ne; 1769 Cond = Ice::InstIcmp::Ne;
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1869 CurrentNode->appendInst(Ice::InstArithmetic::create( 1980 CurrentNode->appendInst(Ice::InstArithmetic::create(
1870 Func, Opcode, getNextInstVar(Type1), Op1, Op2)); 1981 Func, Opcode, getNextInstVar(Type1), Op1, Op2));
1871 return; 1982 return;
1872 } 1983 }
1873 case naclbitc::FUNC_CODE_INST_CAST: { 1984 case naclbitc::FUNC_CODE_INST_CAST: {
1874 // CAST: [opval, destty, castopc] 1985 // CAST: [opval, destty, castopc]
1875 if (!isValidRecordSize(3, "cast")) 1986 if (!isValidRecordSize(3, "cast"))
1876 return; 1987 return;
1877 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex); 1988 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex);
1878 Ice::Type CastType = Context->getSimpleTypeByID(Values[1]); 1989 Ice::Type CastType = Context->getSimpleTypeByID(Values[1]);
1879 Instruction::CastOps LLVMCastOp;
1880 Ice::InstCast::OpKind CastKind; 1990 Ice::InstCast::OpKind CastKind;
1881 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) ||
1882 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) {
1883 std::string Buffer;
1884 raw_string_ostream StrBuf(Buffer);
1885 StrBuf << "Cast opcode not understood: " << Values[2];
1886 Error(StrBuf.str());
1887 appendErrorInstruction(CastType);
1888 return;
1889 }
1890 if (isIRGenerationDisabled()) { 1991 if (isIRGenerationDisabled()) {
1891 assert(Src == nullptr); 1992 assert(Src == nullptr);
1892 setNextLocalInstIndex(nullptr); 1993 setNextLocalInstIndex(nullptr);
1893 return; 1994 return;
1894 } 1995 }
1895 Ice::Type SrcType = Src->getType(); 1996 if (!convertCastOpToIceOp(Values[2], Src->getType(), CastType, CastKind)) {
1896 if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType),
1897 Context->convertToLLVMType(CastType))) {
1898 std::string Buffer;
1899 raw_string_ostream StrBuf(Buffer);
1900 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp)
1901 << " " << SrcType << " to " << CastType;
1902 Error(StrBuf.str());
1903 appendErrorInstruction(CastType); 1997 appendErrorInstruction(CastType);
1904 return; 1998 return;
1905 } 1999 }
1906 CurrentNode->appendInst( 2000 CurrentNode->appendInst(
1907 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src)); 2001 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src));
1908 return; 2002 return;
1909 } 2003 }
1910 case naclbitc::FUNC_CODE_INST_VSELECT: { 2004 case naclbitc::FUNC_CODE_INST_VSELECT: {
1911 // VSELECT: [opval, opval, pred] 2005 // VSELECT: [opval, opval, pred]
1912 if (!isValidRecordSize(3, "select")) 2006 if (!isValidRecordSize(3, "select"))
(...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after
2938 3032
2939 if (TopLevelBlocks != 1) { 3033 if (TopLevelBlocks != 1) {
2940 errs() << IRFilename 3034 errs() << IRFilename
2941 << ": Contains more than one module. Found: " << TopLevelBlocks 3035 << ": Contains more than one module. Found: " << TopLevelBlocks
2942 << "\n"; 3036 << "\n";
2943 ErrorStatus = true; 3037 ErrorStatus = true;
2944 } 3038 }
2945 } 3039 }
2946 3040
2947 } // end of namespace Ice 3041 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceInst.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698