https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/210236
Backport da6f3e6 Requested by: @iajbar >From 767ef0cf8c0451338db3757936de0f4cdb4ce4b8 Mon Sep 17 00:00:00 2001 From: Ikhlas Ajbar <[email protected]> Date: Thu, 16 Jul 2026 14:18:20 -0500 Subject: [PATCH] [Hexagon] Fix HexagonRDFOpt hang during live-in recomputation (#209986) After HexagonRDFOpt, the compiler recomputed live-in registers for every block in one batch. On large inputs (e.g. kernel builds) this was slow, and on some functions each pass changed the live-in values of other blocks, triggering more passes until the compiler hung (PR #207422). Fix: process blocks one at a time in post-order (successors before predecessors) and stop as soon as nothing changes. Add a pass limit as a safety net to keep compile time bounded in all cases. (cherry picked from commit da6f3e6cc2565e4c6cf720931845c8eee132ce86) --- llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp | 26 +- .../CodeGen/Hexagon/rdfopt-liveins-hang.mir | 541 ++++++++++++++++++ 2 files changed, 562 insertions(+), 5 deletions(-) create mode 100644 llvm/test/CodeGen/Hexagon/rdfopt-liveins-hang.mir diff --git a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp index 10aeb5381d694..cd367a88ed68e 100644 --- a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp +++ b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp @@ -14,6 +14,7 @@ #include "RDFCopy.h" #include "RDFDeadCode.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/CodeGen/LivePhysRegs.h" @@ -426,11 +427,26 @@ bool HexagonRDFOpt::runOnMachineFunction(MachineFunction &MF) { // lists. Skip: // - the entry block: handled above from the RDF LiveMap; // - EH pads: exception pointer/selector are runtime-established. - SmallVector<MachineBasicBlock *, 16> Blocks; - for (MachineBasicBlock &B : MF) - if (!B.isEntryBlock() && !B.isEHPad()) - Blocks.push_back(&B); - fullyRecomputeLiveIns(Blocks); + // + // Recompute live-ins one block at a time, visiting successors before + // predecessors (post-order). This way each block already has fresh + // live-in info from its successors when it is processed. + SmallVector<MachineBasicBlock *, 16> Candidates; + for (MachineBasicBlock *MBB : post_order(&MF)) + if (!MBB->isEntryBlock() && !MBB->isEHPad()) + Candidates.push_back(MBB); + + // One pass is usually enough. If any block's live-ins changed, repeat + // because its predecessors may need updating too. Stop after + // MaxLiveInSweeps passes to keep compile time bounded. + constexpr unsigned MaxLiveInSweeps = 8; + for (unsigned Sweep = 0; Sweep != MaxLiveInSweeps; ++Sweep) { + bool AnyChanged = false; + for (MachineBasicBlock *MBB : Candidates) + AnyChanged |= recomputeLiveIns(*MBB); + if (!AnyChanged) + break; + } // Recompute kill flags against the updated live-in lists. LV.resetKills(); diff --git a/llvm/test/CodeGen/Hexagon/rdfopt-liveins-hang.mir b/llvm/test/CodeGen/Hexagon/rdfopt-liveins-hang.mir new file mode 100644 index 0000000000000..51e4c315d3a72 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/rdfopt-liveins-hang.mir @@ -0,0 +1,541 @@ +# RUN: llc -mtriple=hexagon-unknown-linux-musl -run-pass=hexagon-rdf-opt \ +# RUN: -verify-machineinstrs -o /dev/null %s +# +# Regression test for a HexagonRDFOpt compile-time hang. +# +# The pass used to recompute live-in registers for every block in one +# big batch. On some functions the live-in values never stopped changing, +# causing the compiler to hang +# +# The fix processes blocks one at a time in post-order and stops as +# soon as nothing changes, with a pass limit as a safety net. +# This test should finish in well under a second. + +--- | + target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" + target triple = "hexagon-unknown-linux-musl" + + %struct.folio = type { %struct.page } + %struct.page = type { %struct.memdesc_flags_t, %struct.anon, i32, ptr, i32, i32, i32, i32 } + %struct.memdesc_flags_t = type { i32 } + %struct.anon = type { %struct.list_head } + %struct.list_head = type { ptr, ptr } + %struct.dnode_of_data = type { ptr, %struct.folio, ptr, i32, i32 } + + @data_blkaddr_node_folio = dso_local global %struct.folio zeroinitializer, align 4 + @data_blkaddr_folio = dso_local local_unnamed_addr global ptr @data_blkaddr_node_folio, align 4 + @f2fs_seek_block_folio = dso_local global %struct.folio zeroinitializer, align 4 + @f2fs_seek_block___trans_tmp_8 = dso_local local_unnamed_addr global ptr @f2fs_seek_block_folio, align 4 + @f2fs_seek_block_maxbytes = dso_local local_unnamed_addr global i32 2, align 4 + @mem_map = dso_local local_unnamed_addr global ptr null, align 4 + @__phys_offset = dso_local local_unnamed_addr global i32 0, align 4 + @f2fs_seek_block_pgofs = dso_local local_unnamed_addr global i32 0, align 4 + @f2fs_seek_block___trans_tmp_7 = dso_local local_unnamed_addr global ptr null, align 4 + @f2fs_seek_block___trans_tmp_9 = dso_local local_unnamed_addr global i8 0, align 1 + @f2fs_seek_block___trans_tmp_1 = dso_local local_unnamed_addr global i8 0, align 1 + @f2fs_seek_block___trans_tmp_14 = dso_local local_unnamed_addr global i32 0, align 4 + @f2fs_seek_block_end_offset = dso_local local_unnamed_addr global i32 0, align 4 + + declare i32 @get_inline_xattr_addrs(ptr noundef) local_unnamed_addr #0 + + ; Function Attrs: nounwind + define dso_local void @f2fs_seek_block(ptr noundef %file, i32 noundef %whence) local_unnamed_addr #1 { + entry: + %dn = alloca %struct.dnode_of_data, align 4 + %0 = load ptr, ptr %file, align 4, !tbaa !9 + %1 = load ptr, ptr %0, align 4, !tbaa !13 + call void @llvm.lifetime.start.p0(ptr nonnull %dn) #4 + call void @llvm.memset.p0.i32(ptr noundef nonnull align 4 dereferenceable(52) %dn, i8 -1, i32 52, i1 false), !annotation !16 + %call = tail call i64 @i_size_read(ptr noundef %1) #4 + %cmp = icmp slt i64 %call, 1 + br i1 %cmp, label %fail, label %for.cond.preheader + + for.cond.preheader: ; preds = %entry + %conv = trunc i64 %call to i32 + br label %for.body + + for.body: ; preds = %for.inc34.thread, %for.inc34, %for.cond.preheader + %conv374 = phi i64 [ 0, %for.cond.preheader ], [ 2, %for.inc34 ], [ 2, %for.inc34.thread ] + %2 = icmp eq i32 %conv, 0 + store ptr %1, ptr %dn, align 4, !tbaa !17 + %sunkaddr = getelementptr inbounds i8, ptr %dn, i32 40 + store ptr null, ptr %sunkaddr, align 4, !tbaa !27 + %sunkaddr99 = getelementptr inbounds i8, ptr %dn, i32 44 + store i32 0, ptr %sunkaddr99, align 4, !tbaa !28 + %3 = load i32, ptr @f2fs_seek_block_pgofs, align 4, !tbaa !29 + call void @f2fs_get_dnode_of_data(ptr noundef nonnull %dn, i32 noundef %3, i32 noundef 1) #4 + br i1 %2, label %if.end11, label %if.then6 + + if.then6: ; preds = %for.body + %4 = icmp eq i32 %whence, 0 + br i1 %4, label %found, label %for.inc34.thread + + if.end11: ; preds = %for.body + %5 = load ptr, ptr @mem_map, align 4, !tbaa !30 + %sub.ptr.rhs.cast.i = ptrtoint ptr %5 to i32 + %sub.ptr.sub.i = sub i32 0, %sub.ptr.rhs.cast.i + %sub.ptr.div.i = sdiv exact i32 %sub.ptr.sub.i, 36 + %6 = load i32, ptr @__phys_offset, align 4, !tbaa !32 + %add1.i = shl i32 %sub.ptr.div.i, 12 + %shr2.i = add i32 %add1.i, %6 + %shl.i = and i32 %shr2.i, -4096 + %7 = inttoptr i32 %shl.i to ptr + store ptr %7, ptr @f2fs_seek_block___trans_tmp_7, align 4, !tbaa !33 + %cgep96 = getelementptr inbounds i8, ptr %7, i32 4 + %p.sroa.5.0.copyload = load i16, ptr %cgep96, align 4, !tbaa !35 + %tobool13 = icmp ne i16 %p.sroa.5.0.copyload, 0 + %storedv = zext i1 %tobool13 to i8 + store i8 %storedv, ptr @f2fs_seek_block___trans_tmp_9, align 1, !tbaa !37 + store i8 %storedv, ptr @f2fs_seek_block___trans_tmp_1, align 1, !tbaa !37 + br i1 %tobool13, label %cond.true, label %cond.end + + cond.true: ; preds = %if.end11 + %call19 = call i32 @get_inline_xattr_addrs(ptr noundef %1) #4 + br label %cond.end + + cond.end: ; preds = %cond.true, %if.end11 + %cond = phi i32 [ %call19, %cond.true ], [ 2, %if.end11 ] + store i32 %cond, ptr @f2fs_seek_block___trans_tmp_14, align 4, !tbaa !32 + store i32 %cond, ptr @f2fs_seek_block_end_offset, align 4, !tbaa !29 + %cgep95 = getelementptr inbounds i8, ptr %dn, i32 48 + %8 = load i32, ptr %cgep95, align 4, !tbaa !39 + %cmp2173 = icmp ult i32 %8, %cond + br i1 %cmp2173, label %for.body23, label %for.inc34 + + for.body23: ; preds = %for.inc, %cond.end + %9 = phi i32 [ %23, %for.inc ], [ %8, %cond.end ] + %10 = load ptr, ptr %dn, align 4, !tbaa !17 + %11 = load ptr, ptr @mem_map, align 4, !tbaa !30 + %12 = load i32, ptr @__phys_offset, align 4, !tbaa !32 + %tobool.not.i.i = icmp eq ptr %10, null + br i1 %tobool.not.i.i, label %f2fs_data_blkaddr.exit, label %cond.true.i.i + + cond.true.i.i: ; preds = %for.body23 + %13 = load i32, ptr %10, align 4, !tbaa !40 + br label %f2fs_data_blkaddr.exit + + f2fs_data_blkaddr.exit: ; preds = %cond.true.i.i, %for.body23 + %cond.i.i = phi i32 [ %13, %cond.true.i.i ], [ 0, %for.body23 ] + %sub.ptr.rhs.cast.i.i.i = ptrtoint ptr %11 to i32 + %sub.ptr.sub.i.i.i = sub i32 0, %sub.ptr.rhs.cast.i.i.i + %sub.ptr.div.i.i.i = sdiv exact i32 %sub.ptr.sub.i.i.i, 36 + %add1.i.i.i = shl i32 %sub.ptr.div.i.i.i, 12 + %shr2.i.i.i = add i32 %add1.i.i.i, %12 + %shl.i.i.i = and i32 %shr2.i.i.i, -4096 + %14 = inttoptr i32 %shl.i.i.i to ptr + %cgep97 = getelementptr inbounds [2 x i8], ptr %14, i32 %cond.i.i + %15 = load i16, ptr %cgep97, align 2, !tbaa !35 + %conv.i.i = sext i16 %15 to i32 + %add.i.i = sub nsw i32 0, %conv.i.i + %tobool25.not = icmp eq i32 %9, %add.i.i + br i1 %tobool25.not, label %for.inc, label %land.lhs.true + + land.lhs.true: ; preds = %f2fs_data_blkaddr.exit + %call26 = call i32 @F2FS_I_SB(ptr noundef %1) #4 + %tobool27.not = icmp eq i32 %call26, 0 + %sunkaddr100 = getelementptr inbounds i8, ptr %dn, i32 48 + %.pre78 = load i32, ptr %sunkaddr100, align 4, !tbaa !32 + br i1 %tobool27.not, label %for.inc, label %if.then28 + + if.then28: ; preds = %land.lhs.true + %16 = load ptr, ptr %file, align 4, !tbaa !9 + %__trans_tmp_18.sroa.0.0.copyload.i = load ptr, ptr %dn, align 4, !tbaa !42 + %17 = load ptr, ptr @mem_map, align 4, !tbaa !30 + %18 = load i32, ptr @__phys_offset, align 4, !tbaa !32 + %tobool.not.i.i56 = icmp eq ptr %__trans_tmp_18.sroa.0.0.copyload.i, null + br i1 %tobool.not.i.i56, label %__found_offset.exit, label %cond.true.i.i57 + + cond.true.i.i57: ; preds = %if.then28 + %19 = load i32, ptr %__trans_tmp_18.sroa.0.0.copyload.i, align 4, !tbaa !40 + br label %__found_offset.exit + + __found_offset.exit: ; preds = %cond.true.i.i57, %if.then28 + %cond.i.i58 = phi i32 [ %19, %cond.true.i.i57 ], [ 0, %if.then28 ] + %sub.ptr.rhs.cast.i.i.i59 = ptrtoint ptr %17 to i32 + %sub.ptr.sub.i.i.i60 = sub i32 0, %sub.ptr.rhs.cast.i.i.i59 + %sub.ptr.div.i.i.i61 = sdiv exact i32 %sub.ptr.sub.i.i.i60, 36 + %add1.i.i.i62 = shl i32 %sub.ptr.div.i.i.i61, 12 + %shr2.i.i.i63 = add i32 %add1.i.i.i62, %18 + %shl.i.i.i64 = and i32 %shr2.i.i.i63, -4096 + %20 = inttoptr i32 %shl.i.i.i64 to ptr + %cgep98 = getelementptr inbounds [2 x i8], ptr %20, i32 %cond.i.i58 + %21 = load i16, ptr %cgep98, align 2, !tbaa !35 + %conv.i.i66 = sext i16 %21 to i32 + %22 = load ptr, ptr %16, align 4, !tbaa !13 + %call3.i = call i32 @get_inline_xattr_addrs(ptr noundef %22) #4 + %add.i.i67 = sub nsw i32 0, %conv.i.i66 + %tobool4.not.i = icmp ne i32 %.pre78, %add.i.i67 + %tobool.i = icmp ne i32 %call3.i, 0 + %retval.0.i = select i1 %tobool4.not.i, i1 %tobool.i, i1 false + br i1 %retval.0.i, label %found, label %__found_offset.exit.for.inc_crit_edge + + __found_offset.exit.for.inc_crit_edge: ; preds = %__found_offset.exit + %sunkaddr101 = getelementptr inbounds i8, ptr %dn, i32 48 + %.pre = load i32, ptr %sunkaddr101, align 4, !tbaa !39 + br label %for.inc + + for.inc: ; preds = %__found_offset.exit.for.inc_crit_edge, %land.lhs.true, %f2fs_data_blkaddr.exit + %23 = phi i32 [ %.pre, %__found_offset.exit.for.inc_crit_edge ], [ %9, %f2fs_data_blkaddr.exit ], [ %.pre78, %land.lhs.true ] + %24 = load i32, ptr @f2fs_seek_block_pgofs, align 4, !tbaa !29 + %inc = add nsw i32 %24, 1 + store i32 %inc, ptr @f2fs_seek_block_pgofs, align 4, !tbaa !29 + %25 = load i32, ptr @f2fs_seek_block_end_offset, align 4, !tbaa !29 + %cmp21 = icmp ult i32 %23, %25 + br i1 %cmp21, label %for.body23, label %for.inc34, !llvm.loop !43 + + for.inc34: ; preds = %for.inc, %cond.end + %26 = icmp ugt i64 %call, 2 + br i1 %26, label %for.body, label %for.end35, !llvm.loop !45 + + for.inc34.thread: ; preds = %if.then6 + %27 = icmp ugt i64 %call, 2 + %28 = load i32, ptr @f2fs_seek_block_pgofs, align 4, !tbaa !29 + %call9 = call i32 @f2fs_get_next_page_offset(ptr noundef nonnull %dn, i32 noundef %28) #4 + store i32 %call9, ptr @f2fs_seek_block_pgofs, align 4, !tbaa !29 + br i1 %27, label %for.body, label %found, !llvm.loop !45 + + for.end35: ; preds = %for.inc34 + %29 = icmp eq i32 %whence, 0 + br i1 %29, label %fail, label %found + + found: ; preds = %for.end35, %for.inc34.thread, %__found_offset.exit, %if.then6 + %conv372 = phi i64 [ %conv374, %__found_offset.exit ], [ 2, %for.end35 ], [ 2, %for.inc34.thread ], [ %conv374, %if.then6 ] + %30 = load i32, ptr @f2fs_seek_block_maxbytes, align 4, !tbaa !29 + %call39 = call i32 @vfs_setpos(ptr noundef nonnull %file, i64 noundef %conv372, i32 noundef %30) #4 + br label %fail + + fail: ; preds = %found, %for.end35, %entry + %call41 = call i32 @inode_unlock_shared(ptr noundef %1) #4 + call void @llvm.lifetime.end.p0(ptr nonnull %dn) #4 + ret void + } + + declare i64 @i_size_read(ptr noundef) local_unnamed_addr #0 + + declare void @f2fs_get_dnode_of_data(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #0 + + declare i32 @f2fs_get_next_page_offset(ptr noundef, i32 noundef) local_unnamed_addr #0 + + declare i32 @F2FS_I_SB(ptr noundef) local_unnamed_addr #0 + + declare i32 @vfs_setpos(ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #0 + + declare i32 @inode_unlock_shared(ptr noundef) local_unnamed_addr #0 + + ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) + declare void @llvm.lifetime.end.p0(ptr captures(none)) #2 + + ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) + declare void @llvm.lifetime.start.p0(ptr captures(none)) #2 + + ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: write) + declare void @llvm.memset.p0.i32(ptr writeonly captures(none), i8, i32, i1 immarg) #3 + + attributes #0 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv68" "target-features"="+reserved-r19,+v68,-long-calls" } + attributes #1 = { nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv68" "target-features"="+reserved-r19,+v68,-long-calls" } + attributes #2 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } + attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: write) } + attributes #4 = { nounwind } + + !llvm.module.flags = !{!0, !1, !2} + !llvm.ident = !{!3} + !llvm.errno.tbaa = !{!4} + + !0 = !{i32 8, !"PIC Level", i32 2} + !1 = !{i32 7, !"PIE Level", i32 2} + !2 = !{i32 7, !"frame-pointer", i32 2} + !3 = !{!"clang version 23.0.0git (https://github.com/llvm/llvm-project.git 46c2e1fb7698776e97028f6e1aba5b942390249d)"} + !4 = !{!5, !6, i64 0} + !5 = !{!"__libc_errno", !6, i64 0} + !6 = !{!"int", !7, i64 0} + !7 = !{!"omnipotent char", !8, i64 0} + !8 = !{!"Simple C/C++ TBAA"} + !9 = !{!10, !11, i64 0} + !10 = !{!"file", !11, i64 0} + !11 = !{!"p1 _ZTS13address_space", !12, i64 0} + !12 = !{!"any pointer", !7, i64 0} + !13 = !{!14, !15, i64 0} + !14 = !{!"address_space", !15, i64 0} + !15 = !{!"p1 int", !12, i64 0} + !16 = !{!"auto-init"} + !17 = !{!18, !15, i64 0} + !18 = !{!"dnode_of_data", !15, i64 0, !19, i64 4, !26, i64 40, !6, i64 44, !6, i64 48} + !19 = !{!"folio", !20, i64 0} + !20 = !{!"page", !21, i64 0, !23, i64 4, !22, i64 12, !11, i64 16, !22, i64 20, !6, i64 24, !6, i64 28, !6, i64 32} + !21 = !{!"", !22, i64 0} + !22 = !{!"long", !7, i64 0} + !23 = !{!"", !24, i64 0} + !24 = !{!"list_head", !25, i64 0, !25, i64 4} + !25 = !{!"p1 _ZTS9list_head", !12, i64 0} + !26 = !{!"p1 _ZTS5folio", !12, i64 0} + !27 = !{!18, !26, i64 40} + !28 = !{!18, !6, i64 44} + !29 = !{!22, !22, i64 0} + !30 = !{!31, !31, i64 0} + !31 = !{!"p1 _ZTS4page", !12, i64 0} + !32 = !{!6, !6, i64 0} + !33 = !{!34, !34, i64 0} + !34 = !{!"p1 _ZTS9f2fs_node", !12, i64 0} + !35 = !{!36, !36, i64 0} + !36 = !{!"short", !7, i64 0} + !37 = !{!38, !38, i64 0} + !38 = !{!"_Bool", !7, i64 0} + !39 = !{!18, !6, i64 48} + !40 = !{!41, !6, i64 0} + !41 = !{!"f2fs_inode_info", !6, i64 0} + !42 = !{!15, !15, i64 0} + !43 = distinct !{!43, !44} + !44 = !{!"llvm.loop.mustprogress"} + !45 = distinct !{!45, !44} +... +--- +name: f2fs_seek_block +alignment: 4 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +failedISel: false +tracksRegLiveness: true +hasWinCFI: false +noPhis: true +isSSA: false +noVRegs: true +hasFakeUses: false +callsEHReturn: false +callsUnwindInit: false +hasEHContTarget: false +hasEHScopes: false +hasEHFunclets: false +isOutlined: false +debugInstrRef: false +failsVerification: false +tracksDebugUserValues: true +registers: [] +liveins: [] +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 8 + adjustsStack: true + hasCalls: true + framePointerPolicy: all + stackProtector: '' + functionContext: '' + maxCallFrameSize: 4294967295 + cvBytesOfCalleeSavedRegisters: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false + hasTailCall: false + isCalleeSavedInfoValid: false + localFrameSize: 0 +fixedStack: [] +stack: + - { id: 0, name: '', type: default, offset: 0, size: 52, alignment: 8, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 1, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 2, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 3, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 4, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 5, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 6, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 7, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 8, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 9, name: '', type: spill-slot, offset: 0, size: 8, alignment: 8, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +entry_values: [] +callSites: [] +debugValueSubstitutions: [] +constants: [] +machineFunctionInfo: + stackAlignBaseReg: '' +body: | + bb.0: + successors: %bb.23(0x30000000), %bb.1(0x50000000) + liveins: $r0, $r1 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + J2_jumpt killed undef renamable $p0, %bb.23, implicit-def dead $pc + J2_jump %bb.1, implicit-def dead $pc + + bb.1: + successors: %bb.2(0x80000000) + liveins: $d10:0x0000000000000003, $r17, $r18 + + bb.2: + successors: %bb.4(0x30000000), %bb.3(0x50000000) + liveins: $d2:0x0000000000000003, $d10:0x0000000000000003, $d11, $r17, $r24, $r25, $r26, $r27, $r18 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + J2_jumpt killed undef renamable $p0, %bb.4, implicit-def dead $pc + J2_jump %bb.3, implicit-def dead $pc + + bb.3: + successors: %bb.22(0x04000000), %bb.20(0x7c000000) + liveins: $d10:0x0000000000000003, $d11, $r16, $r24, $r25, $r26, $r27, $r18 + + J2_jumpt killed undef renamable $p0, %bb.22, implicit-def dead $pc + J2_jump %bb.20, implicit-def dead $pc + + bb.4: + successors: %bb.5(0x50000000), %bb.6(0x30000000) + liveins: $d11, $r16, $r24, $r25, $r26, $r27, $r18 + + J2_jumpt killed undef renamable $p0, %bb.6, implicit-def dead $pc + J2_jump %bb.5, implicit-def dead $pc + + bb.5: + successors: %bb.6(0x80000000) + liveins: $d11, $r17, $r18, $r24, $r25, $r26, $r27 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + + bb.6: + successors: %bb.7(0x40000000), %bb.19(0x40000000) + liveins: $d2:0x0000000000000003, $d11, $r0, $r17, $r18, $r24, $r25, $r26, $r27 + + renamable $r16 = L2_loadri_io %stack.4, 0 :: (load (s32) from %stack.4) + J2_jumpf killed undef renamable $p0, %bb.19, implicit-def dead $pc + J2_jump %bb.7, implicit-def dead $pc + + bb.7: + successors: %bb.9(0x30000000), %bb.8(0x50000000) + liveins: $d2:0x0000000000000003, $d11, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + J2_jumpt killed undef renamable $p0, %bb.9, implicit-def dead $pc + J2_jump %bb.8, implicit-def dead $pc + + bb.8: + successors: %bb.9(0x80000000) + liveins: $d2:0x0000000000000003, $d11, $r0, $r2, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + bb.9: + successors: %bb.18(0x40000000), %bb.10(0x40000000) + liveins: $d2:0x0000000000000003, $d11, $r0, $r1, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + J2_jumpt killed undef renamable $p0, %bb.18, implicit-def dead $pc + J2_jump %bb.10, implicit-def dead $pc + + bb.10: + successors: %bb.11(0x30000000), %bb.12(0x50000000) + liveins: $d11, $r16, $r17, $r18, $r24, $r25, $r26, $r27 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + J2_jumpf killed undef renamable $p0, %bb.12, implicit-def $pc + + bb.11: + successors: %bb.18(0x80000000) + liveins: $d11, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + J2_jump %bb.18, implicit-def $pc + + bb.12: + successors: %bb.14(0x30000000), %bb.13(0x50000000) + liveins: $d11, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + J2_jumpt killed undef renamable $p0, %bb.14, implicit-def dead $pc + J2_jump %bb.13, implicit-def dead $pc + + bb.13: + successors: %bb.14(0x80000000) + liveins: $d11, $r0, $r2, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + bb.14: + successors: %bb.15(0x42000000), %bb.17(0x3e000000) + liveins: $d11, $r0, $r1, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + renamable $r4 = L2_loadri_io renamable $r16, 0 :: (load (s32), !tbaa !9) + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + renamable $r0 = L2_loadri_io killed renamable $r4, 0 :: (load (s32), !tbaa !13) + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + J2_jumpt killed undef renamable $p0, %bb.17, implicit-def dead $pc + J2_jump %bb.15, implicit-def dead $pc + + bb.15: + successors: %bb.16(0x07c1f07c), %bb.17(0x783e0f84) + liveins: $d11, $r0, $r16, $r17, $r18, $r24, $r25, $r26, $r27 + + renamable $p0 = C2_cmpeqi killed renamable $r0, 0 + J2_jumpt killed renamable $p0, %bb.17, implicit-def $pc + + bb.16: + successors: %bb.22(0x80000000) + liveins: $d11, $r17 + + J2_jump %bb.22, implicit-def $pc + + bb.17: + successors: %bb.18(0x80000000) + liveins: $d11, $r16, $r17, $r18, $r24, $r25, $r26, $r27 + + bb.18: + successors: %bb.7(0x7c000000), %bb.19(0x04000000) + liveins: $d2:0x0000000000000003, $d11, $r16, $r17, $r18, $r20, $r24, $r25, $r26, $r27 + + J2_jumpt killed undef renamable $p0, %bb.7, implicit-def dead $pc + J2_jump %bb.19, implicit-def dead $pc + + bb.19: + successors: %bb.2(0x7c000000), %bb.21(0x04000000) + liveins: $d2:0x0000000000000003, $r17, $r24, $r25, $r26, $r27, $r18 + + J2_jumpt killed undef renamable $p0, %bb.2, implicit-def dead $pc + J2_jump %bb.21, implicit-def dead $pc + + bb.20: + successors: %bb.2(0x7c000000), %bb.22(0x04000000) + liveins: $d10:0x0000000000000003, $r17, $r24, $r25, $r26, $r27, $r18 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + J2_jumpt killed undef renamable $p0, %bb.2, implicit-def dead $pc + J2_jump %bb.22, implicit-def dead $pc + + bb.21: + successors: %bb.23(0x30000000), %bb.22(0x50000000) + liveins: $r17 + + J2_jumpt killed undef renamable $p0, %bb.23, implicit-def dead $pc + J2_jump %bb.22, implicit-def dead $pc + + bb.22: + successors: %bb.23(0x80000000) + liveins: $d11, $r17 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + + bb.23: + liveins: $r17 + + ADJCALLSTACKDOWN 0, 0, implicit-def $r29, implicit-def dead $r30, implicit $r31, implicit $r30, implicit $r29 + ADJCALLSTACKUP 0, 0, implicit-def dead $r29, implicit-def dead $r30, implicit-def dead $r31, implicit $r29 + PS_jmpret $r31, implicit-def dead $pc +... _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
