Skip to content

Commit 01ebd61

Browse files
committed
Revert llvm-spirv change
Signed-off-by: gejin <[email protected]>
1 parent c168eb2 commit 01ebd61

File tree

5 files changed

+51
-514
lines changed

5 files changed

+51
-514
lines changed

llvm-spirv/lib/SPIRV/SPIRVUtil.cpp

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,34 +1531,10 @@ bool hasLoopMetadata(const Module *M) {
15311531
// Returns true if type(s) and number of elements (if vector) is valid
15321532
bool checkTypeForSPIRVExtendedInstLowering(IntrinsicInst *II, SPIRVModule *BM) {
15331533
switch (II->getIntrinsicID()) {
1534-
case Intrinsic::ceil:
1535-
case Intrinsic::copysign:
1536-
case Intrinsic::cos:
1537-
case Intrinsic::exp:
1538-
case Intrinsic::exp2:
15391534
case Intrinsic::fabs:
1540-
case Intrinsic::floor:
1541-
case Intrinsic::fma:
1542-
case Intrinsic::log:
1543-
case Intrinsic::log10:
1544-
case Intrinsic::log2:
1545-
case Intrinsic::maximum:
1535+
case Intrinsic::ceil:
15461536
case Intrinsic::maxnum:
1547-
case Intrinsic::minimum:
1548-
case Intrinsic::minnum:
1549-
case Intrinsic::nearbyint:
1550-
case Intrinsic::pow:
1551-
case Intrinsic::powi:
1552-
case Intrinsic::rint:
1553-
case Intrinsic::round:
1554-
case Intrinsic::roundeven:
1555-
case Intrinsic::sin:
1556-
case Intrinsic::sqrt:
1557-
case Intrinsic::trunc: {
1558-
// Although some of the intrinsics above take multiple arguments, it is
1559-
// sufficient to check arg 0 because the LLVM Verifier will have checked
1560-
// that all floating point operands have the same type and the second
1561-
// argument of powi is i32.
1537+
case Intrinsic::nearbyint: {
15621538
Type *Ty = II->getType();
15631539
if (II->getArgOperand(0)->getType() != Ty)
15641540
return false;

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 35 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,33 +2067,12 @@ void addIntelFPGADecorationsForStructMember(SPIRVEntry *E,
20672067
bool LLVMToSPIRV::isKnownIntrinsic(Intrinsic::ID Id) {
20682068
// Known intrinsics usually do not need translation of their declaration
20692069
switch (Id) {
2070-
case Intrinsic::abs:
20712070
case Intrinsic::assume:
20722071
case Intrinsic::bitreverse:
2073-
case Intrinsic::ceil:
2074-
case Intrinsic::copysign:
2075-
case Intrinsic::cos:
2076-
case Intrinsic::exp:
2077-
case Intrinsic::exp2:
2078-
case Intrinsic::fabs:
2079-
case Intrinsic::floor:
2080-
case Intrinsic::fma:
2081-
case Intrinsic::log:
2082-
case Intrinsic::log10:
2083-
case Intrinsic::log2:
2084-
case Intrinsic::maximum:
2085-
case Intrinsic::maxnum:
2086-
case Intrinsic::minimum:
2087-
case Intrinsic::minnum:
2088-
case Intrinsic::nearbyint:
2089-
case Intrinsic::pow:
2090-
case Intrinsic::powi:
2091-
case Intrinsic::rint:
2092-
case Intrinsic::round:
2093-
case Intrinsic::roundeven:
2094-
case Intrinsic::sin:
20952072
case Intrinsic::sqrt:
2096-
case Intrinsic::trunc:
2073+
case Intrinsic::fabs:
2074+
case Intrinsic::abs:
2075+
case Intrinsic::ceil:
20972076
case Intrinsic::ctpop:
20982077
case Intrinsic::ctlz:
20992078
case Intrinsic::cttz:
@@ -2116,6 +2095,7 @@ bool LLVMToSPIRV::isKnownIntrinsic(Intrinsic::ID Id) {
21162095
case Intrinsic::fmuladd:
21172096
case Intrinsic::memset:
21182097
case Intrinsic::memcpy:
2098+
case Intrinsic::nearbyint:
21192099
case Intrinsic::lifetime_start:
21202100
case Intrinsic::lifetime_end:
21212101
case Intrinsic::dbg_declare:
@@ -2152,69 +2132,6 @@ LLVMToSPIRV::applyRoundingModeConstraint(Value *V, SPIRVInstruction *I) {
21522132
return I;
21532133
}
21542134

2155-
static SPIRVWord getBuiltinIdForIntrinsic(Intrinsic::ID IID) {
2156-
switch (IID) {
2157-
// Note: In some cases the semantics of the OpenCL builtin are not identical
2158-
// to the semantics of the corresponding LLVM IR intrinsic. The LLVM
2159-
// intrinsics handled here assume the default floating point environment
2160-
// (no unmasked exceptions, round-to-nearest-ties-even rounding mode)
2161-
// and assume that the operations have no side effects (FP status flags
2162-
// aren't maintained), so the OpenCL builtin behavior should be
2163-
// acceptable.
2164-
case Intrinsic::ceil:
2165-
return OpenCLLIB::Ceil;
2166-
case Intrinsic::copysign:
2167-
return OpenCLLIB::Copysign;
2168-
case Intrinsic::cos:
2169-
return OpenCLLIB::Cos;
2170-
case Intrinsic::exp:
2171-
return OpenCLLIB::Exp;
2172-
case Intrinsic::exp2:
2173-
return OpenCLLIB::Exp2;
2174-
case Intrinsic::fabs:
2175-
return OpenCLLIB::Fabs;
2176-
case Intrinsic::floor:
2177-
return OpenCLLIB::Floor;
2178-
case Intrinsic::fma:
2179-
return OpenCLLIB::Fma;
2180-
case Intrinsic::log:
2181-
return OpenCLLIB::Log;
2182-
case Intrinsic::log10:
2183-
return OpenCLLIB::Log10;
2184-
case Intrinsic::log2:
2185-
return OpenCLLIB::Log2;
2186-
case Intrinsic::maximum:
2187-
return OpenCLLIB::Fmax;
2188-
case Intrinsic::maxnum:
2189-
return OpenCLLIB::Fmax;
2190-
case Intrinsic::minimum:
2191-
return OpenCLLIB::Fmin;
2192-
case Intrinsic::minnum:
2193-
return OpenCLLIB::Fmin;
2194-
case Intrinsic::nearbyint:
2195-
return OpenCLLIB::Rint;
2196-
case Intrinsic::pow:
2197-
return OpenCLLIB::Pow;
2198-
case Intrinsic::powi:
2199-
return OpenCLLIB::Pown;
2200-
case Intrinsic::rint:
2201-
return OpenCLLIB::Rint;
2202-
case Intrinsic::round:
2203-
return OpenCLLIB::Round;
2204-
case Intrinsic::roundeven:
2205-
return OpenCLLIB::Rint;
2206-
case Intrinsic::sin:
2207-
return OpenCLLIB::Sin;
2208-
case Intrinsic::sqrt:
2209-
return OpenCLLIB::Sqrt;
2210-
case Intrinsic::trunc:
2211-
return OpenCLLIB::Trunc;
2212-
default:
2213-
assert(false && "Builtin ID requested for Unhandled intrinsic!");
2214-
return 0;
2215-
}
2216-
}
2217-
22182135
SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
22192136
SPIRVBasicBlock *BB) {
22202137
auto GetMemoryAccess = [](MemIntrinsic *MI) -> std::vector<SPIRVWord> {
@@ -2257,65 +2174,35 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
22572174
SPIRVValue *Op = transValue(II->getArgOperand(0), BB);
22582175
return BM->addUnaryInst(OpBitReverse, Ty, Op, BB);
22592176
}
2260-
// Unary FP intrinsic
2261-
case Intrinsic::ceil:
2262-
case Intrinsic::cos:
2263-
case Intrinsic::exp:
2264-
case Intrinsic::exp2:
2265-
case Intrinsic::fabs:
2266-
case Intrinsic::floor:
2267-
case Intrinsic::log:
2268-
case Intrinsic::log10:
2269-
case Intrinsic::log2:
2270-
case Intrinsic::nearbyint:
2271-
case Intrinsic::rint:
2272-
case Intrinsic::round:
2273-
case Intrinsic::roundeven:
2274-
case Intrinsic::sin:
2275-
case Intrinsic::sqrt:
2276-
case Intrinsic::trunc: {
2277-
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
2278-
break;
2279-
SPIRVWord ExtOp = getBuiltinIdForIntrinsic(II->getIntrinsicID());
2280-
SPIRVType *STy = transType(II->getType());
2281-
std::vector<SPIRVValue *> Ops(1, transValue(II->getArgOperand(0), BB));
2282-
return BM->addExtInst(STy, BM->getExtInstSetId(SPIRVEIS_OpenCL), ExtOp, Ops,
2283-
BB);
2177+
case Intrinsic::sqrt: {
2178+
return BM->addExtInst(transType(II->getType()),
2179+
BM->getExtInstSetId(SPIRVEIS_OpenCL), OpenCLLIB::Sqrt,
2180+
{transValue(II->getOperand(0), BB)}, BB);
22842181
}
2285-
// Binary FP intrinsics
2286-
case Intrinsic::copysign:
2287-
case Intrinsic::pow:
2288-
case Intrinsic::powi:
2289-
case Intrinsic::maximum:
2290-
case Intrinsic::maxnum:
2291-
case Intrinsic::minimum:
2292-
case Intrinsic::minnum: {
2182+
case Intrinsic::fabs: {
22932183
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
22942184
break;
2295-
SPIRVWord ExtOp = getBuiltinIdForIntrinsic(II->getIntrinsicID());
2185+
SPIRVWord ExtOp = OpenCLLIB::Fabs;
22962186
SPIRVType *STy = transType(II->getType());
2297-
std::vector<SPIRVValue *> Ops{transValue(II->getArgOperand(0), BB),
2298-
transValue(II->getArgOperand(1), BB)};
2187+
std::vector<SPIRVValue *> Ops(1, transValue(II->getArgOperand(0), BB));
22992188
return BM->addExtInst(STy, BM->getExtInstSetId(SPIRVEIS_OpenCL), ExtOp, Ops,
23002189
BB);
23012190
}
2302-
case Intrinsic::fma: {
2191+
case Intrinsic::abs: {
23032192
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
23042193
break;
2305-
SPIRVWord ExtOp = OpenCLLIB::Fma;
2194+
// LLVM has only one version of abs and it is only for signed integers. We
2195+
// unconditionally choose SAbs here
2196+
SPIRVWord ExtOp = OpenCLLIB::SAbs;
23062197
SPIRVType *STy = transType(II->getType());
2307-
std::vector<SPIRVValue *> Ops{transValue(II->getArgOperand(0), BB),
2308-
transValue(II->getArgOperand(1), BB),
2309-
transValue(II->getArgOperand(2), BB)};
2198+
std::vector<SPIRVValue *> Ops(1, transValue(II->getArgOperand(0), BB));
23102199
return BM->addExtInst(STy, BM->getExtInstSetId(SPIRVEIS_OpenCL), ExtOp, Ops,
23112200
BB);
23122201
}
2313-
case Intrinsic::abs: {
2202+
case Intrinsic::ceil: {
23142203
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
23152204
break;
2316-
// LLVM has only one version of abs and it is only for signed integers. We
2317-
// unconditionally choose SAbs here
2318-
SPIRVWord ExtOp = OpenCLLIB::SAbs;
2205+
SPIRVWord ExtOp = OpenCLLIB::Ceil;
23192206
SPIRVType *STy = transType(II->getType());
23202207
std::vector<SPIRVValue *> Ops(1, transValue(II->getArgOperand(0), BB));
23212208
return BM->addExtInst(STy, BM->getExtInstSetId(SPIRVEIS_OpenCL), ExtOp, Ops,
@@ -2457,6 +2344,16 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
24572344
return BM->addBinaryInst(OpFAdd, Ty, Mul,
24582345
transValue(II->getArgOperand(2), BB), BB);
24592346
}
2347+
case Intrinsic::maxnum: {
2348+
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
2349+
break;
2350+
SPIRVWord ExtOp = OpenCLLIB::Fmax;
2351+
SPIRVType *STy = transType(II->getType());
2352+
std::vector<SPIRVValue *> Ops{transValue(II->getArgOperand(0), BB),
2353+
transValue(II->getArgOperand(1), BB)};
2354+
return BM->addExtInst(STy, BM->getExtInstSetId(SPIRVEIS_OpenCL), ExtOp, Ops,
2355+
BB);
2356+
}
24602357
case Intrinsic::usub_sat: {
24612358
// usub.sat(a, b) -> (a > b) ? a - b : 0
24622359
SPIRVType *Ty = transType(II->getType());
@@ -2529,6 +2426,13 @@ SPIRVValue *LLVMToSPIRV::transIntrinsicInst(IntrinsicInst *II,
25292426
Size = 0;
25302427
return BM->addLifetimeInst(OC, transValue(II->getOperand(1), BB), Size, BB);
25312428
}
2429+
case Intrinsic::nearbyint: {
2430+
if (!checkTypeForSPIRVExtendedInstLowering(II, BM))
2431+
break;
2432+
return BM->addExtInst(transType(II->getType()),
2433+
BM->getExtInstSetId(SPIRVEIS_OpenCL), OpenCLLIB::Rint,
2434+
{transValue(II->getOperand(0), BB)}, BB);
2435+
}
25322436
// We don't want to mix translation of regular code and debug info, because
25332437
// it creates a mess, therefore translation of debug intrinsics is
25342438
// postponed until LLVMToSPIRVDbgTran::finalizeDebug...() methods.

0 commit comments

Comments
 (0)