Index: lib/Target/X86/X86.h =================================================================== --- lib/Target/X86/X86.h +++ lib/Target/X86/X86.h @@ -147,6 +147,7 @@ void initializeX86ExecutionDomainFixPass(PassRegistry &); void initializeX86FlagsCopyLoweringPassPass(PassRegistry &); void initializeX86SpeculativeLoadHardeningPassPass(PassRegistry &); +void initializeX86CondBrFoldingPassPass(PassRegistry &); } // End llvm namespace Index: lib/Target/X86/X86CondBrFolding.cpp =================================================================== --- lib/Target/X86/X86CondBrFolding.cpp +++ lib/Target/X86/X86CondBrFolding.cpp @@ -62,8 +62,9 @@ namespace { class X86CondBrFoldingPass : public MachineFunctionPass { public: - X86CondBrFoldingPass() : MachineFunctionPass(ID) {} - + X86CondBrFoldingPass() : MachineFunctionPass(ID) { + initializeX86CondBrFoldingPassPass(*PassRegistry::getPassRegistry()); + } StringRef getPassName() const override { return "X86 CondBr Folding"; } bool runOnMachineFunction(MachineFunction &MF) override; @@ -73,12 +74,13 @@ AU.addRequired(); } -private: +public: static char ID; }; +} // namespace char X86CondBrFoldingPass::ID = 0; -} // namespace +INITIALIZE_PASS(X86CondBrFoldingPass, "X86CondBrFolding", "X86CondBrFolding", false, false) FunctionPass *llvm::createX86CondBrFolding() { return new X86CondBrFoldingPass(); Index: lib/Target/X86/X86TargetMachine.cpp =================================================================== --- lib/Target/X86/X86TargetMachine.cpp +++ lib/Target/X86/X86TargetMachine.cpp @@ -78,6 +78,7 @@ initializeX86AvoidSFBPassPass(PR); initializeX86SpeculativeLoadHardeningPassPass(PR); initializeX86FlagsCopyLoweringPassPass(PR); + initializeX86CondBrFoldingPassPass(PR); } static std::unique_ptr createTLOF(const Triple &TT) { Index: test/CodeGen/X86/test_x86condbr_globaladdr.mir =================================================================== --- /dev/null +++ test/CodeGen/X86/test_x86condbr_globaladdr.mir @@ -0,0 +1,30 @@ +# XFAIL: * +# RUN: llc -o - %s -mtriple=i686-- -mcpu=ivybridge --run-pass X86CondBrFolding | FileCheck %s +# Test wrong assertion when meet SUB32ri with global address +# in X86CondBrFoldingiPass +--- | + @img2buf_normal = external global i32 + define void @func() { ret void } +... +--- +# CHECK: bb.0: +# CHECK: %2:gr32 = SUB32ri %1, @img2buf_normal, implicit-def $eflags + +name: func +tracksRegLiveness: true +body: | + bb.0: + liveins: $edx + %1:gr32 = COPY $edx + %2:gr32 = MOV32rm %1:gr32, 1, $noreg, 850256, $noreg + %3:gr32 = SUB32ri %2:gr32, @img2buf_normal, implicit-def $eflags + JE_1 %bb.2, implicit $eflags + JMP_1 %bb.3 + + bb.2: + RET 0, undef $eax + + bb.3: + $eax = MOV32rr %3:gr32 + RET 0, $eax +...