[FastISel] Don't use sizeWithoutDebug() for debug records (#101648)
sizeWithoutDebug() iterates over the entire block, but all we do is to check whether the number is not equal to one. In times of debug records, simply check whether the first and last instructions are equal.
This commit is contained in:
@@ -86,6 +86,7 @@
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Mangler.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
@@ -1664,8 +1665,12 @@ bool FastISel::selectInstruction(const Instruction *I) {
|
||||
/// (fall-through) successor, and update the CFG.
|
||||
void FastISel::fastEmitBranch(MachineBasicBlock *MSucc,
|
||||
const DebugLoc &DbgLoc) {
|
||||
if (FuncInfo.MBB->getBasicBlock()->sizeWithoutDebug() > 1 &&
|
||||
FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
|
||||
const BasicBlock *BB = FuncInfo.MBB->getBasicBlock();
|
||||
bool BlockHasMultipleInstrs = &BB->front() != &BB->back();
|
||||
// Handle legacy case of debug intrinsics
|
||||
if (BlockHasMultipleInstrs && !BB->getModule()->IsNewDbgInfoFormat)
|
||||
BlockHasMultipleInstrs = BB->sizeWithoutDebug() > 1;
|
||||
if (BlockHasMultipleInstrs && FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
|
||||
// For more accurate line information if this is the only non-debug
|
||||
// instruction in the block then emit it, otherwise we have the
|
||||
// unconditional fall-through case, which needs no instructions.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
; RUN: llc -mtriple=aarch64 -O1 -opt-bisect-limit=2 -o - %s 2> /dev/null | FileCheck %s
|
||||
; RUN: llc --try-experimental-debuginfo-iterators -mtriple=aarch64 -O1 -opt-bisect-limit=2 -o - %s 2> /dev/null | FileCheck %s
|
||||
; RUN: llc --preserve-input-debuginfo-format=true -mtriple=aarch64 -O1 -opt-bisect-limit=2 -o - %s 2> /dev/null | FileCheck %s
|
||||
|
||||
define dso_local i32 @a() #0 !dbg !7 {
|
||||
entry:
|
||||
|
||||
Reference in New Issue
Block a user