Skip to content

Commit a161378

Browse files
committed
address review comments
Created using spr 1.3.8-beta.1
1 parent 7414daa commit a161378

File tree

10 files changed

+76
-54
lines changed

10 files changed

+76
-54
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ static AllocTokenOptions getAllocTokenOptions(const LangOptions &LangOpts,
239239
AllocTokenOptions Opts;
240240
if (LangOpts.AllocTokenMode)
241241
Opts.Mode = *LangOpts.AllocTokenMode;
242-
Opts.MaxTokens = LangOpts.AllocTokenMax;
242+
if (LangOpts.AllocTokenMax)
243+
Opts.MaxTokens = *LangOpts.AllocTokenMax;
243244
Opts.Extended = CGOpts.SanitizeAllocTokenExtended;
244245
Opts.FastABI = CGOpts.SanitizeAllocTokenFastABI;
245246
return Opts;

clang/test/CodeGen/lto-newpm-pipeline.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,10 @@
3333
// CHECK-FULL-O0-NEXT: Running analysis: ProfileSummaryAnalysis
3434
// CHECK-FULL-O0-NEXT: Running pass: CoroConditionalWrapper
3535
// CHECK-FULL-O0-NEXT: Running pass: AllocTokenPass
36-
// CHECK-FULL-O0-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
37-
// CHECK-FULL-O0-NEXT: Running analysis: TargetLibraryAnalysis
3836
// CHECK-FULL-O0-NEXT: Running pass: CanonicalizeAliasesPass
3937
// CHECK-FULL-O0-NEXT: Running pass: NameAnonGlobalPass
4038
// CHECK-FULL-O0-NEXT: Running pass: AnnotationRemarksPass
39+
// CHECK-FULL-O0-NEXT: Running analysis: TargetLibraryAnalysis
4140
// CHECK-FULL-O0-NEXT: Running pass: VerifierPass
4241
// CHECK-FULL-O0-NEXT: Running pass: BitcodeWriterPass
4342

@@ -49,11 +48,10 @@
4948
// CHECK-THIN-O0-NEXT: Running analysis: ProfileSummaryAnalysis
5049
// CHECK-THIN-O0-NEXT: Running pass: CoroConditionalWrapper
5150
// CHECK-THIN-O0-NEXT: Running pass: AllocTokenPass
52-
// CHECK-THIN-O0-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
53-
// CHECK-THIN-O0-NEXT: Running analysis: TargetLibraryAnalysis
5451
// CHECK-THIN-O0-NEXT: Running pass: CanonicalizeAliasesPass
5552
// CHECK-THIN-O0-NEXT: Running pass: NameAnonGlobalPass
5653
// CHECK-THIN-O0-NEXT: Running pass: AnnotationRemarksPass
54+
// CHECK-THIN-O0-NEXT: Running analysis: TargetLibraryAnalysis
5755
// CHECK-THIN-O0-NEXT: Running pass: VerifierPass
5856
// CHECK-THIN-O0-NEXT: Running pass: ThinLTOBitcodeWriterPass
5957

llvm/include/llvm/Transforms/Instrumentation/AllocToken.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Module;
2525

2626
struct AllocTokenOptions {
2727
AllocTokenMode Mode = DefaultAllocTokenMode;
28-
std::optional<uint64_t> MaxTokens;
28+
uint64_t MaxTokens = 0;
2929
bool FastABI = false;
3030
bool Extended = false;
3131
AllocTokenOptions() = default;

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,6 @@ ModulePassManager
14521452
PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
14531453
ThinOrFullLTOPhase LTOPhase) {
14541454
const bool LTOPreLink = isLTOPreLink(LTOPhase);
1455-
const bool LTOPostLink = isLTOPostLink(LTOPhase);
14561455
ModulePassManager MPM;
14571456

14581457
// Run partial inlining pass to partially inline functions that have
@@ -1617,7 +1616,9 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
16171616
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM),
16181617
PTO.EagerlyInvalidateAnalyses));
16191618

1620-
if (LTOPostLink)
1619+
// AllocToken transforms heap allocation calls; this needs to run late after
1620+
// other allocation call transformations (such as those in InstCombine).
1621+
if (!LTOPreLink)
16211622
MPM.addPass(AllocTokenPass());
16221623

16231624
invokeOptimizerLastEPCallbacks(MPM, Level, LTOPhase);
@@ -1858,7 +1859,11 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
18581859
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr,
18591860
lowertypetests::DropTestKind::Assume));
18601861
MPM.addPass(buildCoroWrapper(ThinOrFullLTOPhase::ThinLTOPostLink));
1862+
1863+
// AllocToken transforms heap allocation calls; this needs to run late after
1864+
// other allocation call transformations (such as those in InstCombine).
18611865
MPM.addPass(AllocTokenPass());
1866+
18621867
// Drop available_externally and unreferenced globals. This is necessary
18631868
// with ThinLTO in order to avoid leaving undefined references to dead
18641869
// globals in the object file.
@@ -1919,6 +1924,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
19191924
lowertypetests::DropTestKind::Assume));
19201925

19211926
MPM.addPass(buildCoroWrapper(ThinOrFullLTOPhase::FullLTOPostLink));
1927+
1928+
// AllocToken transforms heap allocation calls; this needs to run late after
1929+
// other allocation call transformations (such as those in InstCombine).
19221930
MPM.addPass(AllocTokenPass());
19231931

19241932
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
@@ -2007,6 +2015,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
20072015
lowertypetests::DropTestKind::Assume));
20082016

20092017
MPM.addPass(buildCoroWrapper(ThinOrFullLTOPhase::FullLTOPostLink));
2018+
2019+
// AllocToken transforms heap allocation calls; this needs to run late after
2020+
// other allocation call transformations (such as those in InstCombine).
20102021
MPM.addPass(AllocTokenPass());
20112022

20122023
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
@@ -2242,6 +2253,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
22422253
MPM.addPass(CGProfilePass(/*InLTOPostLink=*/true));
22432254

22442255
MPM.addPass(CoroCleanupPass());
2256+
2257+
// AllocToken transforms heap allocation calls; this needs to run late after
2258+
// other allocation call transformations (such as those in InstCombine).
22452259
MPM.addPass(AllocTokenPass());
22462260

22472261
invokeFullLinkTimeOptimizationLastEPCallbacks(MPM, Level);
@@ -2360,7 +2374,9 @@ PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
23602374

23612375
MPM.addPass(buildCoroWrapper(Phase));
23622376

2363-
if (isLTOPostLink(Phase))
2377+
// AllocToken transforms heap allocation calls; this needs to run late after
2378+
// other allocation call transformations (such as those in InstCombine).
2379+
if (!isLTOPreLink(Phase))
23642380
MPM.addPass(AllocTokenPass());
23652381

23662382
invokeOptimizerLastEPCallbacks(MPM, Level, Phase);

llvm/lib/Transforms/Instrumentation/AllocToken.cpp

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,24 @@ cl::opt<std::string> ClFuncPrefix("alloc-token-prefix",
6767
cl::desc("The allocation function prefix"),
6868
cl::Hidden, cl::init("__alloc_token_"));
6969

70-
cl::opt<uint64_t>
70+
cl::opt<std::optional<uint64_t>, false, cl::parser<uint64_t>>
7171
ClMaxTokens("alloc-token-max",
7272
cl::desc("Maximum number of tokens (0 = target SIZE_MAX)"),
73-
cl::Hidden, cl::init(0));
73+
cl::Hidden, cl::init(std::nullopt));
7474

75-
cl::opt<bool>
75+
cl::opt<std::optional<bool>, false, cl::parser<bool>>
7676
ClFastABI("alloc-token-fast-abi",
7777
cl::desc("The token ID is encoded in the function name"),
78-
cl::Hidden, cl::init(false));
78+
cl::Hidden, cl::init(std::nullopt));
7979

8080
// Instrument libcalls only by default - compatible allocators only need to take
8181
// care of providing standard allocation functions. With extended coverage, also
8282
// instrument non-libcall allocation function calls with !alloc_token
8383
// metadata.
84-
cl::opt<bool>
84+
cl::opt<std::optional<bool>, false, cl::parser<bool>>
8585
ClExtended("alloc-token-extended",
8686
cl::desc("Extend coverage to custom allocation functions"),
87-
cl::Hidden, cl::init(false));
87+
cl::Hidden, cl::init(std::nullopt));
8888

8989
// C++ defines ::operator new (and variants) as replaceable (vs. standard
9090
// library versions), which are nobuiltin, and are therefore not covered by
@@ -237,28 +237,28 @@ class TypeHashPointerSplitMode : public TypeHashMode {
237237
// Apply opt overrides and module flags.
238238
static AllocTokenOptions resolveOptions(AllocTokenOptions Opts,
239239
const Module &M) {
240-
if (!Opts.MaxTokens.has_value())
241-
Opts.MaxTokens = ClMaxTokens;
242-
Opts.FastABI |= ClFastABI;
243-
Opts.Extended |= ClExtended;
244-
245240
auto IntModuleFlagOrNull = [&](StringRef Key) {
246241
return mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(Key));
247242
};
248243

249244
if (auto *S = dyn_cast_or_null<MDString>(M.getModuleFlag("alloc-token-mode")))
250245
if (auto Mode = getAllocTokenModeFromString(S->getString()))
251246
Opts.Mode = *Mode;
252-
253247
if (auto *Val = IntModuleFlagOrNull("alloc-token-max"))
254248
Opts.MaxTokens = Val->getZExtValue();
255-
256249
if (auto *Val = IntModuleFlagOrNull("alloc-token-fast-abi"))
257250
Opts.FastABI |= Val->isOne();
258-
259251
if (auto *Val = IntModuleFlagOrNull("alloc-token-extended"))
260252
Opts.Extended |= Val->isOne();
261253

254+
// Allow overriding options from command line options.
255+
if (ClMaxTokens.has_value())
256+
Opts.MaxTokens = *ClMaxTokens;
257+
if (ClFastABI.has_value())
258+
Opts.FastABI = *ClFastABI;
259+
if (ClExtended.has_value())
260+
Opts.Extended = *ClExtended;
261+
262262
return Opts;
263263
}
264264

@@ -268,19 +268,19 @@ class AllocToken {
268268
ModuleAnalysisManager &MAM)
269269
: Options(resolveOptions(std::move(Opts), M)), Mod(M),
270270
FAM(MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager()),
271-
Mode(IncrementMode(*IntPtrTy, *Options.MaxTokens)) {
271+
Mode(IncrementMode(*IntPtrTy, Options.MaxTokens)) {
272272
switch (Options.Mode) {
273273
case TokenMode::Increment:
274274
break;
275275
case TokenMode::Random:
276-
Mode.emplace<RandomMode>(*IntPtrTy, *Options.MaxTokens,
276+
Mode.emplace<RandomMode>(*IntPtrTy, Options.MaxTokens,
277277
M.createRNG(DEBUG_TYPE));
278278
break;
279279
case TokenMode::TypeHash:
280-
Mode.emplace<TypeHashMode>(*IntPtrTy, *Options.MaxTokens);
280+
Mode.emplace<TypeHashMode>(*IntPtrTy, Options.MaxTokens);
281281
break;
282282
case TokenMode::TypeHashPointerSplit:
283-
Mode.emplace<TypeHashPointerSplitMode>(*IntPtrTy, *Options.MaxTokens);
283+
Mode.emplace<TypeHashPointerSplitMode>(*IntPtrTy, Options.MaxTokens);
284284
break;
285285
}
286286
}
@@ -337,8 +337,6 @@ bool AllocToken::instrumentFunction(Function &F) {
337337
if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage)
338338
return false;
339339

340-
auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
341-
auto &TLI = FAM.getResult<TargetLibraryAnalysis>(F);
342340
SmallVector<std::pair<CallBase *, LibFunc>, 4> AllocCalls;
343341
SmallVector<IntrinsicInst *, 4> IntrinsicInsts;
344342

@@ -347,6 +345,10 @@ bool AllocToken::instrumentFunction(Function &F) {
347345
F.hasFnAttribute(Attribute::SanitizeAllocToken) &&
348346
!F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation);
349347

348+
// Get TLI only when required.
349+
const TargetLibraryInfo *TLI =
350+
InstrumentFunction ? &FAM.getResult<TargetLibraryAnalysis>(F) : nullptr;
351+
350352
// Collect all allocation calls to avoid iterator invalidation.
351353
for (Instruction &I : instructions(F)) {
352354
// Collect all alloc_token_* intrinsics.
@@ -362,26 +364,28 @@ bool AllocToken::instrumentFunction(Function &F) {
362364
auto *CB = dyn_cast<CallBase>(&I);
363365
if (!CB)
364366
continue;
365-
if (std::optional<LibFunc> Func = shouldInstrumentCall(*CB, TLI))
367+
if (std::optional<LibFunc> Func = shouldInstrumentCall(*CB, *TLI))
366368
AllocCalls.emplace_back(CB, Func.value());
367369
}
368370

371+
// Return early to avoid unnecessarily instantiating the ORE.
372+
if (AllocCalls.empty() && IntrinsicInsts.empty())
373+
return false;
374+
375+
auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
369376
bool Modified = false;
370377

371-
if (!AllocCalls.empty()) {
372-
for (auto &[CB, Func] : AllocCalls)
373-
Modified |= replaceAllocationCall(CB, Func, ORE, TLI);
374-
if (Modified)
375-
NumFunctionsModified++;
376-
}
378+
for (auto &[CB, Func] : AllocCalls)
379+
Modified |= replaceAllocationCall(CB, Func, ORE, *TLI);
377380

378-
if (!IntrinsicInsts.empty()) {
379-
for (auto *II : IntrinsicInsts)
380-
replaceIntrinsicInst(II, ORE);
381+
for (auto *II : IntrinsicInsts) {
382+
replaceIntrinsicInst(II, ORE);
381383
Modified = true;
382-
NumFunctionsModified++;
383384
}
384385

386+
if (Modified)
387+
NumFunctionsModified++;
388+
385389
return Modified;
386390
}
387391

llvm/test/CodeGen/AArch64/print-pipeline-passes.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; RUN: opt -mtriple=aarch64 -S -passes='default<O2>' -print-pipeline-passes < %s | FileCheck %s
33

44
; CHECK: loop-idiom-vectorize
5-
; O0: {{^}}function(ee-instrument<>),always-inline,coro-cond(coro-early,cgscc(coro-split),coro-cleanup,globaldce),function(annotation-remarks),verify,print{{$}}
5+
; O0: {{^}}function(ee-instrument<>),always-inline,coro-cond(coro-early,cgscc(coro-split),coro-cleanup,globaldce),alloc-token,function(annotation-remarks),verify,print{{$}}
66

77
define void @foo() {
88
entry:

llvm/test/Instrumentation/AllocToken/module-flags.ll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; Test that all supported module flags are retrieved correctly.
22
;
3-
; RUN: opt < %s -passes='inferattrs,alloc-token' -S | FileCheck %s
3+
; RUN: opt < %s -passes='inferattrs,alloc-token' -S | FileCheck %s --check-prefixes=CHECK,DEFAULT
4+
; RUN: opt < %s -passes='inferattrs,alloc-token' -alloc-token-max=2 -alloc-token-fast-abi=0 -alloc-token-extended=0 -S | FileCheck %s --check-prefixes=CHECK,OVERRIDE
45

56
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
67

@@ -10,10 +11,14 @@ declare ptr @my_malloc(i64)
1011

1112
define void @test() sanitize_alloc_token {
1213
; CHECK-LABEL: define void @test(
13-
; CHECK: call ptr @__alloc_token_0_malloc(i64 8)
14-
; CHECK: call ptr @__alloc_token_1__Znwm(i64 8)
15-
; CHECK: call ptr @__alloc_token_2_malloc(i64 8)
16-
; CHECK: call ptr @__alloc_token_0_my_malloc(i64 8)
14+
; DEFAULT: call ptr @__alloc_token_0_malloc(i64 8)
15+
; DEFAULT: call ptr @__alloc_token_1__Znwm(i64 8)
16+
; DEFAULT: call ptr @__alloc_token_2_malloc(i64 8)
17+
; DEFAULT: call ptr @__alloc_token_0_my_malloc(i64 8)
18+
; OVERRIDE: call ptr @__alloc_token_malloc(i64 8, i64 0)
19+
; OVERRIDE: call ptr @__alloc_token__Znwm(i64 8, i64 1)
20+
; OVERRIDE: call ptr @__alloc_token_malloc(i64 8, i64 0)
21+
; OVERRIDE: call ptr @my_malloc(i64 8)
1722
%1 = call ptr @malloc(i64 8)
1823
%2 = call ptr @_Znwm(i64 8)
1924
%3 = call ptr @malloc(i64 8)

llvm/test/Other/new-pm-O0-defaults.ll

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99

1010
; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
1111
; RUN: -passes='default<O0>' -S %s 2>&1 \
12-
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-CORO
12+
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-CORO,CHECK-ALLOCTOKEN
1313
; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager -enable-matrix \
1414
; RUN: -passes='default<O0>' -S %s 2>&1 \
15-
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-MATRIX,CHECK-CORO
15+
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-MATRIX,CHECK-CORO,CHECK-ALLOCTOKEN
1616
; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager -debug-info-for-profiling \
1717
; RUN: -passes='default<O0>' -S %s 2>&1 \
18-
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DIS,CHECK-CORO
18+
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DIS,CHECK-CORO,CHECK-ALLOCTOKEN
1919
; RUN: opt -disable-verify -verify-analysis-invalidation=0 -debug-pass-manager \
2020
; RUN: -passes='thinlto-pre-link<O0>' -S %s 2>&1 \
2121
; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT,CHECK-PRE-LINK,CHECK-CORO
@@ -41,14 +41,13 @@
4141
; CHECK-MATRIX: Running pass: LowerMatrixIntrinsicsPass
4242
; CHECK-MATRIX-NEXT: Running analysis: TargetIRAnalysis
4343
; CHECK-CORO-NEXT: Running pass: CoroConditionalWrapper
44+
; CHECK-ALLOCTOKEN-NEXT: Running pass: AllocTokenPass
4445
; CHECK-PRE-LINK: Running pass: CanonicalizeAliasesPass
4546
; CHECK-PRE-LINK-NEXT: Running pass: NameAnonGlobalPass
4647
; CHECK-THINLTO: Running pass: LowerTypeTestsPass
4748
; CHECK-THINLTO-NEXT: Running pass: CoroConditionalWrapper
4849
; CHECK-THINLTO-NEXT: Running pass: AllocTokenPass
4950
; CHECK-THINLTO-NEXT: Running analysis: InnerAnalysisManagerProxy
50-
; CHECK-THINLTO-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
51-
; CHECK-THINLTO-NEXT: Running analysis: TargetLibraryAnalysis
5251
; CHECK-THINLTO-NEXT: Running pass: EliminateAvailableExternallyPass
5352
; CHECK-THINLTO-NEXT: Running pass: GlobalDCEPass
5453
; CHECK-LTO: Running pass: CrossDSOCFIPass on [module]
@@ -58,11 +57,10 @@
5857
; CHECK-LTO-NEXT: Running pass: LowerTypeTestsPass
5958
; CHECK-LTO-NEXT: CoroConditionalWrapper
6059
; CHECK-LTO-NEXT: Running pass: AllocTokenPass
61-
; CHECK-LTO-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
62-
; CHECK-LTO-NEXT: Running analysis: TargetLibraryAnalysis
6360
; CHECK-CORO-NEXT: Running pass: AnnotationRemarksPass
6461
; CHECK-CORO-NEXT: Running analysis: TargetLibraryAnalysis
6562
; CHECK-LTO-NEXT: Running pass: AnnotationRemarksPass
63+
; CHECK-LTO-NEXT: Running analysis: TargetLibraryAnalysis
6664
; CHECK-NEXT: Running pass: PrintModulePass
6765

6866
; Make sure we get the IR back out without changes when we print the module.

llvm/test/Other/new-pm-defaults.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@
285285
; CHECK-O-NEXT: Running pass: DivRemPairsPass
286286
; CHECK-O-NEXT: Running pass: TailCallElimPass
287287
; CHECK-O-NEXT: Running pass: SimplifyCFGPass
288+
; CHECK-DEFAULT-NEXT: Running pass: AllocToken
288289
; CHECK-EP-OPTIMIZER-LAST: Running pass: NoOpModulePass
289290
; CHECK-HOT-COLD-SPLIT-NEXT: Running pass: HotColdSplittingPass
290291
; CHECK-IR-OUTLINER-NEXT: Running pass: IROutlinerPass

llvm/test/Other/new-pm-lto-defaults.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@
164164
; CHECK-O1-NEXT: Running pass: CoroConditionalWrapper
165165
; CHECK-O23SZ-NEXT: Running pass: CoroCleanupPass
166166
; CHECK-O-NEXT: Running pass: AllocTokenPass
167-
; CHECK-O1-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
168167
; CHECK-EP-NEXT: Running pass: NoOpModulePass
169168
; CHECK-O-NEXT: Running pass: AnnotationRemarksPass on foo
170169
; CHECK-O-NEXT: Running pass: PrintModulePass

0 commit comments

Comments
 (0)