mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
utils: Fix segfault in flattencfg
v2: continue iterating through the rest of the bb use for loop v3: initialize FlattenCFG pass in ScalarOps add test v4: split off initializing flattencfg to a separate patch add comment Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu> llvm-svn: 215574
This commit is contained in:
parent
4ea706ef68
commit
c5cea652e3
@ -238,9 +238,13 @@ bool FlattenCFGOpt::FlattenParallelAndOr(BasicBlock *BB, IRBuilder<> &Builder,
|
||||
// Do branch inversion.
|
||||
BasicBlock *CurrBlock = LastCondBlock;
|
||||
bool EverChanged = false;
|
||||
while (1) {
|
||||
for (;CurrBlock != FirstCondBlock;
|
||||
CurrBlock = CurrBlock->getSinglePredecessor()) {
|
||||
BranchInst *BI = dyn_cast<BranchInst>(CurrBlock->getTerminator());
|
||||
CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition());
|
||||
if (!CI)
|
||||
continue;
|
||||
|
||||
CmpInst::Predicate Predicate = CI->getPredicate();
|
||||
// Canonicalize icmp_ne -> icmp_eq, fcmp_one -> fcmp_oeq
|
||||
if ((Predicate == CmpInst::ICMP_NE) || (Predicate == CmpInst::FCMP_ONE)) {
|
||||
@ -248,9 +252,6 @@ bool FlattenCFGOpt::FlattenParallelAndOr(BasicBlock *BB, IRBuilder<> &Builder,
|
||||
BI->swapSuccessors();
|
||||
EverChanged = true;
|
||||
}
|
||||
if (CurrBlock == FirstCondBlock)
|
||||
break;
|
||||
CurrBlock = CurrBlock->getSinglePredecessor();
|
||||
}
|
||||
return EverChanged;
|
||||
}
|
||||
|
26
test/Transforms/Util/flattencfg.ll
Normal file
26
test/Transforms/Util/flattencfg.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: opt -flattencfg -S < %s | FileCheck %s
|
||||
|
||||
|
||||
; This test checks whether the pass completes without a crash.
|
||||
; The code is not transformed in any way
|
||||
;
|
||||
; CHECK-LABEL: @test_not_crash
|
||||
define void @test_not_crash(i32 %in_a) #0 {
|
||||
entry:
|
||||
%cmp0 = icmp eq i32 %in_a, -1
|
||||
%cmp1 = icmp ne i32 %in_a, 0
|
||||
%cond0 = and i1 %cmp0, %cmp1
|
||||
br i1 %cond0, label %b0, label %b1
|
||||
|
||||
b0: ; preds = %entry
|
||||
%cmp2 = icmp eq i32 %in_a, 0
|
||||
%cmp3 = icmp ne i32 %in_a, 1
|
||||
%cond1 = or i1 %cmp2, %cmp3
|
||||
br i1 %cond1, label %exit, label %b1
|
||||
|
||||
b1: ; preds = %entry, %b0
|
||||
br label %exit
|
||||
|
||||
exit: ; preds = %entry, %b0, %b1
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user