mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
[NaryReassociate] avoid running forever
Avoid running forever by checking we are not reassociating an expression into the same form. Tested with @avoid_infinite_loops in nary-add.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237269 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a036cd4093
commit
12b5fa5f6e
@ -217,10 +217,14 @@ Instruction *NaryReassociate::tryReassociateAdd(Value *LHS, Value *RHS,
|
||||
// = (A + RHS) + B or (B + RHS) + A
|
||||
const SCEV *AExpr = SE->getSCEV(A), *BExpr = SE->getSCEV(B);
|
||||
const SCEV *RHSExpr = SE->getSCEV(RHS);
|
||||
if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(AExpr, RHSExpr), B, I))
|
||||
return NewI;
|
||||
if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(BExpr, RHSExpr), A, I))
|
||||
return NewI;
|
||||
if (BExpr != RHSExpr) {
|
||||
if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(AExpr, RHSExpr), B, I))
|
||||
return NewI;
|
||||
}
|
||||
if (AExpr != RHSExpr) {
|
||||
if (auto *NewI = tryReassociatedAdd(SE->getAddExpr(BExpr, RHSExpr), A, I))
|
||||
return NewI;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -196,3 +196,14 @@ define void @iterative(i32 %a, i32 %b, i32 %c) {
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @avoid_infinite_loop(i32 %a, i32 %b) {
|
||||
; CHECK-LABEL: @avoid_infinite_loop
|
||||
%ab = add i32 %a, %b
|
||||
; CHECK-NEXT: %ab
|
||||
%ab2 = add i32 %ab, %b
|
||||
; CHECK-NEXT: %ab2
|
||||
call void @foo(i32 %ab2)
|
||||
; CHECK-NEXT: @foo(i32 %ab2)
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user