mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-09 11:32:48 +00:00
Add trunc->branch support, this won't help with clang's i8->i1 truncations
for bools, but is a start. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130534 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8ddf6f2952
commit
bcf26aee86
@ -1112,6 +1112,30 @@ bool ARMFastISel::SelectBranch(const Instruction *I) {
|
||||
unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc;
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc))
|
||||
.addMBB(TBB).addImm(ARMPred).addReg(ARM::CPSR);
|
||||
FastEmitBranch(FBB, DL);
|
||||
FuncInfo.MBB->addSuccessor(TBB);
|
||||
return true;
|
||||
}
|
||||
} else if (TruncInst *TI = dyn_cast<TruncInst>(BI->getCondition())) {
|
||||
MVT SourceVT;
|
||||
if (TI->hasOneUse() && TI->getParent() == I->getParent() &&
|
||||
(isTypeLegal(TI->getOperand(0)->getType(), SourceVT))) {
|
||||
unsigned TstOpc = isThumb ? ARM::t2TSTri : ARM::TSTri;
|
||||
unsigned OpReg = getRegForValue(TI->getOperand(0));
|
||||
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
|
||||
TII.get(TstOpc))
|
||||
.addReg(OpReg).addImm(1));
|
||||
|
||||
unsigned CCMode = ARMCC::NE;
|
||||
if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {
|
||||
std::swap(TBB, FBB);
|
||||
CCMode = ARMCC::EQ;
|
||||
}
|
||||
|
||||
unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc;
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc))
|
||||
.addMBB(TBB).addImm(CCMode).addReg(ARM::CPSR);
|
||||
|
||||
FastEmitBranch(FBB, DL);
|
||||
FuncInfo.MBB->addSuccessor(TBB);
|
||||
return true;
|
||||
@ -1132,7 +1156,6 @@ bool ARMFastISel::SelectBranch(const Instruction *I) {
|
||||
AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TstOpc))
|
||||
.addReg(CmpReg).addImm(1));
|
||||
|
||||
|
||||
unsigned CCMode = ARMCC::NE;
|
||||
if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {
|
||||
std::swap(TBB, FBB);
|
||||
|
@ -13,4 +13,19 @@ entry:
|
||||
%tmp1 = load i32* %b.addr
|
||||
%add = add nsw i32 %tmp, %tmp1
|
||||
ret i32 %add
|
||||
}
|
||||
}
|
||||
|
||||
define void @test1(i32 %tmp) nounwind {
|
||||
entry:
|
||||
%tobool = trunc i32 %tmp to i1
|
||||
br i1 %tobool, label %if.then, label %if.end
|
||||
|
||||
if.then: ; preds = %entry
|
||||
call void @test1(i32 0)
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %if.then, %entry
|
||||
ret void
|
||||
; CHECK: test1:
|
||||
; CHECK: tst r0, #1
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user