Skip to content

Commit 1ed3dd5

Browse files
committed
[LLVM][Analysis] Add a pass to print unknown intrinsics
Add a pass that will print unknown intrinsics, which is a function whose name starts with `llvm.` but is not a intrinsic regonized by LLVM. This can help debug issues such as https://github.com/StanfordLegion/legion/issues/1865#issuecomment-2863656342
1 parent 9a6a87d commit 1ed3dd5

File tree

6 files changed

+79
-0
lines changed

6 files changed

+79
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_ANALYSIS_UNKNOWNINTRINSICPRINTER_H
10+
#define LLVM_ANALYSIS_UNKNOWNINTRINSICPRINTER_H
11+
12+
#include "llvm/IR/PassManager.h"
13+
14+
namespace llvm {
15+
class UnknownIntrinsicPrinterPass
16+
: public PassInfoMixin<UnknownIntrinsicPrinterPass> {
17+
raw_ostream &OS;
18+
19+
public:
20+
UnknownIntrinsicPrinterPass(raw_ostream &OS) : OS(OS) {}
21+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
22+
static bool isRequired() { return true; }
23+
};
24+
} // namespace llvm
25+
26+
#endif // LLVM_ANALYSIS_UNKNOWNINTRINSICPRINTER_H

llvm/lib/Analysis/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ add_llvm_component_library(LLVMAnalysis
155155
TypeBasedAliasAnalysis.cpp
156156
TypeMetadataUtils.cpp
157157
UniformityAnalysis.cpp
158+
UnknownIntrinsicPrinter.cpp
158159
ScopedNoAliasAA.cpp
159160
ValueLattice.cpp
160161
ValueLatticeUtils.cpp
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "llvm/Analysis/UnknownIntrinsicPrinter.h"
10+
#include "llvm/IR/Function.h"
11+
#include "llvm/IR/Intrinsics.h"
12+
#include "llvm/IR/Module.h"
13+
14+
using namespace llvm;
15+
16+
PreservedAnalyses UnknownIntrinsicPrinterPass::run(Module &M,
17+
ModuleAnalysisManager &) {
18+
for (const Function &F : M.functions()) {
19+
// An unknown intrinsic is a function that begins with "llvm." but is not
20+
// a recognized intrinsic (i.e., it's IntrinsicID is not_intrinsic).
21+
if (F.isIntrinsic() && F.getIntrinsicID() == Intrinsic::not_intrinsic)
22+
OS << "Unknown intrinsic : " << F.getName() << '\n';
23+
}
24+
return PreservedAnalyses::all();
25+
}

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#include "llvm/Analysis/TargetTransformInfo.h"
7878
#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
7979
#include "llvm/Analysis/UniformityAnalysis.h"
80+
#include "llvm/Analysis/UnknownIntrinsicPrinter.h"
8081
#include "llvm/CodeGen/AssignmentTrackingAnalysis.h"
8182
#include "llvm/CodeGen/AtomicExpand.h"
8283
#include "llvm/CodeGen/BasicBlockSectionsProfileReader.h"

llvm/lib/Passes/PassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ MODULE_PASS("print<inline-advisor>", InlineAdvisorAnalysisPrinterPass(errs()))
138138
MODULE_PASS("print<ir2vec>", IR2VecPrinterPass(errs()))
139139
MODULE_PASS("print<module-debuginfo>", ModuleDebugInfoPrinterPass(errs()))
140140
MODULE_PASS("print<reg-usage>", PhysicalRegisterUsageInfoPrinterPass(errs()))
141+
MODULE_PASS("print-unknown-intrinsics", UnknownIntrinsicPrinterPass(errs()))
141142
MODULE_PASS("pseudo-probe", SampleProfileProbePass(TM))
142143
MODULE_PASS("pseudo-probe-update", PseudoProbeUpdatePass())
143144
MODULE_PASS("recompute-globalsaa", RecomputeGlobalsAAPass())
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; RUN: opt -disable-output -passes=print-unknown-intrinsics %s 2>&1 | FileCheck %s
2+
3+
; ------------------------------------------------------------------------------
4+
; Add several known intrinsics.
5+
declare i8 @llvm.ctpop.i8(i8)
6+
declare double @llvm.sqrt.f64(double)
7+
8+
; Note, the next two are known intrinsics because automatic remanging of
9+
; intrinsics will convert them to the "correct" name.
10+
11+
; Remangled to llvm.sqrt.f64(double).
12+
declare double @llvm.sqrt.foo(double)
13+
14+
; Remangled to llvm.ctpop.i8(i8).
15+
declare i8 @llvm.ctpop.unknown.i8(i8)
16+
17+
; ------------------------------------------------------------------------------
18+
; Add several unknown intrinsics.
19+
declare i1 @llvm.isunordered.f32(float, float)
20+
declare i8 @llvm.foo.unknown.i8(i8)
21+
declare i8 @llvm.unknown.i8(i8)
22+
23+
; CHECK: Unknown intrinsic : llvm.isunordered.f32
24+
; CHECK: Unknown intrinsic : llvm.foo.unknown.i8
25+
; CHECK: Unknown intrinsic : llvm.unknown.i8

0 commit comments

Comments
 (0)