Skip to content

Commit

Permalink
[lanai] LanaiSetflagAluCombiner more conservative
Browse files Browse the repository at this point in the history
Summary: LanaiSetflagAluCombiner could previously combine instructions across basic building blocks even when not legal. Make the LanaiSetflagAluCombiner more conservative to avoid this.

Reviewers: eliben

Subscribers: joker.eph, llvm-commits

Differential Revision: http://reviews.llvm.org/D18746

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265411 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
jpienaar committed Apr 5, 2016
1 parent e0d1a47 commit 148a26a
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 8 deletions.
12 changes: 7 additions & 5 deletions lib/Target/Lanai/LanaiSetflagAluCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,20 +233,22 @@ static bool isSuitableSetflag(MbbIterator Instruction, MbbIterator End) {
MbbIterator SCCUserIter = Instruction;
while (SCCUserIter != End) {
++SCCUserIter;
// Early exit when encountering flag setting instruction.
if (isFlagSettingInstruction(SCCUserIter->getOpcode()))
break;
// Early exit when encountering flag setting or return instruction.
if (isFlagSettingInstruction(SCCUserIter->getOpcode()) ||
SCCUserIter->isReturn())
// Only return true if flags are set post the flag setting instruction
// tested or a return is executed.
return true;
int CCIndex = getCCOperandPosition(SCCUserIter->getOpcode());
if (CCIndex != -1) {
LPCC::CondCode CC = static_cast<LPCC::CondCode>(
SCCUserIter->getOperand(CCIndex).getImm());
// Return false if the flag is used outside of a EQ, NE, PL and MI.
if (CC != LPCC::ICC_EQ && CC != LPCC::ICC_NE && CC != LPCC::ICC_PL &&
CC != LPCC::ICC_MI)
return false;
}
}

return true;
}

return false;
Expand Down
50 changes: 47 additions & 3 deletions test/CodeGen/Lanai/combined_alu_setcc.ll
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,50 @@ return: ; preds = %if.end6, %if.end, %
ret i32 %retval.0
}
; CHECK-LABEL: test4
; CHECK: and.f
; CHECK: and.f
; CHECK: and.f
; TODO: Re-enable test. This test is disabled post making the combiner more
; conservative.
; DISABLED_CHECK: and.f

; Test to avoid incorrect fusing that spans across basic blocks
@a = global i32 -1, align 4
@b = global i32 0, align 4

; Function Attrs: nounwind
define void @testBB() {
entry:
%0 = load i32, i32* @a, align 4, !tbaa !1
%1 = load i32, i32* @b, align 4, !tbaa !1
%sub.i = sub i32 %1, %0
%tobool = icmp sgt i32 %sub.i, -1
br i1 %tobool, label %if.end, label %if.then

if.then: ; preds = %entry
%call1 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
br label %while.body

while.body: ; preds = %if.then, %while.body
br label %while.body

if.end: ; preds = %entry
%cmp.i = icmp slt i32 %sub.i, 1
br i1 %cmp.i, label %if.then4, label %if.end7

if.then4: ; preds = %if.end
%call5 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
br label %while.body6

while.body6: ; preds = %if.then4, %while.body6
br label %while.body6

if.end7: ; preds = %if.end
ret void
}

declare i32 @g(...)
; CHECK-LABEL: testBB
; CHECK: sub.f {{.*}}, %r0

!1 = !{!2, !2, i64 0}
!2 = !{!"int", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}

0 comments on commit 148a26a

Please sign in to comment.