mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 18:24:38 +00:00
Revert r215343.
This was contentious and needs invesigation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218971 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -545,31 +545,7 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) {
|
|||||||
// cache needs updating, i.e. if we have solve a new value or not.
|
// cache needs updating, i.e. if we have solve a new value or not.
|
||||||
OverDefinedCacheUpdater ODCacheUpdater(Val, BB, BBLV, this);
|
OverDefinedCacheUpdater ODCacheUpdater(Val, BB, BBLV, this);
|
||||||
|
|
||||||
// Once this BB is encountered, Val's value for this BB will not be Undefined
|
if (!BBLV.isUndefined()) {
|
||||||
// any longer. When we encounter this BB again, if Val's value is Overdefined,
|
|
||||||
// we need to compute its value again.
|
|
||||||
//
|
|
||||||
// For example, considering this control flow,
|
|
||||||
// BB1->BB2, BB1->BB3, BB2->BB3, BB2->BB4
|
|
||||||
//
|
|
||||||
// Suppose we have "icmp slt %v, 0" in BB1, and "icmp sgt %v, 0" in BB3. At
|
|
||||||
// the very beginning, when analyzing edge BB2->BB3, we don't know %v's value
|
|
||||||
// in BB2, and the data flow algorithm tries to compute BB2's predecessors, so
|
|
||||||
// then we know %v has negative value on edge BB1->BB2. And then we return to
|
|
||||||
// check BB2 again, and at this moment BB2 has Overdefined value for %v in
|
|
||||||
// BB2. So we should have to follow data flow propagation algorithm to get the
|
|
||||||
// value on edge BB1->BB2 propagated to BB2, and finally %v on BB2 has a
|
|
||||||
// constant range describing a negative value.
|
|
||||||
//
|
|
||||||
// In the mean time, limit the number of additional lowering lattice value to
|
|
||||||
// avoid unjustified memory grows.
|
|
||||||
|
|
||||||
if (LoweringOverdefinedTimes.count(BB) == 0)
|
|
||||||
LoweringOverdefinedTimes.insert(std::make_pair(BB, 0));
|
|
||||||
if ((!BBLV.isUndefined() && !BBLV.isOverdefined()) ||
|
|
||||||
(BBLV.isOverdefined() &&
|
|
||||||
(LoweringOverdefinedTimes[BB] > OverdefinedThreshold ||
|
|
||||||
LoweringOverdefinedTimes.size() > OverdefinedBBThreshold))) {
|
|
||||||
DEBUG(dbgs() << " reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n');
|
DEBUG(dbgs() << " reuse BB '" << BB->getName() << "' val=" << BBLV <<'\n');
|
||||||
|
|
||||||
// Since we're reusing a cached value here, we don't need to update the
|
// Since we're reusing a cached value here, we don't need to update the
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
; RUN: opt < %s -jump-threading -S | FileCheck %s
|
|
||||||
|
|
||||||
define i32 @test_jump_threading(i32* %arg1, i32 %arg2) {
|
|
||||||
entry:
|
|
||||||
%cmp = icmp slt i32 %arg2, 0
|
|
||||||
br i1 %cmp, label %land.lhs.true, label %lor.rhs
|
|
||||||
|
|
||||||
land.lhs.true:
|
|
||||||
%ident = getelementptr inbounds i32 * %arg1, i64 0
|
|
||||||
%0 = load i32* %ident, align 4
|
|
||||||
%cmp1 = icmp eq i32 %0, 1
|
|
||||||
br i1 %cmp1, label %lor.end, label %lor.rhs
|
|
||||||
|
|
||||||
; CHECK: br i1 %cmp1, label %lor.end, label %lor.rhs.thread
|
|
||||||
|
|
||||||
; CHECK: lor.rhs.thread:
|
|
||||||
; CHECK-NEXT: br label %lor.end
|
|
||||||
|
|
||||||
lor.rhs:
|
|
||||||
%cmp2 = icmp sgt i32 %arg2, 0
|
|
||||||
br i1 %cmp2, label %land.rhs, label %lor.end
|
|
||||||
|
|
||||||
land.rhs:
|
|
||||||
%ident3 = getelementptr inbounds i32 * %arg1, i64 0
|
|
||||||
%1 = load i32* %ident3, align 4
|
|
||||||
%cmp4 = icmp eq i32 %1, 2
|
|
||||||
br label %lor.end
|
|
||||||
|
|
||||||
lor.end:
|
|
||||||
%2 = phi i1 [ true, %land.lhs.true ], [ false, %lor.rhs ], [ %cmp4, %land.rhs ]
|
|
||||||
%lor.ext = zext i1 %2 to i32
|
|
||||||
ret i32 %lor.ext
|
|
||||||
}
|
|
Reference in New Issue
Block a user