mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[ValueLattice] Merging unknown with empty CR is unknown.
Currently an unknown/undef value is marked as overdefined when merged with an empty range. An empty range can occur in unreachable/dead code. When merging the new unknown state (= no value known yet) with an empty range, there still isn't any information about the value yet and we can stay in unknown. This gives a few nice improvements on the number of instructions removed by IPSCCP: Same hash: 170 (filtered out) Remaining: 67 Metric: sccp.IPNumInstRemoved Program base patch diff test-suite...rks/FreeBench/mason/mason.test 3.00 6.00 100.0% test-suite...nchmarks/McCat/18-imp/imp.test 3.00 5.00 66.7% test-suite...C/CFP2000/179.art/179.art.test 2.00 3.00 50.0% test-suite...ijndael/security-rijndael.test 2.00 3.00 50.0% test-suite...ks/Prolangs-C/agrep/agrep.test 40.00 58.00 45.0% test-suite...ce/Applications/Burg/burg.test 26.00 37.00 42.3% test-suite...cCat/03-testtrie/testtrie.test 3.00 4.00 33.3% test-suite...Source/Benchmarks/sim/sim.test 29.00 36.00 24.1% test-suite.../Applications/spiff/spiff.test 9.00 11.00 22.2% test-suite...s/FreeBench/neural/neural.test 5.00 6.00 20.0% test-suite...pplications/treecc/treecc.test 66.00 79.00 19.7% test-suite...langs-C/football/football.test 85.00 101.00 18.8% test-suite...ce/Benchmarks/PAQ8p/paq8p.test 90.00 105.00 16.7% test-suite...oxyApps-C++/miniFE/miniFE.test 37.00 43.00 16.2% test-suite...rks/FreeBench/pifft/pifft.test 26.00 30.00 15.4% test-suite...lications/sqlite3/sqlite3.test 481.00 548.00 13.9% test-suite...marks/7zip/7zip-benchmark.test 4875.00 5522.00 13.3% test-suite.../CINT2000/176.gcc/176.gcc.test 1117.00 1197.00 7.2% test-suite...0.perlbench/400.perlbench.test 1618.00 1732.00 7.0% Reviewers: efriedma, nikic, davide Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D78667
This commit is contained in:
parent
ecb37ccd0f
commit
e1350c726b
@ -202,6 +202,13 @@ public:
|
||||
if (CR.isFullSet())
|
||||
return getOverdefined();
|
||||
|
||||
if (CR.isEmptySet()) {
|
||||
ValueLatticeElement Res;
|
||||
if (MayIncludeUndef)
|
||||
Res.markUndef();
|
||||
return Res;
|
||||
}
|
||||
|
||||
ValueLatticeElement Res;
|
||||
Res.markConstantRange(std::move(CR),
|
||||
MergeOptions().setMayIncludeUndef(MayIncludeUndef));
|
||||
@ -325,6 +332,8 @@ public:
|
||||
/// range may include undef.
|
||||
bool markConstantRange(ConstantRange NewR,
|
||||
MergeOptions Opts = MergeOptions()) {
|
||||
assert(!NewR.isEmptySet() && "should only be called for non-empty sets");
|
||||
|
||||
if (NewR.isFullSet())
|
||||
return markOverdefined();
|
||||
|
||||
@ -334,9 +343,6 @@ public:
|
||||
? constantrange_including_undef
|
||||
: constantrange;
|
||||
if (isConstantRange()) {
|
||||
if (NewR.isEmptySet())
|
||||
return markOverdefined();
|
||||
|
||||
Tag = NewTag;
|
||||
if (getConstantRange() == NewR)
|
||||
return Tag != OldTag;
|
||||
@ -353,8 +359,6 @@ public:
|
||||
}
|
||||
|
||||
assert(isUnknown() || isUndef());
|
||||
if (NewR.isEmptySet())
|
||||
return markOverdefined();
|
||||
|
||||
NumRangeExtensions = 0;
|
||||
Tag = NewTag;
|
||||
|
@ -122,9 +122,8 @@ static ValueLatticeElement intersect(const ValueLatticeElement &A,
|
||||
// Intersect two constant ranges
|
||||
ConstantRange Range =
|
||||
A.getConstantRange().intersectWith(B.getConstantRange());
|
||||
// Note: An empty range is implicitly converted to overdefined internally.
|
||||
// TODO: We could instead use Undefined here since we've proven a conflict
|
||||
// and thus know this path must be unreachable.
|
||||
// Note: An empty range is implicitly converted to unknown or undef depending
|
||||
// on MayIncludeUndef internally.
|
||||
return ValueLatticeElement::getRange(
|
||||
std::move(Range), /*MayIncludeUndef=*/A.isConstantRangeIncludingUndef() |
|
||||
B.isConstantRangeIncludingUndef());
|
||||
|
@ -53,7 +53,7 @@ define void @test2(i32 %a) {
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], -1
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
|
||||
; CHECK: bb:
|
||||
; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1
|
||||
; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
|
||||
; CHECK-NEXT: br label [[EXIT]]
|
||||
; CHECK: exit:
|
||||
; CHECK-NEXT: ret void
|
||||
|
@ -744,11 +744,10 @@ define i8* @wobble(%struct.blam.2* %arg, i32 %arg1) align 2 {
|
||||
; IPSCCP-NEXT: [[C_2:%.*]] = icmp eq i32 [[TMP11]], 8
|
||||
; IPSCCP-NEXT: br i1 [[C_2]], label [[BB39:%.*]], label [[BB58:%.*]]
|
||||
; IPSCCP: bb39:
|
||||
; IPSCCP-NEXT: [[TMP40:%.*]] = add nsw i32 [[TMP11]], -1
|
||||
; IPSCCP-NEXT: [[TMP41:%.*]] = trunc i32 [[TMP3]] to i16
|
||||
; IPSCCP-NEXT: store i16 [[TMP41]], i16* bitcast ([4 x i8]* @global.11 to i16*), align 1
|
||||
; IPSCCP-NEXT: [[TMP42:%.*]] = getelementptr inbounds [[STRUCT_BLAM_2]], %struct.blam.2* [[ARG]], i32 0, i32 0
|
||||
; IPSCCP-NEXT: [[TMP43:%.*]] = add i32 [[TMP7]], [[TMP40]]
|
||||
; IPSCCP-NEXT: [[TMP43:%.*]] = add i32 [[TMP7]], 7
|
||||
; IPSCCP-NEXT: [[TMP44:%.*]] = mul i32 [[TMP43]], 4
|
||||
; IPSCCP-NEXT: [[TMP45:%.*]] = add i32 [[TMP44]], 2
|
||||
; IPSCCP-NEXT: [[TMP46:%.*]] = call dereferenceable(1) i8* @spam(%struct.baz.1* [[TMP42]], i32 [[TMP45]])
|
||||
@ -763,14 +762,13 @@ define i8* @wobble(%struct.blam.2* %arg, i32 %arg1) align 2 {
|
||||
; IPSCCP-NEXT: [[TMP55:%.*]] = icmp sgt i32 [[TMP48]], [[TMP54]]
|
||||
; IPSCCP-NEXT: br i1 [[TMP55]], label [[BB56:%.*]], label [[BB60:%.*]]
|
||||
; IPSCCP: bb56:
|
||||
; IPSCCP-NEXT: [[TMP57:%.*]] = add nsw i32 [[TMP40]], -1
|
||||
; IPSCCP-NEXT: br label [[BB60]]
|
||||
; IPSCCP: bb58:
|
||||
; IPSCCP-NEXT: [[TMP59:%.*]] = bitcast i16* [[TMP33]] to i8*
|
||||
; IPSCCP-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 getelementptr inbounds ([4 x i8], [4 x i8]* @global.11, i64 0, i64 0), i8* align 2 [[TMP59]], i64 4, i1 false)
|
||||
; IPSCCP-NEXT: br label [[BB60]]
|
||||
; IPSCCP: bb60:
|
||||
; IPSCCP-NEXT: [[TMP61:%.*]] = phi i32 [ [[TMP57]], [[BB56]] ], [ [[TMP40]], [[BB39]] ], [ [[TMP11]], [[BB58]] ]
|
||||
; IPSCCP-NEXT: [[TMP61:%.*]] = phi i32 [ 6, [[BB56]] ], [ 7, [[BB39]] ], [ [[TMP11]], [[BB58]] ]
|
||||
; IPSCCP-NEXT: [[TMP62:%.*]] = getelementptr inbounds [[STRUCT_BLAM_2]], %struct.blam.2* [[ARG]], i32 0, i32 0
|
||||
; IPSCCP-NEXT: [[TMP63:%.*]] = add i32 [[TMP7]], 1
|
||||
; IPSCCP-NEXT: [[TMP64:%.*]] = mul i32 [[TMP63]], 4
|
||||
|
Loading…
Reference in New Issue
Block a user