mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-12 13:48:45 +00:00
[LoopUnswitch] Fix a simple bug which disables loop unswitch for select statement
This is to fix PR34257. rL309059 takes an early return when FindLIVLoopCondition fails to find a loop invariant condition. This is wrong and it will disable loop unswitch for select. The patch fixes the bug. Differential Revision: https://reviews.llvm.org/D36985 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
943b3d489c
commit
0488e47901
@ -705,10 +705,8 @@ bool LoopUnswitch::processCurrentLoop() {
|
||||
// unswitch on it if we desire.
|
||||
Value *LoopCond = FindLIVLoopCondition(BI->getCondition(),
|
||||
currentLoop, Changed).first;
|
||||
if (!LoopCond || EqualityPropUnSafe(*LoopCond))
|
||||
continue;
|
||||
|
||||
if (UnswitchIfProfitable(LoopCond, ConstantInt::getTrue(Context), TI)) {
|
||||
if (LoopCond && !EqualityPropUnSafe(*LoopCond) &&
|
||||
UnswitchIfProfitable(LoopCond, ConstantInt::getTrue(Context), TI)) {
|
||||
++NumBranches;
|
||||
return true;
|
||||
}
|
||||
|
26
test/Transforms/LoopUnswitch/unswitch-select.ll
Normal file
26
test/Transforms/LoopUnswitch/unswitch-select.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; REQUIRES: asserts
|
||||
; RUN: opt < %s -loop-unswitch -disable-output -stats 2>&1| FileCheck %s
|
||||
|
||||
; Check the select statement in the loop will be unswitched.
|
||||
; CHECK: 1 loop-unswitch - Number of selects unswitched
|
||||
define i32 @test(i1 zeroext %x, i32 %a) local_unnamed_addr #0 {
|
||||
entry:
|
||||
br label %while.cond
|
||||
|
||||
while.cond: ; preds = %while.body, %entry
|
||||
%i.0 = phi i32 [ 0, %entry ], [ %inc, %while.body ]
|
||||
%s.0 = phi i32 [ %a, %entry ], [ %add, %while.body ]
|
||||
%cmp = icmp slt i32 %i.0, 10000
|
||||
br i1 %cmp, label %while.body, label %while.end
|
||||
|
||||
while.body: ; preds = %while.cond
|
||||
%cond = select i1 %x, i32 %a, i32 %i.0
|
||||
%add = add nsw i32 %s.0, %cond
|
||||
%inc = add nsw i32 %i.0, 1
|
||||
br label %while.cond
|
||||
|
||||
while.end: ; preds = %while.cond
|
||||
%s.0.lcssa = phi i32 [ %s.0, %while.cond ]
|
||||
ret i32 %s.0.lcssa
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user