[PATCH] D69686: [LVI][CVP] Use block value in getPredicateAt()
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 8 13:02:32 PST 2019
nikic marked an inline comment as done.
nikic added inline comments.
================
Comment at: llvm/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll:25
+; CHECK-NEXT: ; LatticeVal for: ' %iv.next = add nsw i32 %iv, 1' in BB: '%backedge' is: constantrange<1, -2147483648>
+; CHECK-NEXT: ; LatticeVal for: ' %iv.next = add nsw i32 %iv, 1' in BB: '%exit' is: constantrange<400, -2147483648>
; CHECK-NEXT: %iv.next = add nsw i32 %iv, 1
----------------
There are two issues here. The first is that JumpThreading marks LVI as preserved, but only seems to preserve it in the sense that the result isn't incorrect -- but not necessarily the same as rerunning from scratch.
The second is that we now end up computing block values in a different order, and this has an impact on the results. Here is the debug output of running JumpThreading on this function:
Before this patch:
```
LVI Getting value %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] at ''
Result = overdefined
LVI Getting edge value i32 0 from 'entry' to 'loop'
Result = constantrange<0, 1>
LVI Getting edge value %iv.next = add nsw i32 %iv, 1 from 'backedge' to 'loop'
PUSH: %iv.next = add nsw i32 %iv, 1 in backedge
PUSH: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in backedge
PUSH: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in loop
POP %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in loop = constantrange<-2147483648, 400>
POP %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in backedge = constantrange<0, 400>
POP %iv.next = add nsw i32 %iv, 1 in backedge = constantrange<1, 401>
Result = constantrange<1, 400>
LVI Getting value %iv.next = add nsw i32 %iv, 1 at ''
Result = overdefined
LVI Getting value %iv.next = add nsw i32 %iv, 1 at ''
Result = overdefined
```
After this patch:
```
LVI Getting block end value %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] at 'loop'
PUSH: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in loop
PUSH: %iv.next = add nsw i32 %iv, 1 in backedge
PUSH: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in backedge
POP %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in backedge = constantrange<0, -2147483648>
POP %iv.next = add nsw i32 %iv, 1 in backedge = constantrange<1, -2147483648>
POP %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] in loop = constantrange<0, 400>
Result = constantrange<0, 400>
LVI Getting block end value %iv.next = add nsw i32 %iv, 1 at 'backedge'
Result = constantrange<1, -2147483648>
LVI Getting block end value %iv.next = add nsw i32 %iv, 1 at 'backedge'
Result = constantrange<1, -2147483648>
```
Previously we ended up computing `%iv` in loop first, then `%iv` in backedge, then `%iv.next` in backedge. Now we compute `%iv` in backedge first, then `%iv.next` in backedge`, then `%iv` in loop. This eventually results in different results being calculated.
This seems pretty concerning regarding the general design of LVI, and I'm not really sure what I should do about this.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D69686/new/
https://reviews.llvm.org/D69686
More information about the llvm-commits
mailing list