[llvm] r374692 - [SROA] Reuse existing lifetime markers if possible

David Jones via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 14 21:12:59 PDT 2019


I have seen some Clang crashes when building files with profile
instrumentation. Given the delay in response, I'm going to go ahead and
revert the commit. Sorry about that :-( hopefully it will only be temporary.



I've attached a reproducer, which relies on a precompiled module file for
libc++. This is the traceback (note that several of the flags are needed
for module compatibility, but may also contribute):


MIParser-7e38ec.creduce.cpp:49:7: warning: class 's' does not declare any
constructor to initialize its non-modifiable members
class s {
      ^
MIParser-7e38ec.creduce.cpp:51:6: note: reference member 't' will never be
initialized
  H &t;
     ^
MIParser-7e38ec.creduce.cpp:67:1: warning: control may reach end of
non-void function
}
^
2 warnings generated.
MIParser-7e38ec.creduce.cpp:49:7: warning: class 's' does not declare any
constructor to initialize its non-modifiable members
class s {
      ^
MIParser-7e38ec.creduce.cpp:51:6: note: reference member 't' will never be
initialized
  H &t;
     ^
MIParser-7e38ec.creduce.cpp:67:1: warning: control may reach end of
non-void function
}
^
Stack dump:
0. Program arguments: .../bin/clang -cc1 -triple x86_64-grtev4-linux-gnu
-target-cpu x86-64 -target-feature +sse4.2 -target-feature +pclmul
-target-feature +aes -fprofile-instrument=llvm
-fprofile-instrument-path=/tmp/profraw/blaze-out/default_%m.profraw -O3 -x
c++ -std=gnu++17 -stdlib=libc++ -pthread -fno-signed-char
-fgnuc-version=4.2.1 -fsized-deallocation -faligned-allocation
-fnew-alignment=8 -fmath-errno -fmodules -fno-implicit-modules
-fmodule-file=/tmp/MIParser-7e38ec.stl.pcm -emit-obj -o /dev/null
MIParser-7e38ec.creduce.cpp
1. <eof> parser at end of file
2. Per-module optimization passes
3. Running pass 'CallGraph Pass Manager' on module
'MIParser-7e38ec.creduce.cpp'.
4. Running pass 'Bit-Tracking Dead Code Elimination' on function
'@_ZN1s2akEv'
 #0 0x000056472aa52e98 llvm::sys::RunSignalHandlers()
(.../bin/clang+0x509fe98)
 #1 0x000056472aa5568b SignalHandler(int) (.../bin/clang+0x50a268b)
 #2 0x00007f3177e6e9a0 __restore_rt
(/usr/grte/v4/lib64/libpthread.so.0+0xf9a0)
 #3 0x000056472a5b1294 llvm::DemandedBits::performAnalysis()
(.../bin/clang+0x4bfe294)
 #4 0x000056472a5b1e92
llvm::DemandedBits::isInstructionDead(llvm::Instruction*)
(.../bin/clang+0x4bfee92)
 #5 0x000056472a1809da bitTrackingDCE(llvm::Function&, llvm::DemandedBits&)
(.../bin/clang+0x47cd9da)
 #6 0x000056472a8ca60f llvm::FPPassManager::runOnFunction(llvm::Function&)
(.../bin/clang+0x4f1760f)
 #7 0x000056472a59e346 (anonymous
namespace)::CGPassManager::runOnModule(llvm::Module&)
(.../bin/clang+0x4beb346)
 #8 0x000056472a8cae9f llvm::legacy::PassManagerImpl::run(llvm::Module&)
(.../bin/clang+0x4f17e9f)
 #9 0x00005647278c0c64 clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout
const&, llvm::Module*, clang::BackendAction,
std::__u::unique_ptr<llvm::raw_pwrite_stream,
std::__u::default_delete<llvm::raw_pwrite_stream> >)
(.../bin/clang+0x1f0dc64)
#10 0x00005647278bae55
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
(.../bin/clang+0x1f07e55)
#11 0x0000564728262ad3 clang::ParseAST(clang::Sema&, bool, bool)
(.../bin/clang+0x28afad3)
#12 0x000056472808e787 clang::FrontendAction::Execute()
(.../bin/clang+0x26db787)
#13 0x0000564728039010
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(.../bin/clang+0x2686010)
#14 0x00005647276249b9
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(.../bin/clang+0x1c719b9)
#15 0x0000564727614f38 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) (.../bin/clang+0x1c61f38)
#16 0x00005647276226ab main (.../bin/clang+0x1c6f6ab)
#17 0x00007f3177cdcbbd __libc_start_main
(/usr/grte/v4/lib64/libc.so.6+0x38bbd)
#18 0x00005647276145e9 _start (.../bin/clang+0x1c615e9)
./MIParser-7e38ec.creduce.sh: line 57: 60350 Segmentation fault
 ${CLANG} "${ARGS[@]}" $*


On Mon, Oct 14, 2019 at 7:46 AM Alexander Kornienko via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> I'm seeing an assertion failure when compiling
> llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp that started happening after
> this patch (I verified that reverting it fixes the crash). Please fix or
> revert the commit.
>
> I don't have an isolated test case, but maybe there's an obvious error
> that you can spot given the stack trace:
>
> assert.h assertion failed at
> llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:543 in void
> (anonymous namespace)::PromoteMem2Reg::run(): isAllocaPromotable(AI) &&
> "Cannot promote non-promotable alloca!"
>
>  #0 0x00005556fa034751 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
> llvm/lib/Support/Unix/Signals.inc:537:11
>  #1 0x00005556fa034be9 PrintStackTraceSignalHandler(void*)
> llvm/lib/Support/Unix/Signals.inc:593:1
>  #2 0x00005556fa03327b llvm::sys::RunSignalHandlers()
> llvm/lib/Support/Signals.cpp:67:5
>  #3 0x00005556fa035244 SignalHandler(int)
> llvm/lib/Support/Unix/Signals.inc:384:1
> ...
> #12 0x00005556fa1adfa0 __assert_fail
> #13 0x00005556f94d3703 (anonymous namespace)::PromoteMem2Reg::run()
> llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:543:5
> #14 0x00005556f94d342a
> llvm::PromoteMemToReg(llvm::ArrayRef<llvm::AllocaInst*>,
> llvm::DominatorTree&, llvm::AssumptionCache*)
> llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1006:3
>
>
>
> #15 0x00005556f9157021 llvm::SROA::promoteAllocas(llvm::Function&)
> llvm/lib/Transforms/Scalar/SROA.cpp:4559:3
> #16 0x00005556f91573cc llvm::SROA::runImpl(llvm::Function&,
> llvm::DominatorTree&, llvm::AssumptionCache&)
> llvm/lib/Transforms/Scalar/SROA.cpp:4600:16
> #17 0x00005556f9157682 llvm::SROA::run(llvm::Function&,
> llvm::AnalysisManager<llvm::Function>&)
> llvm/lib/Transforms/Scalar/SROA.cpp:4616:10
> #18 0x00005556f42bfc35 llvm::detail::PassModel<llvm::Function, llvm::SROA,
> llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>
> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
> llvm/include/llvm/IR/PassManagerInternal.h:79:17
>
>
> #19 0x00005556f9d5f539 llvm::PassManager<llvm::Function,
> llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
> llvm::AnalysisManager<llvm::Function>&)
> llvm/include/llvm/IR/PassManager.h:519:33
>
>
>
> #20 0x00005556f42d8e4f
> llvm::CGSCCToFunctionPassAdaptor<llvm::PassManager<llvm::Function,
> llvm::AnalysisManager<llvm::Function> > >::run(llvm::LazyCallGraph::SCC&,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
> llvm/include/llvm/Analysis/CGSCCPassManager.h:489:39
>
> #21 0x00005556f42d8bb5 llvm::detail::PassModel<llvm::LazyCallGraph::SCC,
> llvm::CGSCCToFunctionPassAdaptor<llvm::PassManager<llvm::Function,
> llvm::AnalysisManager<llvm::Function> > >, llvm::PreservedAnalyses,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
> llvm::LazyCallGraph&,
> llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
> llvm/include/llvm/IR/PassManagerInternal.h:79:17
> #22 0x00005556f95f734a llvm::PassManager<llvm::LazyCallGraph::SCC,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
> llvm::LazyCallGraph&,
> llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
> llvm/lib/Analysis/CGSCCPassManager.cpp:81:9
> #23 0x00005556f42ee416
> llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>
> >::run(llvm::LazyCallGraph::SCC&,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
> llvm/include/llvm/Analysis/CGSCCPassManager.h:617:11
> #24 0x00005556f42ede49
> llvm::ModuleToPostOrderCGSCCPassAdaptor<llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&> > >::run(llvm::Module&,
> llvm::AnalysisManager<llvm::Module>&)
> llvm/include/llvm/Analysis/CGSCCPassManager.h:865:18
> #25 0x00005556f42ed735 llvm::detail::PassModel<llvm::Module,
> llvm::ModuleToPostOrderCGSCCPassAdaptor<llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
> llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
> llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&> > >,
> llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>
> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
> llvm/include/llvm/IR/PassManagerInternal.h:79:17
> #26 0x00005556f9d5e726 llvm::PassManager<llvm::Module,
> llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
> llvm::AnalysisManager<llvm::Module>&)
> llvm/include/llvm/IR/PassManager.h:519:33
>
>
>
> #27 0x00005556f42fe5f5 llvm::detail::PassModel<llvm::Module,
> llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >,
> llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>
> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
> llvm/include/llvm/IR/PassManagerInternal.h:79:17
>
> #28 0x00005556f9d5e726 llvm::PassManager<llvm::Module,
> llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
> llvm::AnalysisManager<llvm::Module>&)
> llvm/include/llvm/IR/PassManager.h:519:33
>
>
>
> #29 0x00005556f3ad4791 (anonymous
> namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction,
> std::__u::unique_ptr<llvm::raw_pwrite_stream,
> std::__u::default_delete<llvm::raw_pwrite_stream> >)
> llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:1324:5
>
>
> #30 0x00005556f3ad173e clang::EmitBackendOutput(clang::DiagnosticsEngine&,
> clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
> clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout
> const&, llvm::Module*, clang::BackendAction,
> std::__u::unique_ptr<llvm::raw_pwrite_stream,
> std::__u::default_delete<llvm::raw_pwrite_stream> >)
> llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:1543:5
> #31 0x00005556f3ac726c
> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
> llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:307:7
> #32 0x00005556f5017623 clang::ParseAST(clang::Sema&, bool, bool)
> llvm/tools/clang/lib/Parse/ParseAST.cpp:178:12
> #33 0x00005556f4d1fae2 clang::ASTFrontendAction::ExecuteAction()
> llvm/tools/clang/lib/Frontend/FrontendAction.cpp:1044:1
> #34 0x00005556f3ac353b clang::CodeGenAction::ExecuteAction()
> llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:1089:1
> #35 0x00005556f4d1f4b8 clang::FrontendAction::Execute()
> llvm/tools/clang/lib/Frontend/FrontendAction.cpp:939:7
> #36 0x00005556f4cc16f0
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:957:23
> #37 0x00005556f2f7dfc0
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
> llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:290:8
> #38 0x00005556f2f5250c cc1_main(llvm::ArrayRef<char const*>, char const*,
> void*) llvm/tools/clang/tools/driver/cc1_main.cpp:250:13
> #39 0x00005556f2f76e5f ExecuteCC1Tool(llvm::ArrayRef<char const*>,
> llvm::StringRef) llvm/tools/clang/tools/driver/driver.cpp:309:5
> #40 0x00005556f2f761f9 main llvm/tools/clang/tools/driver/driver.cpp:382:5
>
>
> On Sun, Oct 13, 2019 at 4:18 AM Johannes Doerfert via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: jdoerfert
>> Date: Sat Oct 12 19:21:23 2019
>> New Revision: 374692
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=374692&view=rev
>> Log:
>> [SROA] Reuse existing lifetime markers if possible
>>
>> Summary:
>> If the underlying alloca did not change, we do not necessarily need new
>> lifetime markers. This patch adds a check and reuses the old ones if
>> possible.
>>
>> Reviewers: reames, ssarda, t.p.northover, hfinkel
>>
>> Subscribers: hiraditya, bollu, llvm-commits
>>
>> Tags: #llvm
>>
>> Differential Revision: https://reviews.llvm.org/D68900
>>
>> Added:
>>     llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll
>> Modified:
>>     llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=374692&r1=374691&r2=374692&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Sat Oct 12 19:21:23 2019
>> @@ -3072,6 +3072,13 @@ private:
>>      LLVM_DEBUG(dbgs() << "    original: " << II << "\n");
>>      assert(II.getArgOperand(1) == OldPtr);
>>
>> +    bool EntireRange = (NewBeginOffset == NewAllocaBeginOffset &&
>> +                        NewEndOffset == NewAllocaEndOffset);
>> +
>> +    // If the new lifetime marker would not differ from the old, just
>> keep it.
>> +    if (&OldAI == &NewAI && EntireRange)
>> +      return true;
>> +
>>      // Record this instruction for deletion.
>>      Pass.DeadInsts.insert(&II);
>>
>> @@ -3082,8 +3089,7 @@ private:
>>      // promoted, but PromoteMemToReg doesn't handle that case.)
>>      // FIXME: Check whether the alloca is promotable before dropping the
>>      // lifetime intrinsics?
>> -    if (NewBeginOffset != NewAllocaBeginOffset ||
>> -        NewEndOffset != NewAllocaEndOffset)
>> +    if (!EntireRange)
>>        return true;
>>
>>      ConstantInt *Size =
>>
>> Added: llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll?rev=374692&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll (added)
>> +++ llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll Sat Oct 12
>> 19:21:23 2019
>> @@ -0,0 +1,69 @@
>> +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
>> +; RUN: opt < %s -sroa -S | FileCheck %s
>> +;
>> +; Make sure we reuse the lifetime marker and do not create a new one
>> that looks the same but without the call site attributes.
>> +target datalayout =
>> "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
>> +
>> +; Function Attrs: argmemonly nounwind willreturn
>> +declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0
>> +
>> +; Function Attrs: argmemonly nounwind willreturn
>> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly,
>> i8* noalias nocapture readonly, i64, i1 immarg) #0
>> +
>> +define hidden void @old_markers() {
>> +;
>> +; CHECK-LABEL: define {{[^@]+}}@old_markers(
>> +; CHECK-NEXT:  entry:
>> +; CHECK-NEXT:    [[VV_SROA_4:%.*]] = alloca [3 x i32*]
>> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST61:%.*]] = bitcast [3 x i32*]*
>> [[VV_SROA_4]] to i8*
>> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST94:%.*]] = bitcast [3 x i32*]*
>> [[VV_SROA_4]] to i8*
>> +; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull
>> align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST94]])
>> +; CHECK-NEXT:    br i1 undef, label [[DO_BODY:%.*]], label
>> [[IF_END31:%.*]]
>> +; CHECK:       do.body:
>> +; CHECK-NEXT:    ret void
>> +; CHECK:       if.end31:
>> +; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias
>> nonnull align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST61]], i8*
>> noalias nonnull align 8 undef, i64 24, i1 false)
>> +; CHECK-NEXT:    unreachable
>> +;
>> +entry:
>> +  %vv.sroa.4 = alloca [3 x i32*]
>> +  %vv.sroa.4.0..sroa_cast61 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
>> +  %vv.sroa.4.0..sroa_cast94 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
>> +  call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull align 8
>> dereferenceable(24) %vv.sroa.4.0..sroa_cast94)
>> +  br i1 undef, label %do.body, label %if.end31
>> +
>> +do.body:                                          ; preds = %entry
>> +  ret void
>> +
>> +if.end31:                                         ; preds = %entry
>> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull align 8
>> dereferenceable(24) %vv.sroa.4.0..sroa_cast61, i8* noalias nonnull align 8
>> undef, i64 24, i1 false)
>> +  unreachable
>> +}
>> +
>> +define hidden void @new_markers() {
>> +;
>> +; CHECK-LABEL: define {{[^@]+}}@new_markers(
>> +; CHECK-NEXT:  entry:
>> +; CHECK-NEXT:    [[VV_SROA_4:%.*]] = alloca [3 x i32*]
>> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST61:%.*]] = bitcast [3 x i32*]*
>> [[VV_SROA_4]] to i8*
>> +; CHECK-NEXT:    br i1 undef, label [[DO_BODY:%.*]], label
>> [[IF_END31:%.*]]
>> +; CHECK:       do.body:
>> +; CHECK-NEXT:    ret void
>> +; CHECK:       if.end31:
>> +; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias
>> nonnull align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST61]], i8*
>> noalias nonnull align 8 undef, i64 24, i1 false)
>> +; CHECK-NEXT:    unreachable
>> +;
>> +entry:
>> +  %vv.sroa.4 = alloca [3 x i32*]
>> +  %vv.sroa.4.0..sroa_cast61 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
>> +  %vv.sroa.4.0..sroa_cast94 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
>> +  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull align 8
>> dereferenceable(24) %vv.sroa.4.0..sroa_cast94)
>> +  br i1 undef, label %do.body, label %if.end31
>> +
>> +do.body:                                          ; preds = %entry
>> +  ret void
>> +
>> +if.end31:                                         ; preds = %entry
>> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull align 8
>> dereferenceable(24) %vv.sroa.4.0..sroa_cast61, i8* noalias nonnull align 8
>> undef, i64 24, i1 false)
>> +  unreachable
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191014/17c3e715/attachment.html>
-------------- next part --------------
#pragma clang module import "//third_party/stl:stl"
template <typename, typename, typename a, typename b = a *> class c {
public:
  b operator->();
};
class d {
  char f;
  size_t g;
};
class h;
class i {
public:
  int j;
};
class C {
public:
  using e = h;
  e aa();
  e ab();
};
template <typename k, typename l>
class m : public c<k, std::forward_iterator_tag, l> {
public:
  bool operator==(h);
};
class h : public m<int, i> {};
class n {
public:
  n(d);
};
struct o {
  C ac;
  bool p(d, unsigned &);
};
struct H {
  o &ae;
};
struct I {
  enum r { af };
  bool ag(r);
  d q();
};
bool o::p(d, unsigned &u) {
  auto ah = ac.ab();
  if (ah == ac.aa())
    return u = ah->j;
  return false;
}
class s {
  I v;
  H &t;
  void ai(unsigned = 0);
  bool aj(const n &);
  bool ak();
};
bool s::aj(const n &) {
  bool x;
  return x;
}
bool s::ak() {
  while (v.ag(I::af)) {
    ai();
    unsigned y = 0;
    if (t.ae.p(v.q(), y))
      return aj(v.q());
  }
}


More information about the llvm-commits mailing list