diff --git a/src/plugins/value/partitioning/partition.ml b/src/plugins/value/partitioning/partition.ml index fe65ccb612ebd7959501e935c6f8ede9cbe58063..a7138c912d6edcd7e3316299c63486fc1e5ee5aa 100644 --- a/src/plugins/value/partitioning/partition.ml +++ b/src/plugins/value/partitioning/partition.ml @@ -412,7 +412,8 @@ struct match AutoLoopUnroll.compute ~max_unroll x stmt with | None -> min_unroll | Some i -> - Value_parameters.warning ~once:true ~current:true + let source = fst (Cil_datatype.Stmt.loc stmt) in + Value_parameters.warning ~once:true ~current:true ~source ~wkey:Value_parameters.wkey_loop_unroll "Automatic loop unrolling."; i diff --git a/tests/value/auto_loop_unroll.c b/tests/value/auto_loop_unroll.c index ec9519bbcc7687d2e31c3fb28fd91a3d3f12b2b9..1d083a1c84154a7c112a4f25e84cdf468ac7bbbf 100644 --- a/tests/value/auto_loop_unroll.c +++ b/tests/value/auto_loop_unroll.c @@ -384,6 +384,34 @@ void non_natural_loops () { res = 0; } +/* Tests the automatic loop unrolling on loops that follow directly each other. */ +void following_loops () { + int i = 0, j = 0; + while (i < 15) { + i++; + j++; + } + while (i < 30) { + i++; + j++; + } + Frama_C_show_each_30(j); + i = 0; + j = 0; + while (i < 15 && undet) { + i++; + j++; + } + while (i < 30) { + i++; + j++; + } + /* The equality relation between [i] and [j] is lost between the two loops, + where all states exiting the first loop are joined. However, the unrolling + prevents the value of [j] to be completely imprecise. */ + Frama_C_show_each_30(j); +} + void main () { simple_loops (); various_loops (); @@ -392,4 +420,5 @@ void main () { temporary_variables (); loops_with_goto (); non_natural_loops (); + following_loops (); } diff --git a/tests/value/oracle/auto_loop_unroll.0.res.oracle b/tests/value/oracle/auto_loop_unroll.0.res.oracle index 9f0232a5ddc1ee3fc973ef51bfb5f87f506e4dc8..f34b2d3391c550082ac44d8e02e57b4b4b1e1dc7 100644 --- a/tests/value/oracle/auto_loop_unroll.0.res.oracle +++ b/tests/value/oracle/auto_loop_unroll.0.res.oracle @@ -6,7 +6,7 @@ undet ∈ [--..--] g ∈ {0} [eva] computing for function simple_loops <- main. - Called from tests/value/auto_loop_unroll.c:388. + Called from tests/value/auto_loop_unroll.c:416. [eva] tests/value/auto_loop_unroll.c:24: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:25: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -27,7 +27,7 @@ [eva] Recording results for simple_loops [eva] Done for function simple_loops [eva] computing for function various_loops <- main. - Called from tests/value/auto_loop_unroll.c:389. + Called from tests/value/auto_loop_unroll.c:417. [eva] tests/value/auto_loop_unroll.c:57: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:58: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -146,7 +146,7 @@ [eva] Recording results for various_loops [eva] Done for function various_loops [eva] computing for function complex_loops <- main. - Called from tests/value/auto_loop_unroll.c:390. + Called from tests/value/auto_loop_unroll.c:418. [eva] tests/value/auto_loop_unroll.c:152: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:154: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -205,7 +205,7 @@ [eva] Recording results for complex_loops [eva] Done for function complex_loops [eva] computing for function various_conditions <- main. - Called from tests/value/auto_loop_unroll.c:391. + Called from tests/value/auto_loop_unroll.c:419. [eva] tests/value/auto_loop_unroll.c:211: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:212: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -245,7 +245,7 @@ [eva] Recording results for various_conditions [eva] Done for function various_conditions [eva] computing for function temporary_variables <- main. - Called from tests/value/auto_loop_unroll.c:392. + Called from tests/value/auto_loop_unroll.c:420. [eva] tests/value/auto_loop_unroll.c:262: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:262: Warning: signed overflow. assert i + 1 ≤ 2147483647; @@ -279,7 +279,7 @@ [eva] Recording results for temporary_variables [eva] Done for function temporary_variables [eva] computing for function loops_with_goto <- main. - Called from tests/value/auto_loop_unroll.c:393. + Called from tests/value/auto_loop_unroll.c:421. [eva] tests/value/auto_loop_unroll.c:298: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:299: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -321,7 +321,7 @@ [eva] Recording results for loops_with_goto [eva] Done for function loops_with_goto [eva] computing for function non_natural_loops <- main. - Called from tests/value/auto_loop_unroll.c:394. + Called from tests/value/auto_loop_unroll.c:422. [eva:alarm] tests/value/auto_loop_unroll.c:371: Warning: signed overflow. assert res + 1 ≤ 2147483647; [eva] tests/value/auto_loop_unroll.c:375: Frama_C_show_each_50: [1..2147483647] @@ -333,9 +333,30 @@ Frama_C_show_each_1_51: [1..2147483647] [eva] Recording results for non_natural_loops [eva] Done for function non_natural_loops +[eva] computing for function following_loops <- main. + Called from tests/value/auto_loop_unroll.c:423. +[eva] tests/value/auto_loop_unroll.c:390: starting to merge loop iterations +[eva:alarm] tests/value/auto_loop_unroll.c:392: Warning: + signed overflow. assert j + 1 ≤ 2147483647; +[eva:alarm] tests/value/auto_loop_unroll.c:396: Warning: + signed overflow. assert j + 1 ≤ 2147483647; +[eva] tests/value/auto_loop_unroll.c:394: starting to merge loop iterations +[eva] tests/value/auto_loop_unroll.c:398: Frama_C_show_each_30: [0..2147483647] +[eva] tests/value/auto_loop_unroll.c:401: starting to merge loop iterations +[eva:alarm] tests/value/auto_loop_unroll.c:403: Warning: + signed overflow. assert j + 1 ≤ 2147483647; +[eva:alarm] tests/value/auto_loop_unroll.c:407: Warning: + signed overflow. assert j + 1 ≤ 2147483647; +[eva] tests/value/auto_loop_unroll.c:405: starting to merge loop iterations +[eva] tests/value/auto_loop_unroll.c:412: Frama_C_show_each_30: [0..2147483647] +[eva] Recording results for following_loops +[eva] Done for function following_loops [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== +[eva:final-states] Values at end of function following_loops: + i ∈ {30} + j ∈ [0..2147483647] [eva:final-states] Values at end of function incr: __retres ∈ [1..2147483647] [eva:final-states] Values at end of function incr_g: @@ -383,6 +404,8 @@ [eva:final-states] Values at end of function main: Frama_C_entropy_source ∈ [--..--] g ∈ {64} +[from] Computing for function following_loops +[from] Done for function following_loops [from] Computing for function incr [from] Done for function incr [from] Computing for function incr_g @@ -410,6 +433,8 @@ [from] Function Frama_C_interval: Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) \result FROM Frama_C_entropy_source; min; max +[from] Function following_loops: + NO EFFECTS [from] Function incr: \result FROM i [from] Function incr_g: @@ -433,6 +458,10 @@ Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) g FROM \nothing [from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function following_loops: + i; j +[inout] Inputs for function following_loops: + undet [inout] Out (internal) for function incr: __retres [inout] Inputs for function incr: diff --git a/tests/value/oracle/auto_loop_unroll.1.res.oracle b/tests/value/oracle/auto_loop_unroll.1.res.oracle index 315adc3135a575b6d642850d62faba61c083b84b..1826be4c45b15e28b686ca1477a15430deaba845 100644 --- a/tests/value/oracle/auto_loop_unroll.1.res.oracle +++ b/tests/value/oracle/auto_loop_unroll.1.res.oracle @@ -6,7 +6,7 @@ undet ∈ [--..--] g ∈ {0} [eva] computing for function simple_loops <- main. - Called from tests/value/auto_loop_unroll.c:388. + Called from tests/value/auto_loop_unroll.c:416. [eva:loop-unroll] tests/value/auto_loop_unroll.c:24: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:24: Trace partitioning superposing up to 100 states @@ -25,7 +25,7 @@ [eva] Recording results for simple_loops [eva] Done for function simple_loops [eva] computing for function various_loops <- main. - Called from tests/value/auto_loop_unroll.c:389. + Called from tests/value/auto_loop_unroll.c:417. [eva:loop-unroll] tests/value/auto_loop_unroll.c:57: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:59: Frama_C_show_each_64: {64} [eva:loop-unroll] tests/value/auto_loop_unroll.c:62: Automatic loop unrolling. @@ -287,7 +287,7 @@ [eva] Recording results for various_loops [eva] Done for function various_loops [eva] computing for function complex_loops <- main. - Called from tests/value/auto_loop_unroll.c:390. + Called from tests/value/auto_loop_unroll.c:418. [eva] tests/value/auto_loop_unroll.c:152: starting to merge loop iterations [eva:alarm] tests/value/auto_loop_unroll.c:154: Warning: signed overflow. assert res + 1 ≤ 2147483647; @@ -346,7 +346,7 @@ [eva] Recording results for complex_loops [eva] Done for function complex_loops [eva] computing for function various_conditions <- main. - Called from tests/value/auto_loop_unroll.c:391. + Called from tests/value/auto_loop_unroll.c:419. [eva:loop-unroll] tests/value/auto_loop_unroll.c:211: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:214: Frama_C_show_each_11: {11} [eva:loop-unroll] tests/value/auto_loop_unroll.c:216: Automatic loop unrolling. @@ -366,7 +366,7 @@ [eva] Recording results for various_conditions [eva] Done for function various_conditions [eva] computing for function temporary_variables <- main. - Called from tests/value/auto_loop_unroll.c:392. + Called from tests/value/auto_loop_unroll.c:420. [eva:loop-unroll] tests/value/auto_loop_unroll.c:262: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:265: Frama_C_show_each_20: {20} [eva:loop-unroll] tests/value/auto_loop_unroll.c:267: Automatic loop unrolling. @@ -384,7 +384,7 @@ [eva] Recording results for temporary_variables [eva] Done for function temporary_variables [eva] computing for function loops_with_goto <- main. - Called from tests/value/auto_loop_unroll.c:393. + Called from tests/value/auto_loop_unroll.c:421. [eva:loop-unroll] tests/value/auto_loop_unroll.c:298: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:303: Frama_C_show_each_30: {30} [eva:loop-unroll] tests/value/auto_loop_unroll.c:307: Automatic loop unrolling. @@ -417,16 +417,29 @@ [eva] Recording results for loops_with_goto [eva] Done for function loops_with_goto [eva] computing for function non_natural_loops <- main. - Called from tests/value/auto_loop_unroll.c:394. + Called from tests/value/auto_loop_unroll.c:422. [eva:loop-unroll] tests/value/auto_loop_unroll.c:370: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:375: Frama_C_show_each_50: {50} [eva:loop-unroll] tests/value/auto_loop_unroll.c:379: Automatic loop unrolling. [eva] tests/value/auto_loop_unroll.c:383: Frama_C_show_each_1_51: [1..51] [eva] Recording results for non_natural_loops [eva] Done for function non_natural_loops +[eva] computing for function following_loops <- main. + Called from tests/value/auto_loop_unroll.c:423. +[eva:loop-unroll] tests/value/auto_loop_unroll.c:390: Automatic loop unrolling. +[eva:loop-unroll] tests/value/auto_loop_unroll.c:394: Automatic loop unrolling. +[eva] tests/value/auto_loop_unroll.c:398: Frama_C_show_each_30: {30} +[eva:loop-unroll] tests/value/auto_loop_unroll.c:401: Automatic loop unrolling. +[eva:loop-unroll] tests/value/auto_loop_unroll.c:405: Automatic loop unrolling. +[eva] tests/value/auto_loop_unroll.c:412: Frama_C_show_each_30: [15..45] +[eva] Recording results for following_loops +[eva] Done for function following_loops [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== +[eva:final-states] Values at end of function following_loops: + i ∈ {30} + j ∈ [15..45] [eva:final-states] Values at end of function incr: __retres ∈ [1..25] [eva:final-states] Values at end of function incr_g: @@ -474,6 +487,8 @@ [eva:final-states] Values at end of function main: Frama_C_entropy_source ∈ [--..--] g ∈ {64} +[from] Computing for function following_loops +[from] Done for function following_loops [from] Computing for function incr [from] Done for function incr [from] Computing for function incr_g @@ -501,6 +516,8 @@ [from] Function Frama_C_interval: Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) \result FROM Frama_C_entropy_source; min; max +[from] Function following_loops: + NO EFFECTS [from] Function incr: \result FROM i [from] Function incr_g: @@ -524,6 +541,10 @@ Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) g FROM \nothing [from] ====== END OF DEPENDENCIES ====== +[inout] Out (internal) for function following_loops: + i; j +[inout] Inputs for function following_loops: + undet [inout] Out (internal) for function incr: __retres [inout] Inputs for function incr: