/export/starexec/sandbox2/solver/bin/starexec_run_c /export/starexec/sandbox2/benchmark/theBenchmark.c /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- YES proof of /export/starexec/sandbox2/benchmark/theBenchmark.c # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty Termination of the given C Problem could be proven: (0) C Problem (1) CToLLVMProof [EQUIVALENT, 180 ms] (2) LLVM problem (3) LLVMToTerminationGraphProof [EQUIVALENT, 2357 ms] (4) LLVM Symbolic Execution Graph (5) SymbolicExecutionGraphToSCCProof [SOUND, 0 ms] (6) LLVM Symbolic Execution SCC (7) SCC2IRS [SOUND, 145 ms] (8) IntTRS (9) IntTRSCompressionProof [EQUIVALENT, 0 ms] (10) IntTRS (11) PolynomialOrderProcessor [EQUIVALENT, 15 ms] (12) AND (13) IntTRS (14) TerminationGraphProcessor [EQUIVALENT, 0 ms] (15) YES (16) IntTRS (17) TerminationGraphProcessor [EQUIVALENT, 0 ms] (18) YES ---------------------------------------- (0) Obligation: c file /export/starexec/sandbox2/benchmark/theBenchmark.c ---------------------------------------- (1) CToLLVMProof (EQUIVALENT) Compiled c-file /export/starexec/sandbox2/benchmark/theBenchmark.c to LLVM. ---------------------------------------- (2) Obligation: LLVM Problem Aliases: Data layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Machine: "x86_64-pc-linux-gnu" Type definitions: Global variables: Function declarations and definitions: *BasicFunctionTypename: "__VERIFIER_nondet_int" returnParam: i32 parameters: () variableLength: true visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "f" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: (x i32) variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 %2 = alloca i32, align 4 store %x, %2 %3 = load %2 %4 = icmp sle %3 0 br %4, %5, %6 5: store 0, %1 br %13 6: %7 = load %2 %8 = call i32 (...)* @g(i32 %7) %9 = load %2 %10 = add %9 1 %11 = call i32 (...)* @g(i32 %10) %12 = add %8 %11 store %12, %1 br %13 13: %14 = load %1 ret %14 *BasicFunctionTypename: "g" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: (x i32) variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 %2 = alloca i32, align 4 store %x, %2 %3 = load %2 %4 = icmp sle %3 0 br %4, %5, %6 5: store 0, %1 br %14 6: %7 = load %2 %8 = sub %7 2 %9 = call i32 @f(i32 %8) %10 = load %2 %11 = sub %10 3 %12 = call i32 @f(i32 %11) %13 = add %9 %12 store %13, %1 br %14 14: %15 = load %1 ret %15 *BasicFunctionTypename: "main" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 %x = alloca i32, align 4 store 0, %1 %2 = call i32 (...)* @__VERIFIER_nondet_int() store %2, %x %3 = load %x %4 = call i32 @g(i32 %3) %5 = load %1 ret %5 Analyze Termination of all function calls matching the pattern: main() ---------------------------------------- (3) LLVMToTerminationGraphProof (EQUIVALENT) Constructed symbolic execution graph for LLVM program and proved memory safety. ---------------------------------------- (4) Obligation: SE Graph ---------------------------------------- (5) SymbolicExecutionGraphToSCCProof (SOUND) Splitted symbolic execution graph to 1 SCC. ---------------------------------------- (6) Obligation: SCC ---------------------------------------- (7) SCC2IRS (SOUND) Transformed LLVM symbolic execution graph SCC into a rewrite problem. Log: Generated rules. Obtained 74 rulesP rules: f_293(v177, v178, v179, 3, 1, 4) -> f_294(v177, v178, v180, v179, v181, 3, 1, 4) :|: 1 <= v180 && v181 = 3 + v180 && 4 <= v181 f_294(v177, v178, v180, v179, v181, 3, 1, 4) -> f_295(v177, v178, v180, v179, v181, 3, 1, 4) :|: TRUE f_295(v177, v178, v180, v179, v181, 3, 1, 4) -> f_296(v177, v178, v180, v179, v181, 3, 1, 4) :|: 0 = 0 f_296(v177, v178, v180, v179, v181, 3, 1, 4) -> f_298(v177, v178, v180, v179, v181, 3, 1, 4) :|: 0 < v177 f_298(v177, v178, v180, v179, v181, 3, 1, 4) -> f_300(v177, v178, v180, 0, v179, v181, 3, 1, 4) :|: 0 = 0 f_300(v177, v178, v180, 0, v179, v181, 3, 1, 4) -> f_302(v177, v178, v180, 0, v179, v181, 3, 1, 4) :|: TRUE f_302(v177, v178, v180, 0, v179, v181, 3, 1, 4) -> f_304(v177, v178, v180, 0, v179, v181, 3, 1, 4) :|: 0 = 0 f_304(v177, v178, v180, 0, v179, v181, 3, 1, 4) -> f_306(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 2 + v183 = v177 && 0 <= 1 + v183 f_306(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) :|: 0 = 0 f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_310(v183, v178, v179, v180, v181, v177, 3, 2, 1, 4, 0) :|: TRUE f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_377(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_484(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_497(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_530(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_308(v183, v178, v179, v180, v181, v177, 0, 3, 2, 1, 4) -> f_553(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_310(v183, v178, v179, v180, v181, v177, 3, 2, 1, 4, 0) -> f_336(v183, v178, v179, v180, v181, v177, 3, 2, 0, 1, 4) :|: TRUE f_336(v211, v212, v213, v214, v215, v216, 3, 2, 0, 1, 4) -> f_360(v211, 0, 2) :|: TRUE f_360(v239, 0, 2) -> f_361(v239, v240, v241, 3, 0, 2, 1, 4) :|: 1 <= v240 && v241 = 3 + v240 && 4 <= v241 f_361(v239, v240, v241, 3, 0, 2, 1, 4) -> f_362(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) :|: 1 <= v242 && v243 = 3 + v242 && 4 <= v243 f_362(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) -> f_363(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) :|: TRUE f_363(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) -> f_364(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) :|: 0 = 0 f_364(v239, v240, v242, v241, v243, 3, 0, 2, 1, 4) -> f_366(v239, v240, v242, v241, v243, 3, 1, 4) :|: 0 < v239 f_366(v239, v240, v242, v241, v243, 3, 1, 4) -> f_368(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_368(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_370(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: TRUE f_370(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_372(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_372(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) :|: 0 = 0 f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_376(v239, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_435(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_470(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_512(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_548(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_374(v239, v240, v241, v242, v243, 0, 3, 1, 4) -> f_567(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_376(v239, v240, v241, v242, v243, 3, 1, 4) -> f_291(v239) :|: TRUE f_291(v177) -> f_293(v177, v178, v179, 3, 1, 4) :|: 1 <= v178 && v179 = 3 + v178 && 4 <= v179 f_435(v239, 0, v240, v241, v242, v243, 3, 1, 4) -> f_437(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_437(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_439(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_439(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_440(v239, v240, v242, 0, v348, v241, v243, 3, 1, 4, 2) :|: v348 = 1 + v239 && 2 <= v348 f_440(v239, v240, v242, 0, v348, v241, v243, 3, 1, 4, 2) -> f_441(v348, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) :|: 0 = 0 f_441(v348, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) -> f_442(v348, v240, v241, v242, v243, v239, 3, 1, 4, 2) :|: TRUE f_442(v348, v240, v241, v242, v243, v239, 3, 1, 4, 2) -> f_291(v348) :|: TRUE f_470(v239, 0, v240, v241, v242, v243, 3, 1, 4) -> f_473(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_473(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_476(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_476(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_478(v239, v240, v242, 0, v424, v241, v243, 3, 1, 4, 2) :|: v424 = 1 + v239 && 2 <= v424 f_478(v239, v240, v242, 0, v424, v241, v243, 3, 1, 4, 2) -> f_480(v424, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) :|: 0 = 0 f_480(v424, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) -> f_482(v424, v240, v241, v242, v243, v239, 3, 1, 4, 2) :|: TRUE f_482(v424, v240, v241, v242, v243, v239, 3, 1, 4, 2) -> f_291(v424) :|: TRUE f_512(v239, 0, v240, v241, v242, v243, 3, 1, 4) -> f_516(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_516(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_520(v239, v240, v242, 0, v241, v243, 3, 1, 4) :|: 0 = 0 f_520(v239, v240, v242, 0, v241, v243, 3, 1, 4) -> f_523(v239, v240, v242, 0, v520, v241, v243, 3, 1, 4, 2) :|: v520 = 1 + v239 && 2 <= v520 f_523(v239, v240, v242, 0, v520, v241, v243, 3, 1, 4, 2) -> f_526(v520, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) :|: 0 = 0 f_526(v520, v240, v241, v242, v243, v239, 0, 3, 1, 4, 2) -> f_529(v520, v240, v241, v242, v243, v239, 3, 1, 4, 2) :|: TRUE f_529(v520, v240, v241, v242, v243, v239, 3, 1, 4, 2) -> f_291(v520) :|: TRUE f_548(v239, 0, v240, v241, v242, v243, 3, 1, 4) -> f_512(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_567(v239, 0, v240, v241, v242, v243, 3, 1, 4) -> f_548(v239, 0, v240, v241, v242, v243, 3, 1, 4) :|: TRUE f_377(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) -> f_378(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_378(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_380(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_380(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_381(v177, v178, v180, 0, v183, v256, v179, v181, 3, 2, 1, 4) :|: 3 + v256 = v177 && 0 <= 2 + v256 && 1 + v256 <= 0 f_381(v177, v178, v180, 0, v183, v256, v179, v181, 3, 2, 1, 4) -> f_382(v256, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) :|: 0 = 0 f_382(v256, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) -> f_383(v256, v178, v179, v180, v181, v177, 3, 1, 2, 4, 0) :|: TRUE f_383(v256, v178, v179, v180, v181, v177, 3, 1, 2, 4, 0) -> f_360(v256, 0, 2) :|: TRUE f_484(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) -> f_488(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_488(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_490(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_490(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_492(v177, v178, v180, 0, v183, v450, v179, v181, 3, 2, 1, 4) :|: 3 + v450 = v177 && 0 <= v450 f_492(v177, v178, v180, 0, v183, v450, v179, v181, 3, 2, 1, 4) -> f_494(v450, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) :|: 0 = 0 f_494(v450, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) -> f_496(v450, v178, v179, v180, v181, v177, 3, 1, 4, 0) :|: TRUE f_496(v450, v178, v179, v180, v181, v177, 3, 1, 4, 0) -> f_360(v450, 0, 2) :|: TRUE f_497(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) -> f_484(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE f_530(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) -> f_533(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_533(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_537(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) :|: 0 = 0 f_537(v177, v178, v180, 0, v183, v179, v181, 3, 2, 1, 4) -> f_540(v177, v178, v180, 0, v183, v566, v179, v181, 3, 2, 1, 4) :|: 3 + v566 = v177 && 0 <= v566 f_540(v177, v178, v180, 0, v183, v566, v179, v181, 3, 2, 1, 4) -> f_543(v566, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) :|: 0 = 0 f_543(v566, v178, v179, v180, v181, v177, 0, v183, 3, 2, 1, 4) -> f_546(v566, v178, v179, v180, v181, v177, 3, 1, 4, 0) :|: TRUE f_546(v566, v178, v179, v180, v181, v177, 3, 1, 4, 0) -> f_360(v566, 0, 2) :|: TRUE f_553(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) -> f_530(v183, 0, v178, v179, v180, v181, v177, 3, 2, 1, 4) :|: TRUE Combined rules. Obtained 4 rulesP rules: f_374(v239:0, v240:0, v241:0, v242:0, v243:0, 0, 3, 1, 4) -> f_293(1 + v239:0, v178:0, 3 + v178:0, 3, 1, 4) :|: v239:0 > 0 && v178:0 > 0 f_293(3 + v450:0, v178:0, v179:0, 3, 1, 4) -> f_374(v450:0, v240:0, 3 + v240:0, v242:0, 3 + v242:0, 0, 3, 1, 4) :|: v450:0 > 0 && v180:0 > 0 && v240:0 > 0 && v242:0 > 0 && 3 + v450:0 = 2 + v183:0 && v183:0 > -2 f_374(v239:0, v240:0, v241:0, v242:0, v243:0, 0, 3, 1, 4) -> f_293(v239:0, v178:0, 3 + v178:0, 3, 1, 4) :|: v178:0 > 0 f_293(2 + v183:0, v178:0, v179:0, 3, 1, 4) -> f_374(v183:0, v240:0, 3 + v240:0, v242:0, 3 + v242:0, 0, 3, 1, 4) :|: v183:0 > 0 && v180:0 > 0 && v240:0 > 0 && v242:0 > 0 Filtered unneeded arguments: f_374(x1, x2, x3, x4, x5, x6, x7, x8, x9) -> f_374(x1) f_293(x1, x2, x3, x4, x5, x6) -> f_293(x1) Removed division, modulo operations, cleaned up constraints. Obtained 4 rules.P rules: f_374(v239:0) -> f_293(1 + v239:0) :|: v239:0 > 0 f_293(sum~cons_3~v450:0) -> f_374(v450:0) :|: v450:0 > 0 && sum~cons_3~v450:0 = 3 + v450:0 f_374(v239:0) -> f_293(v239:0) :|: TRUE f_293(sum~cons_2~v183:0) -> f_374(v183:0) :|: v183:0 > 0 && sum~cons_2~v183:0 = 2 + v183:0 ---------------------------------------- (8) Obligation: Rules: f_374(v239:0) -> f_293(1 + v239:0) :|: v239:0 > 0 f_293(sum~cons_3~v450:0) -> f_374(v450:0) :|: v450:0 > 0 && sum~cons_3~v450:0 = 3 + v450:0 f_374(x) -> f_293(x) :|: TRUE f_293(sum~cons_2~v183:0) -> f_374(v183:0) :|: v183:0 > 0 && sum~cons_2~v183:0 = 2 + v183:0 ---------------------------------------- (9) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (10) Obligation: Rules: f_293(sum~cons_2~v183:0:0) -> f_374(v183:0:0) :|: v183:0:0 > 0 && sum~cons_2~v183:0:0 = 2 + v183:0:0 f_374(x:0) -> f_293(x:0) :|: TRUE f_374(v239:0:0) -> f_293(1 + v239:0:0) :|: v239:0:0 > 0 f_293(sum~cons_3~v450:0:0) -> f_374(v450:0:0) :|: v450:0:0 > 0 && sum~cons_3~v450:0:0 = 3 + v450:0:0 ---------------------------------------- (11) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f_293(x)] = -2 + x [f_374(x1)] = -1 + x1 The following rules are decreasing: f_293(sum~cons_2~v183:0:0) -> f_374(v183:0:0) :|: v183:0:0 > 0 && sum~cons_2~v183:0:0 = 2 + v183:0:0 f_374(x:0) -> f_293(x:0) :|: TRUE f_293(sum~cons_3~v450:0:0) -> f_374(v450:0:0) :|: v450:0:0 > 0 && sum~cons_3~v450:0:0 = 3 + v450:0:0 The following rules are bounded: f_293(sum~cons_2~v183:0:0) -> f_374(v183:0:0) :|: v183:0:0 > 0 && sum~cons_2~v183:0:0 = 2 + v183:0:0 f_374(v239:0:0) -> f_293(1 + v239:0:0) :|: v239:0:0 > 0 f_293(sum~cons_3~v450:0:0) -> f_374(v450:0:0) :|: v450:0:0 > 0 && sum~cons_3~v450:0:0 = 3 + v450:0:0 ---------------------------------------- (12) Complex Obligation (AND) ---------------------------------------- (13) Obligation: Rules: f_374(v239:0:0) -> f_293(1 + v239:0:0) :|: v239:0:0 > 0 ---------------------------------------- (14) TerminationGraphProcessor (EQUIVALENT) Constructed the termination graph and obtained no non-trivial SCC(s). ---------------------------------------- (15) YES ---------------------------------------- (16) Obligation: Rules: f_374(x:0) -> f_293(x:0) :|: TRUE ---------------------------------------- (17) TerminationGraphProcessor (EQUIVALENT) Constructed the termination graph and obtained no non-trivial SCC(s). ---------------------------------------- (18) YES