[RISCV] Refactor conversion of B extensions to IR intrinsics a little to reduce clang binary size.

These all pass 1 type to getIntrinsic. So rather than assigning
IntrinsicTypes for each builtin which invokes the SmallVector
constructor, just select the intrinsic ID with a switch and
share a single assignment of IntrinsicTypes.
This commit is contained in:
Craig Topper 2021-04-02 23:34:14 -07:00
parent 2458aa0b91
commit b4f2e80600

View File

@ -17875,64 +17875,71 @@ Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned BuiltinID,
// Required for overloaded intrinsics.
llvm::SmallVector<llvm::Type *, 2> IntrinsicTypes;
switch (BuiltinID) {
#include "clang/Basic/riscv_vector_builtin_cg.inc"
// Zbb
default: llvm_unreachable("unexpected builtin ID");
case RISCV::BI__builtin_riscv_orc_b_32:
case RISCV::BI__builtin_riscv_orc_b_64:
ID = Intrinsic::riscv_orc_b;
IntrinsicTypes = {ResultType};
break;
// Zbc
case RISCV::BI__builtin_riscv_clmul:
ID = Intrinsic::riscv_clmul;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_clmulh:
ID = Intrinsic::riscv_clmulh;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_clmulr:
ID = Intrinsic::riscv_clmulr;
IntrinsicTypes = {ResultType};
break;
// Zbr
case RISCV::BI__builtin_riscv_crc32_b:
ID = Intrinsic::riscv_crc32_b;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32_h:
ID = Intrinsic::riscv_crc32_h;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32_w:
ID = Intrinsic::riscv_crc32_w;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32_d:
ID = Intrinsic::riscv_crc32_d;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32c_b:
ID = Intrinsic::riscv_crc32c_b;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32c_h:
ID = Intrinsic::riscv_crc32c_h;
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32c_w:
ID = Intrinsic::riscv_crc32c_w;
case RISCV::BI__builtin_riscv_crc32c_d: {
switch (BuiltinID) {
default: llvm_unreachable("unexpected builtin ID");
// Zbb
case RISCV::BI__builtin_riscv_orc_b_32:
case RISCV::BI__builtin_riscv_orc_b_64:
ID = Intrinsic::riscv_orc_b;
break;
// Zbc
case RISCV::BI__builtin_riscv_clmul:
ID = Intrinsic::riscv_clmul;
break;
case RISCV::BI__builtin_riscv_clmulh:
ID = Intrinsic::riscv_clmulh;
break;
case RISCV::BI__builtin_riscv_clmulr:
ID = Intrinsic::riscv_clmulr;
break;
// Zbr
case RISCV::BI__builtin_riscv_crc32_b:
ID = Intrinsic::riscv_crc32_b;
break;
case RISCV::BI__builtin_riscv_crc32_h:
ID = Intrinsic::riscv_crc32_h;
break;
case RISCV::BI__builtin_riscv_crc32_w:
ID = Intrinsic::riscv_crc32_w;
break;
case RISCV::BI__builtin_riscv_crc32_d:
ID = Intrinsic::riscv_crc32_d;
break;
case RISCV::BI__builtin_riscv_crc32c_b:
ID = Intrinsic::riscv_crc32c_b;
break;
case RISCV::BI__builtin_riscv_crc32c_h:
ID = Intrinsic::riscv_crc32c_h;
break;
case RISCV::BI__builtin_riscv_crc32c_w:
ID = Intrinsic::riscv_crc32c_w;
break;
case RISCV::BI__builtin_riscv_crc32c_d:
ID = Intrinsic::riscv_crc32c_d;
break;
}
IntrinsicTypes = {ResultType};
break;
case RISCV::BI__builtin_riscv_crc32c_d:
ID = Intrinsic::riscv_crc32c_d;
IntrinsicTypes = {ResultType};
break;
default:
llvm_unreachable("unexpected builtin ID");
}
// Vector builtins are handled from here.
#include "clang/Basic/riscv_vector_builtin_cg.inc"
}
assert(ID != Intrinsic::not_intrinsic);