StringRef Name;
unsigned Alignment = 0;
bool ExposesReturnsTwice = false;
- // MachineFunctionProperties
- bool AllVRegsAllocated = false;
// GISel MachineFunctionProperties.
bool Legalized = false;
bool RegBankSelected = false;
YamlIO.mapRequired("name", MF.Name);
YamlIO.mapOptional("alignment", MF.Alignment);
YamlIO.mapOptional("exposesReturnsTwice", MF.ExposesReturnsTwice);
- YamlIO.mapOptional("allVRegsAllocated", MF.AllVRegsAllocated);
YamlIO.mapOptional("legalized", MF.Legalized);
YamlIO.mapOptional("regBankSelected", MF.RegBankSelected);
YamlIO.mapOptional("selected", MF.Selected);
/// Each of these has checking code in the MachineVerifier, and passes can
/// require that a property be set.
class MachineFunctionProperties {
- // TODO: Add MachineVerifier checks for AllVRegsAllocated
// Possible TODO: Allow targets to extend this (perhaps by allowing the
// constructor to specify the size of the bit vector)
// Possible TODO: Allow requiring the negative (e.g. VRegsAllocated could be
// that affect the values in registers, for example by the register
// scavenger.
// When this property is clear, liveness is no longer reliable.
- // AllVRegsAllocated: All virtual registers have been allocated; i.e. all
- // register operands are physical registers.
+ // NoVRegs: The machine function does not use any virtual registers.
// Legalized: In GlobalISel: the MachineLegalizer ran and all pre-isel generic
// instructions have been legalized; i.e., all instructions are now one of:
// - generic and always legal (e.g., COPY)
IsSSA,
NoPHIs,
TracksLiveness,
- AllVRegsAllocated,
+ NoVRegs,
Legalized,
RegBankSelected,
Selected,
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
bool runOnMachineFunction(MachineFunction &F) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
}
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
/// Print to ostream with a message.
Properties.set(MachineFunctionProperties::Property::IsSSA);
else
Properties.clear(MachineFunctionProperties::Property::IsSSA);
+
+ const MachineRegisterInfo &MRI = MF.getRegInfo();
+ if (MRI.getNumVirtRegs() == 0)
+ Properties.set(MachineFunctionProperties::Property::NoVRegs);
}
bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF) {
if (YamlMF.Alignment)
MF.setAlignment(YamlMF.Alignment);
MF.setExposesReturnsTwice(YamlMF.ExposesReturnsTwice);
- if (YamlMF.AllVRegsAllocated)
- MF.getProperties().set(MachineFunctionProperties::Property::AllVRegsAllocated);
if (YamlMF.Legalized)
MF.getProperties().set(MachineFunctionProperties::Property::Legalized);
YamlMF.Name = MF.getName();
YamlMF.Alignment = MF.getAlignment();
YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
- YamlMF.AllVRegsAllocated = MF.getProperties().hasProperty(
- MachineFunctionProperties::Property::AllVRegsAllocated);
YamlMF.Legalized = MF.getProperties().hasProperty(
MachineFunctionProperties::Property::Legalized);
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
static const char *getPropertyName(MachineFunctionProperties::Property Prop) {
typedef MachineFunctionProperties::Property P;
switch(Prop) {
- case P::AllVRegsAllocated: return "AllVRegsAllocated";
case P::IsSSA: return "IsSSA";
case P::Legalized: return "Legalized";
case P::NoPHIs: return "NoPHIs";
+ case P::NoVRegs: return "NoVRegs";
case P::RegBankSelected: return "RegBankSelected";
case P::Selected: return "Selected";
case P::TracksLiveness: return "TracksLiveness";
void MachineVerifier::verifyProperties(const MachineFunction &MF) {
// If a pass has introduced virtual registers without clearing the
- // AllVRegsAllocated property (or set it without allocating the vregs)
+ // NoVRegs property (or set it without allocating the vregs)
// then report an error.
if (MF.getProperties().hasProperty(
- MachineFunctionProperties::Property::AllVRegsAllocated) &&
- MRI->getNumVirtRegs()) {
- report(
- "Function has AllVRegsAllocated property but there are VReg operands",
- &MF);
- }
+ MachineFunctionProperties::Property::NoVRegs) &&
+ MRI->getNumVirtRegs())
+ report("Function has NoVRegs property but there are VReg operands", &MF);
}
unsigned MachineVerifier::verify(MachineFunction &MF) {
bool runOnMachineFunction(MachineFunction &F) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
}
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
MachineFunctionProperties MFP;
if (UsesCalleeSaves)
- MFP.set(MachineFunctionProperties::Property::AllVRegsAllocated);
+ MFP.set(MachineFunctionProperties::Property::NoVRegs);
return MFP;
}
MachineFunctionProperties getSetProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
/// \brief Calculate the liveness information for the given machine function.
bool runOnMachineFunction(MachineFunction&) override;
MachineFunctionProperties getSetProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
} // end anonymous namespace
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override { return AARCH64_DEAD_REG_DEF_NAME; }
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
return "AArch64 Redundant Copy Elimination";
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
static char ID;
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
};
}
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
void insertDefsUses(MachineBasicBlock::instr_iterator MI,
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
void doInitialPlacement(std::vector<MachineInstr*> &CPEMIs);
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
void insertCallDefsUses(MachineBasicBlock::iterator MI,
bool runOnMachineFunction(MachineFunction &F) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
bool runOnMachineFunction(MachineFunction &F) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
bool runOnMachineFunction(MachineFunction &F) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
// Has no asserts of its own, but was not written to handle virtual regs.
disablePass(&ShrinkWrapID);
- // These functions all require the AllVRegsAllocated property.
+ // These functions all require the NoVRegs property.
disablePass(&MachineCopyPropagationID);
disablePass(&PostRASchedulerID);
disablePass(&FuncletLayoutID);
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
// This pass runs after regalloc and doesn't support VReg operands.
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
private:
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override { return "X86 FP Stackifier"; }
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
bool runOnMachineFunction(MachineFunction &MF) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {return "X86 vzeroupper inserter";}
bool runOnMachineFunction(MachineFunction &Fn) override;
MachineFunctionProperties getRequiredProperties() const override {
return MachineFunctionProperties().set(
- MachineFunctionProperties::Property::AllVRegsAllocated);
+ MachineFunctionProperties::Property::NoVRegs);
}
const char *getPassName() const override {
name: promote-load-from-store
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: false
liveins:
- { reg: '%x0' }
name: store-pair
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: false
liveins:
- { reg: '%x0' }
name: test_mov_0
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: false
frameInfo:
isFrameAddressTaken: false
name: f
alignment: 1
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%r0' }
---
name: foo
tracksRegLiveness: true
-allVRegsAllocated: true
body: |
bb.0:
successors: %bb.1, %bb.2
name: test_tlsdesc_callseq_length
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: false
liveins:
- { reg: '%w0' }
# CHECK-LABEL: name: copyprop1
# CHECK: bb.0:
# CHECK-NOT: %w20 = COPY
-name: copyprop1
-allVRegsAllocated: true
-body: |
+name: copyprop1
+body: |
bb.0:
liveins: %w0, %w1
%w20 = COPY %w1
# CHECK-LABEL: name: copyprop2
# CHECK: bb.0:
# CHECK: %w20 = COPY
-name: copyprop2
-allVRegsAllocated: true
-body: |
+name: copyprop2
+body: |
bb.0:
liveins: %w0, %w1
%w20 = COPY %w1
# CHECK-LABEL: name: copyprop3
# CHECK: bb.0:
# CHECK-NOT: COPY
-name: copyprop3
-allVRegsAllocated: true
-body: |
+name: copyprop3
+body: |
bb.0:
liveins: %w0, %w1
%w20 = COPY %w1
# CHECK-LABEL: name: copyprop4
# CHECK: bb.0:
# CHECK-NOT: COPY
-name: copyprop4
-allVRegsAllocated: true
-body: |
+name: copyprop4
+body: |
bb.0:
liveins: %w0, %w1
%w20 = COPY %w0
name: f
alignment: 1
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%r0' }
---
name: foo
tracksRegLiveness: true
-allVRegsAllocated: true
body: |
bb.0:
successors:
name: test0a
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test0b
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test1a
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test1b
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test2a
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test2b
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test3
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: test4
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: testBB
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr }
name: mm_update_next_owner
alignment: 4
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%x3' }
name: test1
alignment: 4
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
frameInfo:
isFrameAddressTaken: false
name: fn1
alignment: 2
exposesReturnsTwice: false
-allVRegsAllocated: false
tracksRegLiveness: true
registers:
- { id: 0, class: g8rc }
---
name: foo
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movb_killed
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movb_impuse
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movb_impdef_gr64
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movb_impdef_gr32
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movb_impdef_gr16
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movw_impdef_gr32
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
---
name: test_movw_impdef_gr64
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
name: imp_null_check_with_bitwise_op_0
# CHECK-LABEL: name: imp_null_check_with_bitwise_op_0
alignment: 4
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
---
name: imp_null_check_with_bitwise_op_1
alignment: 4
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
name: imp_null_check_with_bitwise_op_2
# CHECK-LABEL: name: imp_null_check_with_bitwise_op_2
alignment: 4
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
name: imp_null_check_with_bitwise_op_3
# CHECK-LABEL: name: imp_null_check_with_bitwise_op_3
alignment: 4
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%rdi' }
# CHECK-NOT: COPY
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop_remove_kill0
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rdi
# CHECK-NOT: COPY
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop_remove_kill1
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rdi
# CHECK-NOT: COPY
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop_remove_kill2
-allVRegsAllocated: true
body: |
bb.0:
%ax = COPY %di
# CHECK-NOT: COPY
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop0
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rdi
# CHECK-NEXT: NOOP implicit %rax
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop1
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rdi
# CHECK-NOT: %rax = COPY %rdi
# CHECK-NEXT: NOOP implicit %rax, implicit %rdi
name: copyprop2
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rdi
# CHECK-NEXT: %rbp = COPY %rax
# CHECK-NEXT: NOOP implicit %rax, implicit %rbp
name: nocopyprop0
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rbp
# CHECK-NEXT: %rax = COPY %rbp
# CHECK-NEXT: NOOP implicit %rax, implicit %rbp
name: nocopyprop1
-allVRegsAllocated: true
body: |
bb.0:
%rbp = COPY %rax
# CHECK-NEXT: %rax = COPY %rbp
# CHECK-NEXT: NOOP implicit %rax, implicit %rbp
name: nocopyprop2
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rbp
# CHECK-NEXT: %rbp = COPY %rax
# CHECK-NEXT: NOOP implicit %rax, implicit %rbp
name: nocopyprop3
-allVRegsAllocated: true
body: |
bb.0:
%rbp = COPY %rax
# CHECK-NEXT: %rax = COPY %rip
# CHECK-NEXT: NOOP implicit %rax
name: nocopyprop4
-allVRegsAllocated: true
body: |
bb.0:
%rax = COPY %rip
# CHECK-NEXT: %rip = COPY %rax
# CHECK-NEXT: %rip = COPY %rax
name: nocopyprop5
-allVRegsAllocated: true
body: |
bb.0:
%rip = COPY %rax
---
# CHECK-LABEL: main
name: main
-allVRegsAllocated: true
tracksRegLiveness: true
frameInfo:
stackSize: 52
name: add
alignment: 4
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }
name: main
alignment: 4
exposesReturnsTwice: false
-allVRegsAllocated: true
tracksRegLiveness: true
liveins:
- { reg: '%edi' }