[llvm] Reland "[NFC] Move DroppedVariableStats to its own file and redesign it to be extensible (#118546)" (PR #119048)

via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 6 17:15:54 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Shubham Sandeep Rastogi (rastogishubham)

<details>
<summary>Changes</summary>



Move the virtual destructor definition to the cpp file and see if that gets rid of the undefined vtable error.

---

Patch is 128.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/119048.diff


10 Files Affected:

- (added) 0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch (+1301) 
- (added) 0001-Reland-NFC-Move-DroppedVariableStats-to-its-own-file.patch (+1045) 
- (added) llvm/include/llvm/CodeGen/DroppedVariableStats.h (+224) 
- (modified) llvm/include/llvm/Passes/StandardInstrumentations.h (+2-78) 
- (modified) llvm/lib/CodeGen/CMakeLists.txt (+1) 
- (added) llvm/lib/CodeGen/DroppedVariableStats.cpp (+196) 
- (modified) llvm/lib/Passes/StandardInstrumentations.cpp (+2-176) 
- (modified) llvm/unittests/CodeGen/CMakeLists.txt (+1) 
- (renamed) llvm/unittests/CodeGen/DroppedVariableStatsIRTest.cpp (+30-44) 
- (modified) llvm/unittests/IR/CMakeLists.txt (-1) 


``````````diff
diff --git a/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch b/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch
new file mode 100644
index 00000000000000..95c0a0b54f7e24
--- /dev/null
+++ b/0001-Reland-Add-a-pass-to-collect-dropped-var-stats-for-M.patch
@@ -0,0 +1,1301 @@
+From 8f00eaaa595c1b908d43b1de288e3c03f1f998bf Mon Sep 17 00:00:00 2001
+From: Shubham Sandeep Rastogi <srastogi22 at apple.com>
+Date: Mon, 18 Nov 2024 16:06:59 -0800
+Subject: [PATCH] Reland "Add a pass to collect dropped var stats for MIR"
+
+Moved the MIR Test to the unittests/CodeGen folder
+---
+ .../llvm/CodeGen/DroppedVariableStats.h       |   48 +-
+ .../llvm/CodeGen/MachineFunctionPass.h        |    2 +
+ llvm/lib/CodeGen/DroppedVariableStats.cpp     |   63 +-
+ llvm/lib/CodeGen/MachineFunctionPass.cpp      |   15 +-
+ llvm/unittests/CodeGen/CMakeLists.txt         |    1 +
+ .../CodeGen/DroppedVariableStatsMIRTest.cpp   | 1067 +++++++++++++++++
+ 6 files changed, 1193 insertions(+), 3 deletions(-)
+ create mode 100644 llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
+
+diff --git a/llvm/include/llvm/CodeGen/DroppedVariableStats.h b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
+index 371d775b02e8..f6050c68c91a 100644
+--- a/llvm/include/llvm/CodeGen/DroppedVariableStats.h
++++ b/llvm/include/llvm/CodeGen/DroppedVariableStats.h
+@@ -7,7 +7,7 @@
+ ///===---------------------------------------------------------------------===//
+ /// \file
+ /// Dropped Variable Statistics for Debug Information. Reports any number
+-/// of #dbg_value that get dropped due to an optimization pass.
++/// of #dbg_values or DBG_VALUEs that get dropped due to an optimization pass.
+ ///
+ ///===---------------------------------------------------------------------===//
+ 
+@@ -221,6 +221,52 @@ private:
+   }
+ };
+ 
++/// A class to collect and print dropped debug information due to MIR
++/// optimization passes. After every MIR pass is run, it will print how many
++/// #DBG_VALUEs were dropped due to that pass.
++class DroppedVariableStatsMIR : public DroppedVariableStats {
++public:
++  DroppedVariableStatsMIR() : llvm::DroppedVariableStats(false) {}
++
++  void runBeforePass(StringRef PassID, MachineFunction *MF) {
++    if (PassID == "Debug Variable Analysis")
++      return;
++    setup();
++    return runOnMachineFunction(MF, true);
++  }
++
++  void runAfterPass(StringRef PassID, MachineFunction *MF) {
++    if (PassID == "Debug Variable Analysis")
++      return;
++    runOnMachineFunction(MF, false);
++    calculateDroppedVarStatsOnMachineFunction(MF, PassID, MF->getName().str());
++    cleanup();
++  }
++
++private:
++  const MachineFunction *MFunc;
++  /// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
++  /// after a pass has run to facilitate dropped variable calculation for an
++  /// llvm::MachineFunction.
++  void runOnMachineFunction(const MachineFunction *MF, bool Before);
++  /// Iterate over all Instructions in a MachineFunction and report any dropped
++  /// debug information.
++  void calculateDroppedVarStatsOnMachineFunction(const MachineFunction *MF,
++                                                 StringRef PassID,
++                                                 StringRef FuncOrModName);
++  /// Override base class method to run on an llvm::MachineFunction
++  /// specifically.
++  virtual void
++  visitEveryInstruction(unsigned &DroppedCount,
++                        DenseMap<VarID, DILocation *> &InlinedAtsMap,
++                        VarID Var) override;
++  /// Override base class method to run on DBG_VALUEs specifically.
++  virtual void visitEveryDebugRecord(
++      DenseSet<VarID> &VarIDSet,
++      DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
++      StringRef FuncName, bool Before) override;
++};
++
+ } // namespace llvm
+ 
+ #endif
+diff --git a/llvm/include/llvm/CodeGen/MachineFunctionPass.h b/llvm/include/llvm/CodeGen/MachineFunctionPass.h
+index caaf22c2139e..d82b593497ff 100644
+--- a/llvm/include/llvm/CodeGen/MachineFunctionPass.h
++++ b/llvm/include/llvm/CodeGen/MachineFunctionPass.h
+@@ -18,6 +18,7 @@
+ #ifndef LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
+ #define LLVM_CODEGEN_MACHINEFUNCTIONPASS_H
+ 
++#include "llvm/CodeGen/DroppedVariableStats.h"
+ #include "llvm/CodeGen/MachineFunction.h"
+ #include "llvm/Pass.h"
+ 
+@@ -67,6 +68,7 @@ private:
+   MachineFunctionProperties RequiredProperties;
+   MachineFunctionProperties SetProperties;
+   MachineFunctionProperties ClearedProperties;
++  DroppedVariableStatsMIR DroppedVarStatsMF;
+ 
+   /// createPrinterPass - Get a machine function printer pass.
+   Pass *createPrinterPass(raw_ostream &O,
+diff --git a/llvm/lib/CodeGen/DroppedVariableStats.cpp b/llvm/lib/CodeGen/DroppedVariableStats.cpp
+index 122fcad1293f..71f91292160f 100644
+--- a/llvm/lib/CodeGen/DroppedVariableStats.cpp
++++ b/llvm/lib/CodeGen/DroppedVariableStats.cpp
+@@ -7,7 +7,7 @@
+ ///===---------------------------------------------------------------------===//
+ /// \file
+ /// Dropped Variable Statistics for Debug Information. Reports any number
+-/// of #dbg_value that get dropped due to an optimization pass.
++/// of #dbg_values or DBG_VALUEs that get dropped due to an optimization pass.
+ ///
+ ///===---------------------------------------------------------------------===//
+ 
+@@ -192,3 +192,64 @@ void DroppedVariableStatsIR::visitEveryDebugRecord(
+     }
+   }
+ }
++
++void DroppedVariableStatsMIR::runOnMachineFunction(const MachineFunction *MF,
++                                                   bool Before) {
++  auto &DebugVariables = DebugVariablesStack.back()[&MF->getFunction()];
++  auto FuncName = MF->getName();
++  MFunc = MF;
++  run(DebugVariables, FuncName, Before);
++}
++
++void DroppedVariableStatsMIR::calculateDroppedVarStatsOnMachineFunction(
++    const MachineFunction *MF, StringRef PassID, StringRef FuncOrModName) {
++  MFunc = MF;
++  StringRef FuncName = MF->getName();
++  const Function *Func = &MF->getFunction();
++  DebugVariables &DbgVariables = DebugVariablesStack.back()[Func];
++  calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName,
++                                "MachineFunction", Func);
++}
++
++void DroppedVariableStatsMIR::visitEveryInstruction(
++    unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap,
++    VarID Var) {
++  unsigned PrevDroppedCount = DroppedCount;
++  const DIScope *DbgValScope = std::get<0>(Var);
++  for (const auto &MBB : *MFunc) {
++    for (const auto &MI : MBB) {
++      if (!MI.isDebugInstr()) {
++        auto *DbgLoc = MI.getDebugLoc().get();
++        if (!DbgLoc)
++          continue;
++
++        auto *Scope = DbgLoc->getScope();
++        if (updateDroppedCount(DbgLoc, Scope, DbgValScope, InlinedAtsMap, Var,
++                               DroppedCount))
++          break;
++      }
++    }
++    if (PrevDroppedCount != DroppedCount) {
++      PrevDroppedCount = DroppedCount;
++      break;
++    }
++  }
++}
++
++void DroppedVariableStatsMIR::visitEveryDebugRecord(
++    DenseSet<VarID> &VarIDSet,
++    DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
++    StringRef FuncName, bool Before) {
++  for (const auto &MBB : *MFunc) {
++    for (const auto &MI : MBB) {
++      if (MI.isDebugValueLike()) {
++        auto *DbgVar = MI.getDebugVariable();
++        if (!DbgVar)
++          continue;
++        auto DbgLoc = MI.getDebugLoc();
++        populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap,
++                                      FuncName, Before);
++      }
++    }
++  }
++}
+diff --git a/llvm/lib/CodeGen/MachineFunctionPass.cpp b/llvm/lib/CodeGen/MachineFunctionPass.cpp
+index 62ac3e32d24d..e803811643f8 100644
+--- a/llvm/lib/CodeGen/MachineFunctionPass.cpp
++++ b/llvm/lib/CodeGen/MachineFunctionPass.cpp
+@@ -32,6 +32,11 @@
+ using namespace llvm;
+ using namespace ore;
+ 
++static cl::opt<bool> DroppedVarStatsMIR(
++    "dropped-variable-stats-mir", cl::Hidden,
++    cl::desc("Dump dropped debug variables stats for MIR passes"),
++    cl::init(false));
++
+ Pass *MachineFunctionPass::createPrinterPass(raw_ostream &O,
+                                              const std::string &Banner) const {
+   return createMachineFunctionPrinterPass(O, Banner);
+@@ -91,7 +96,15 @@ bool MachineFunctionPass::runOnFunction(Function &F) {
+ 
+   MFProps.reset(ClearedProperties);
+ 
+-  bool RV = runOnMachineFunction(MF);
++  bool RV;
++  if (DroppedVarStatsMIR) {
++    auto PassName = getPassName();
++    DroppedVarStatsMF.runBeforePass(PassName, &MF);
++    RV = runOnMachineFunction(MF);
++    DroppedVarStatsMF.runAfterPass(PassName, &MF);
++  } else {
++    RV = runOnMachineFunction(MF);
++  }
+ 
+   if (ShouldEmitSizeRemarks) {
+     // We wanted size remarks. Check if there was a change to the number of
+diff --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
+index 807fd1a9b7b5..50ef1bb5b7af 100644
+--- a/llvm/unittests/CodeGen/CMakeLists.txt
++++ b/llvm/unittests/CodeGen/CMakeLists.txt
+@@ -28,6 +28,7 @@ add_llvm_unittest(CodeGenTests
+   DIEHashTest.cpp
+   DIETest.cpp
+   DroppedVariableStatsIRTest.cpp
++  DroppedVariableStatsMIRTest.cpp
+   DwarfStringPoolEntryRefTest.cpp
+   InstrRefLDVTest.cpp
+   LowLevelTypeTest.cpp
+diff --git a/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp b/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
+new file mode 100644
+index 000000000000..b26a89c7adcb
+--- /dev/null
++++ b/llvm/unittests/CodeGen/DroppedVariableStatsMIRTest.cpp
+@@ -0,0 +1,1067 @@
++//===- unittests/IR/DroppedVariableStatsTest.cpp - TimePassesHandler 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/AsmParser/Parser.h"
++#include "llvm/CodeGen/MIRParser/MIRParser.h"
++#include "llvm/CodeGen/MachineModuleInfo.h"
++#include "llvm/IR/Function.h"
++#include "llvm/IR/LegacyPassManager.h"
++#include "llvm/IR/Module.h"
++#include "llvm/MC/TargetRegistry.h"
++#include "llvm/Pass.h"
++#include "llvm/Passes/StandardInstrumentations.h"
++#include "llvm/Support/TargetSelect.h"
++#include "llvm/Target/TargetMachine.h"
++#include "gtest/gtest.h"
++#include <gtest/gtest.h>
++#include <llvm/ADT/SmallString.h>
++#include <llvm/IR/LLVMContext.h>
++#include <llvm/IR/Module.h>
++#include <llvm/IR/PassInstrumentation.h>
++#include <llvm/IR/PassManager.h>
++#include <llvm/IR/PassTimingInfo.h>
++#include <llvm/Support/raw_ostream.h>
++
++using namespace llvm;
++
++namespace {
++
++std::unique_ptr<TargetMachine>
++createTargetMachine(std::string TT, StringRef CPU, StringRef FS) {
++  std::string Error;
++  const Target *T = TargetRegistry::lookupTarget(TT, Error);
++  if (!T)
++    return nullptr;
++  TargetOptions Options;
++  return std::unique_ptr<TargetMachine>(
++      static_cast<TargetMachine *>(T->createTargetMachine(
++          TT, CPU, FS, Options, std::nullopt, std::nullopt)));
++}
++
++std::unique_ptr<Module> parseMIR(const TargetMachine &TM, StringRef MIRCode,
++                                 MachineModuleInfo &MMI, LLVMContext *Context) {
++  SMDiagnostic Diagnostic;
++  std::unique_ptr<Module> M;
++  std::unique_ptr<MemoryBuffer> MBuffer = MemoryBuffer::getMemBuffer(MIRCode);
++  auto MIR = createMIRParser(std::move(MBuffer), *Context);
++  if (!MIR)
++    return nullptr;
++
++  std::unique_ptr<Module> Mod = MIR->parseIRModule();
++  if (!Mod)
++    return nullptr;
++
++  Mod->setDataLayout(TM.createDataLayout());
++
++  if (MIR->parseMachineFunctions(*Mod, MMI)) {
++    M.reset();
++    return nullptr;
++  }
++  return Mod;
++}
++// This test ensures that if a DBG_VALUE and an instruction that exists in the
++// same scope as that DBG_VALUE are both deleted as a result of an optimization
++// pass, debug information is considered not dropped.
++TEST(DroppedVariableStatsMIR, BothDeleted) {
++  InitializeAllTargetInfos();
++  InitializeAllTargets();
++  InitializeAllTargetMCs();
++  PassInstrumentationCallbacks PIC;
++  PassInstrumentation PI(&PIC);
++
++  LLVMContext C;
++
++  const char *MIR =
++      R"(
++--- |
++  ; ModuleID = '/tmp/test.ll'
++  source_filename = "/tmp/test.ll"
++  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
++  
++  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
++  entry:
++      #dbg_value(i32 %x, !10, !DIExpression(), !11)
++    %add = add nsw i32 %x, 1, !dbg !12
++    ret i32 0
++  }
++  
++  !llvm.dbg.cu = !{!0}
++  !llvm.module.flags = !{!2}
++  !llvm.ident = !{!3}
++  
++  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
++  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
++  !2 = !{i32 2, !"Debug Info Version", i32 3}
++  !3 = !{!"clang"}
++  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
++  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
++  !6 = !DISubroutineType(types: !7)
++  !7 = !{!8, !8}
++  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++  !9 = !{!10}
++  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
++  !11 = !DILocation(line: 0, scope: !4)
++  !12 = !DILocation(line: 2, column: 11, scope: !4)
++
++...
++---
++name:            _Z3fooi
++alignment:       4
++exposesReturnsTwice: false
++legalized:       false
++regBankSelected: false
++selected:        false
++failedISel:      false
++tracksRegLiveness: true
++hasWinCFI:       false
++noPhis:          false
++isSSA:           true
++noVRegs:         false
++hasFakeUses:     false
++callsEHReturn:   false
++callsUnwindInit: false
++hasEHCatchret:   false
++hasEHScopes:     false
++hasEHFunclets:   false
++isOutlined:      false
++debugInstrRef:   false
++failsVerification: false
++tracksDebugUserValues: false
++registers:
++  - { id: 0, class: _, preferred-register: '', flags: [  ] }
++  - { id: 1, class: _, preferred-register: '', flags: [  ] }
++  - { id: 2, class: _, preferred-register: '', flags: [  ] }
++  - { id: 3, class: _, preferred-register: '', flags: [  ] }
++liveins:
++  - { reg: '$w0', virtual-reg: '' }
++frameInfo:
++  isFrameAddressTaken: false
++  isReturnAddressTaken: false
++  hasStackMap:     false
++  hasPatchPoint:   false
++  stackSize:       0
++  offsetAdjustment: 0
++  maxAlignment:    1
++  adjustsStack:    false
++  hasCalls:        false
++  stackProtector:  ''
++  functionContext: ''
++  maxCallFrameSize: 4294967295
++  cvBytesOfCalleeSavedRegisters: 0
++  hasOpaqueSPAdjustment: false
++  hasVAStart:      false
++  hasMustTailInVarArgFunc: false
++  hasTailCall:     false
++  isCalleeSavedInfoValid: false
++  localFrameSize:  0
++  savePoint:       ''
++  restorePoint:    ''
++fixedStack:      []
++stack:           []
++entry_values:    []
++callSites:       []
++debugValueSubstitutions: []
++constants:       []
++machineFunctionInfo: {}
++body:             |
++  bb.1.entry:
++    liveins: $w0
++  
++    %0:_(s32) = COPY $w0
++    %1:_(s32) = G_CONSTANT i32 1
++    %3:_(s32) = G_CONSTANT i32 0
++    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), debug-location !11
++    %2:_(s32) = nsw G_ADD %0, %1, debug-location !12
++    $w0 = COPY %3(s32)
++    RET_ReallyLR implicit $w0
++    )";
++  auto TM = createTargetMachine(Triple::normalize("aarch64--"), "", "");
++  MachineModuleInfo MMI(TM.get());
++  std::unique_ptr<Module> M = parseMIR(*TM, MIR, MMI, &C);
++  ASSERT_TRUE(M);
++
++  DroppedVariableStatsMIR Stats;
++  auto *MF = MMI.getMachineFunction(*M->getFunction("_Z3fooi"));
++  Stats.runBeforePass("Test", MF);
++
++  // This loop simulates an IR pass that drops debug information.
++  for (auto &MBB : *MF) {
++    for (auto &MI : MBB) {
++      if (MI.isDebugValueLike()) {
++        MI.eraseFromParent();
++        break;
++      }
++    }
++    for (auto &MI : MBB) {
++      auto *DbgLoc = MI.getDebugLoc().get();
++      if (DbgLoc) {
++        MI.eraseFromParent();
++        break;
++      }
++    }
++    break;
++  }
++
++  Stats.runAfterPass("Test", MF);
++  ASSERT_EQ(Stats.getPassDroppedVariables(), false);
++}
++
++// This test ensures that if a DBG_VALUE is dropped after an optimization pass,
++// but an instruction that shares the same scope as the DBG_VALUE still exists,
++// debug information is conisdered dropped.
++TEST(DroppedVariableStatsMIR, DbgValLost) {
++  InitializeAllTargetInfos();
++  InitializeAllTargets();
++  InitializeAllTargetMCs();
++  PassInstrumentationCallbacks PIC;
++  PassInstrumentation PI(&PIC);
++
++  LLVMContext C;
++
++  const char *MIR =
++      R"(
++--- |
++  ; ModuleID = '/tmp/test.ll'
++  source_filename = "/tmp/test.ll"
++  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
++  
++  define noundef range(i32 -2147483647, -2147483648) i32 @_Z3fooi(i32 noundef %x) local_unnamed_addr !dbg !4 {
++  entry:
++      #dbg_value(i32 %x, !10, !DIExpression(), !11)
++    %add = add nsw i32 %x, 1, !dbg !12
++    ret i32 0
++  }
++  
++  !llvm.dbg.cu = !{!0}
++  !llvm.module.flags = !{!2}
++  !llvm.ident = !{!3}
++  
++  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: Apple, sysroot: "/")
++  !1 = !DIFile(filename: "/tmp/code.cpp", directory: "/")
++  !2 = !{i32 2, !"Debug Info Version", i32 3}
++  !3 = !{!"clang"}
++  !4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !5, file: !5, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !9)
++  !5 = !DIFile(filename: "/tmp/code.cpp", directory: "")
++  !6 = !DISubroutineType(types: !7)
++  !7 = !{!8, !8}
++  !8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
++  !9 = !{!10}
++  !10 = !DILocalVariable(name: "x", arg: 1, scope: !4, file: !5, line: 1, type: !8)
++  !11 = !DILocation(line: 0, scope: !4)
++  !12 = !DILocation(line: 2, column: 11, scope: !4)
++
++...
++---
++name:            _Z3fooi
++alignment:       4
++exposesReturnsTwice: false
++legalized:       false
++regBankSelected: false
++selected:        false
++failedISel:      false
++tracksRegLiveness: true
++hasWinCFI:       false
++noPhis:          false
++isSSA:           true
++noVRegs:         false
++hasFakeUses:     false
++callsEHReturn:   false
++callsUnwindInit: false
++hasEHCatchret:   false
++hasEHScopes:     false
++hasEHFunclets:   false
++isOutlined:      false
++debugInstrRef:   false
++failsVerification: false
++tracksDebugUserValues: false
++registers:
++  - { id: 0, class: _, preferred-register: '', flags: [  ] }
++  - { id: 1, class: _, preferred-register: '', flags: [  ] }
++  - { id: 2, class: _, preferred-register: '', flags: [  ] }
++  - { id: 3, class: _, preferred-register: '', flags: [  ] }
++liveins:
++  - { reg: '$w0', virtual-reg: '' }
++frameInfo:
++  isFrameAddressTaken: false
++  isReturnAddressTaken: false
++  hasStackMap:     false
++  hasPatchPoint:   false
++  stackSize:       0
++  offsetAdjustment: 0
++  maxAlignment:    1
++  adjustsStack:    false
++  hasCalls:        false
++  stackProtector:  ''
++  functionContext: ''
++  maxCallFrameSize: 4294967295
++  cvBytesOfCalleeSavedRegisters: 0
++  hasOpaqueSPAdjustment: false
++  hasVAStart:      false
++  hasMustTailInVarArgFunc: false
++  hasTailCall:     false
++  isCalleeSavedInfoValid: false
++  localFrameSize:  0
++  savePoint:       ''
++  restorePoint:    ''
++fixedStack:      []
++stack:           []
++entry_values:    []
++callSites:       []
++debugValueSubstitutions: []
++constants:       []
++machineFunctionInfo: {}
++body:             |
++  bb.1.entry:
++    liveins: $w0
++  
++    %0:_(s32) = COPY $w0
++    %1:_(s32) = G_CONSTANT i32 1
++    %3:_(s32) = G_CONSTANT i32 0
++    DBG_VALUE %0(s32), $noreg, !10, !DIExpression(), deb...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/119048


More information about the llvm-commits mailing list