[llvm] a300b24 - Revert "[TLI] Fix replace-with-veclib crash with invalid arguments (#77112)"
Paschalis Mpeis via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 12 07:49:28 PST 2024
Author: Paschalis Mpeis
Date: 2024-01-12T15:49:15Z
New Revision: a300b2403784f416f36a1cee8d0425975f790b45
URL: https://github.com/llvm/llvm-project/commit/a300b2403784f416f36a1cee8d0425975f790b45
DIFF: https://github.com/llvm/llvm-project/commit/a300b2403784f416f36a1cee8d0425975f790b45.diff
LOG: Revert "[TLI] Fix replace-with-veclib crash with invalid arguments (#77112)"
This reverts commit 9fdc568824b0992d48704dfa530a12073cc02f5e,
as it linker crashes on some platforms.
Added:
Modified:
llvm/lib/CodeGen/ReplaceWithVeclib.cpp
llvm/unittests/Analysis/CMakeLists.txt
Removed:
llvm/unittests/Analysis/ReplaceWithVecLibTest.cpp
################################################################################
diff --git a/llvm/lib/CodeGen/ReplaceWithVeclib.cpp b/llvm/lib/CodeGen/ReplaceWithVeclib.cpp
index 7b0215535a92c8..56025aa5c45fb3 100644
--- a/llvm/lib/CodeGen/ReplaceWithVeclib.cpp
+++ b/llvm/lib/CodeGen/ReplaceWithVeclib.cpp
@@ -111,8 +111,7 @@ static bool replaceWithCallToVeclib(const TargetLibraryInfo &TLI,
SmallVector<Type *, 8> ScalarArgTypes;
std::string ScalarName;
Function *FuncToReplace = nullptr;
- auto *CI = dyn_cast<CallInst>(&I);
- if (CI) {
+ if (auto *CI = dyn_cast<CallInst>(&I)) {
FuncToReplace = CI->getCalledFunction();
Intrinsic::ID IID = FuncToReplace->getIntrinsicID();
assert(IID != Intrinsic::not_intrinsic && "Not an intrinsic");
@@ -169,36 +168,12 @@ static bool replaceWithCallToVeclib(const TargetLibraryInfo &TLI,
if (!OptInfo)
return false;
- // There is no guarantee that the vectorized instructions followed the VFABI
- // specification when being created, this is why we need to add extra check to
- // make sure that the operands of the vector function obtained via VFABI match
- // the operands of the original vector instruction.
- if (CI) {
- for (auto VFParam : OptInfo->Shape.Parameters) {
- if (VFParam.ParamKind == VFParamKind::GlobalPredicate)
- continue;
-
- // tryDemangleForVFABI must return valid ParamPos, otherwise it could be
- // a bug in the VFABI parser.
- assert(VFParam.ParamPos < CI->arg_size() &&
- "ParamPos has invalid range.");
- Type *OrigTy = CI->getArgOperand(VFParam.ParamPos)->getType();
- if (OrigTy->isVectorTy() != (VFParam.ParamKind == VFParamKind::Vector)) {
- LLVM_DEBUG(dbgs() << DEBUG_TYPE << ": Will not replace: " << ScalarName
- << ". Wrong type at index " << VFParam.ParamPos
- << ": " << *OrigTy << "\n");
- return false;
- }
- }
- }
-
FunctionType *VectorFTy = VFABI::createFunctionType(*OptInfo, ScalarFTy);
if (!VectorFTy)
return false;
Function *TLIFunc = getTLIFunction(I.getModule(), VectorFTy,
VD->getVectorFnName(), FuncToReplace);
-
replaceWithTLIFunction(I, *OptInfo, TLIFunc);
LLVM_DEBUG(dbgs() << DEBUG_TYPE << ": Replaced call to `" << ScalarName
<< "` with call to `" << TLIFunc->getName() << "`.\n");
@@ -245,9 +220,6 @@ PreservedAnalyses ReplaceWithVeclib::run(Function &F,
const TargetLibraryInfo &TLI = AM.getResult<TargetLibraryAnalysis>(F);
auto Changed = runImpl(TLI, F);
if (Changed) {
- LLVM_DEBUG(dbgs() << "Instructions replaced with vector libraries: "
- << NumCallsReplaced << "\n");
-
PreservedAnalyses PA;
PA.preserveSet<CFGAnalyses>();
PA.preserve<TargetLibraryAnalysis>();
diff --git a/llvm/unittests/Analysis/CMakeLists.txt b/llvm/unittests/Analysis/CMakeLists.txt
index e7505f2633d92d..847430bf17697a 100644
--- a/llvm/unittests/Analysis/CMakeLists.txt
+++ b/llvm/unittests/Analysis/CMakeLists.txt
@@ -40,7 +40,6 @@ set(ANALYSIS_TEST_SOURCES
PluginInlineAdvisorAnalysisTest.cpp
PluginInlineOrderAnalysisTest.cpp
ProfileSummaryInfoTest.cpp
- ReplaceWithVecLibTest.cpp
ScalarEvolutionTest.cpp
VectorFunctionABITest.cpp
SparsePropagation.cpp
diff --git a/llvm/unittests/Analysis/ReplaceWithVecLibTest.cpp b/llvm/unittests/Analysis/ReplaceWithVecLibTest.cpp
deleted file mode 100644
index a1f0a4a894c8d1..00000000000000
--- a/llvm/unittests/Analysis/ReplaceWithVecLibTest.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-//===--- ReplaceWithVecLibTest.cpp - replace-with-veclib unit tests -------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/CodeGen/ReplaceWithVeclib.h"
-#include "llvm/Analysis/TargetLibraryInfo.h"
-#include "llvm/AsmParser/Parser.h"
-#include "llvm/IR/LLVMContext.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Passes/PassBuilder.h"
-#include "llvm/Support/SourceMgr.h"
-#include "gtest/gtest.h"
-
-using namespace llvm;
-
-/// NOTE: Assertions must be enabled for these tests to run.
-#ifndef NDEBUG
-
-namespace {
-
-static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
- SMDiagnostic Err;
- std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
- if (!Mod)
- Err.print("ReplaceWithVecLibTest", errs());
- return Mod;
-}
-
-/// Runs ReplaceWithVecLib with
diff erent TLIIs that have custom VecDescs. This
-/// allows checking that the pass won't crash when the function to replace (from
-/// the input IR) does not match the replacement function (derived from the
-/// VecDesc mapping).
-///
-class ReplaceWithVecLibTest : public ::testing::Test {
-
- std::string getLastLine(std::string Out) {
- // remove any trailing '\n'
- if (!Out.empty() && *(Out.cend() - 1) == '\n')
- Out.pop_back();
-
- size_t LastNL = Out.find_last_of('\n');
- return (LastNL == std::string::npos) ? Out : Out.substr(LastNL + 1);
- }
-
-protected:
- LLVMContext Ctx;
-
- /// Creates TLII using the given \p VD, and then runs the ReplaceWithVeclib
- /// pass. The pass should not crash even when the replacement function
- /// (derived from the \p VD mapping) does not match the function to be
- /// replaced (from the input \p IR).
- ///
- /// \returns the last line of the standard error to be compared for
- /// correctness.
- std::string run(const VecDesc &VD, const char *IR) {
- // Create TLII and register it with FAM so it's preserved when
- // ReplaceWithVeclib pass runs.
- TargetLibraryInfoImpl TLII = TargetLibraryInfoImpl(Triple());
- TLII.addVectorizableFunctions({VD});
- FunctionAnalysisManager FAM;
- FAM.registerPass([&TLII]() { return TargetLibraryAnalysis(TLII); });
-
- // Register and run the pass on the 'foo' function from the input IR.
- FunctionPassManager FPM;
- FPM.addPass(ReplaceWithVeclib());
- std::unique_ptr<Module> M = parseIR(Ctx, IR);
- PassBuilder PB;
- PB.registerFunctionAnalyses(FAM);
-
- // Enable debugging and capture std error
- llvm::DebugFlag = true;
- testing::internal::CaptureStderr();
- FPM.run(*M->getFunction("foo"), FAM);
- return getLastLine(testing::internal::GetCapturedStderr());
- }
-};
-
-} // end anonymous namespace
-
-static const char *IR = R"IR(
-define <vscale x 4 x float> @foo(<vscale x 4 x float> %in){
- %call = call <vscale x 4 x float> @llvm.powi.f32.i32(<vscale x 4 x float> %in, i32 3)
- ret <vscale x 4 x float> %call
-}
-
-declare <vscale x 4 x float> @llvm.powi.f32.i32(<vscale x 4 x float>, i32) #0
-)IR";
-
-// The VFABI prefix in TLI describes signature which is matching the powi
-// intrinsic declaration.
-TEST_F(ReplaceWithVecLibTest, TestValidMapping) {
- VecDesc CorrectVD = {"llvm.powi.f32.i32", "_ZGVsMxvu_powi",
- ElementCount::getScalable(4), /*Masked*/ true,
- "_ZGVsMxvu"};
- EXPECT_EQ(run(CorrectVD, IR),
- "Instructions replaced with vector libraries: 1");
-}
-
-// The VFABI prefix in TLI describes signature which is not matching the powi
-// intrinsic declaration.
-TEST_F(ReplaceWithVecLibTest, TestInvalidMapping) {
- VecDesc IncorrectVD = {"llvm.powi.f32.i32", "_ZGVsMxvv_powi",
- ElementCount::getScalable(4), /*Masked*/ true,
- "_ZGVsMxvv"};
- EXPECT_EQ(run(IncorrectVD, IR),
- "replace-with-veclib: Will not replace: llvm.powi.f32.i32. Wrong "
- "type at index 1: i32");
-}
-#endif
\ No newline at end of file
More information about the llvm-commits
mailing list