YES proof of /export/starexec/sandbox/benchmark/theBenchmark.c # AProVE Commit ID: 794c25de1cacf0d048858bcd21c9a779e1221865 marcel 20200619 unpublished dirty Termination of the given C Problem could be proven: (0) C Problem (1) CToLLVMProof [EQUIVALENT, 174 ms] (2) LLVM problem (3) LLVMToTerminationGraphProof [EQUIVALENT, 687 ms] (4) LLVM Symbolic Execution Graph (5) SymbolicExecutionGraphToSCCProof [SOUND, 0 ms] (6) LLVM Symbolic Execution SCC (7) SCC2IRS [SOUND, 110 ms] (8) IntTRS (9) IntTRSCompressionProof [EQUIVALENT, 0 ms] (10) IntTRS (11) RankingReductionPairProof [EQUIVALENT, 34 ms] (12) IntTRS (13) IntTRSCompressionProof [EQUIVALENT, 0 ms] (14) IntTRS (15) IntTRSUnneededArgumentFilterProof [EQUIVALENT, 0 ms] (16) IntTRS (17) PolynomialOrderProcessor [EQUIVALENT, 3 ms] (18) YES ---------------------------------------- (0) Obligation: c file /export/starexec/sandbox/benchmark/theBenchmark.c ---------------------------------------- (1) CToLLVMProof (EQUIVALENT) Compiled c-file /export/starexec/sandbox/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: Name: x initVal: 0 type: i32 addrSpace: null alignment: 4 threadLocal: false constant: false linkageType: COMMON section: null Function declarations and definitions: *BasicFunctionTypename: "__VERIFIER_nondet_int" returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "foo" linkageType: EXTERNALLY_VISIBLE returnParam: BasicVoidType parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = load @x %2 = add %1 -1 store %2, @x ret void *BasicFunctionTypename: "main" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 store 0, %1 %2 = call i32 @__VERIFIER_nondet_int() store %2, @x br %3 3: %4 = load @x %5 = icmp sgt %4 0 br %5, %6, %12 6: %7 = call i32 @__VERIFIER_nondet_int() %8 = icmp ne %7 0 br %8, %9, %10 9: Unnamed Call-Instruction = call BasicVoidType @foo() br %11 10: Unnamed Call-Instruction = call BasicVoidType @foo() br %11 11: br %3 12: ret 0 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 40 rulesP rules: f_177(v106, v109, v112, v107, v113, 0, v108, 1, 3, 4) -> f_179(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) :|: 1 + v116 = v109 && 0 <= v116 f_179(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) -> f_181(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) :|: TRUE f_181(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) -> f_183(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_183(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_185(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_185(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_188(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_188(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_190(v106, v107, v108, v116, 1, 0, v112, v113, 3, 4) :|: 0 = 0 f_190(v106, v107, v108, v116, 1, 0, v112, v113, 3, 4) -> f_193(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 < v116 && 2 <= v108 f_193(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_197(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 = 0 f_197(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_201(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE f_201(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) :|: TRUE f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_207(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) :|: v146 != 0 f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_208(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: v146 = 0 f_207(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_211(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: 0 = 0 f_211(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) -> f_215(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: TRUE f_215(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) -> f_213(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: TRUE f_213(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_217(v121, v127, v122, v128, v129, 0, v123, 1, v145, 3, 2, 4) :|: TRUE f_217(v121, v127, v122, v128, v129, 0, v123, 1, v145, 3, 2, 4) -> f_219(v121, v129, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: 0 = 0 f_219(v121, v129, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_220(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: 1 + v174 = v129 && 0 <= v174 f_220(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_221(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: TRUE f_221(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_222(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_222(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_223(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_223(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_224(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_224(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_187(v121, v122, v123, v129, 1, v145, v127, v128, v174, 0, 3, 4) :|: TRUE f_187(v121, v122, v123, v124, 1, v126, v127, v128, v129, 0, 3, 4) -> f_189(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 4) :|: 0 = 0 f_189(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 4) -> f_191(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: 0 < v129 && 2 <= v123 f_191(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_195(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: 0 = 0 f_195(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_199(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: TRUE f_199(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: TRUE f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_205(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: v145 != 0 f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_206(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: v145 = 0 f_205(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_209(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: 0 = 0 f_209(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_213(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: TRUE f_206(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_210(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: 0 = 0 f_210(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_214(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: TRUE f_214(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_218(v121, v127, v122, v128, v129, 0, v123, 1, 3, 2, 4) :|: TRUE f_218(v121, v127, v122, v128, v129, 0, v123, 1, 3, 2, 4) -> f_175(v121, v127, v122, v128, v129, 0, v108, 1, 3, 4) :|: TRUE f_175(v106, v112, v107, v113, v109, 0, v108, 1, 3, 4) -> f_177(v106, v109, v112, v107, v113, 0, v108, 1, 3, 4) :|: 0 = 0 f_208(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_212(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 = 0 f_212(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_216(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE f_216(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_214(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE Combined rules. Obtained 6 rulesP rules: f_203(v121:0, v122:0, v123:0, 1 + v174:0, 1, v145:0, v127:0, v128:0, 0, 3, 2, 4) -> f_203(v121:0, v122:0, v123:0, v174:0, 1, v145:1, v127:0, v128:0, 0, 3, 2, 4) :|: v174:0 > 0 && v145:0 < 0 && v123:0 > 1 f_203(v121:0, v122:0, v123:0, 1 + v174:0, 1, v145:0, v127:0, v128:0, 0, 3, 2, 4) -> f_203(v121:0, v122:0, v123:0, v174:0, 1, v145:1, v127:0, v128:0, 0, 3, 2, 4) :|: v174:0 > 0 && v145:0 > 0 && v123:0 > 1 f_177(v106:0, 1 + v116:0, v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_177(v106:0, v116:0, v112:0, v107:0, v113:0, 0, v108:1, 1, 3, 4) :|: v108:0 > 1 && v116:0 > 0 f_177(v106:0, 1 + (1 + v174:0), v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_203(v106:0, v107:0, v108:0, v174:0, 1, v145:0, v112:0, v113:0, 0, 3, 2, 4) :|: v174:0 > 0 && v108:0 > 1 && v146:0 < 0 f_177(v106:0, 1 + (1 + v174:0), v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_203(v106:0, v107:0, v108:0, v174:0, 1, v145:0, v112:0, v113:0, 0, 3, 2, 4) :|: v174:0 > 0 && v108:0 > 1 && v146:0 > 0 f_203(v121:0, v122:0, v123:0, v129:0, 1, 0, v127:0, v128:0, 0, 3, 2, 4) -> f_177(v121:0, v129:0, v127:0, v122:0, v128:0, 0, v108:0, 1, 3, 4) :|: TRUE Filtered unneeded arguments: f_203(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f_203(x3, x4, x6) f_177(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) -> f_177(x2, x7) Removed division, modulo operations, cleaned up constraints. Obtained 5 rules.P rules: f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 < 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 > 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_177(sum~cons_1~v116:0, v108:0) -> f_177(v116:0, v108:1) :|: v108:0 > 1 && v116:0 > 0 && sum~cons_1~v116:0 = 1 + v116:0 f_177(sum~cons_1~sum~cons_1~v174:0, v108:0) -> f_203(v108:0, v174:0, v145:0) :|: v174:0 > 0 && v108:0 > 1 && sum~cons_1~sum~cons_1~v174:0 = 1 + (1 + v174:0) f_203(v123:0, v129:0, cons_0) -> f_177(v129:0, v108:0) :|: TRUE && cons_0 = 0 ---------------------------------------- (8) Obligation: Rules: f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 < 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_203(x, x1, x2) -> f_203(x, x3, x4) :|: x2 > 0 && x > 1 && x3 > 0 && x1 = 1 + x3 f_177(sum~cons_1~v116:0, v108:0) -> f_177(v116:0, v108:1) :|: v108:0 > 1 && v116:0 > 0 && sum~cons_1~v116:0 = 1 + v116:0 f_177(x5, x6) -> f_203(x6, x7, x8) :|: x7 > 0 && x6 > 1 && x5 = 1 + (1 + x7) f_203(x9, x10, x11) -> f_177(x10, x12) :|: TRUE && x11 = 0 ---------------------------------------- (9) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (10) Obligation: Rules: f_203(x9:0, x10:0, cons_0) -> f_177(x10:0, x12:0) :|: TRUE && cons_0 = 0 f_203(v123:0:0, sum~cons_1~v174:0:0, v145:0:0) -> f_203(v123:0:0, v174:0:0, v145:1:0) :|: v145:0:0 < 0 && v123:0:0 > 1 && v174:0:0 > 0 && sum~cons_1~v174:0:0 = 1 + v174:0:0 f_203(x:0, sum~cons_1~x3:0, x2:0) -> f_203(x:0, x3:0, x4:0) :|: x2:0 > 0 && x:0 > 1 && x3:0 > 0 && sum~cons_1~x3:0 = 1 + x3:0 f_177(sum~cons_1~v116:0:0, v108:0:0) -> f_177(v116:0:0, v108:1:0) :|: v108:0:0 > 1 && v116:0:0 > 0 && sum~cons_1~v116:0:0 = 1 + v116:0:0 f_177(sum~cons_1~sum~cons_1~x7:0, x6:0) -> f_203(x6:0, x7:0, x8:0) :|: x7:0 > 0 && x6:0 > 1 && sum~cons_1~sum~cons_1~x7:0 = 1 + (1 + x7:0) ---------------------------------------- (11) RankingReductionPairProof (EQUIVALENT) Interpretation: [ f_203 ] = 2*f_203_2 [ f_177 ] = 2*f_177_1 + -1 The following rules are decreasing: f_203(x9:0, x10:0, cons_0) -> f_177(x10:0, x12:0) :|: TRUE && cons_0 = 0 f_203(v123:0:0, sum~cons_1~v174:0:0, v145:0:0) -> f_203(v123:0:0, v174:0:0, v145:1:0) :|: v145:0:0 < 0 && v123:0:0 > 1 && v174:0:0 > 0 && sum~cons_1~v174:0:0 = 1 + v174:0:0 f_203(x:0, sum~cons_1~x3:0, x2:0) -> f_203(x:0, x3:0, x4:0) :|: x2:0 > 0 && x:0 > 1 && x3:0 > 0 && sum~cons_1~x3:0 = 1 + x3:0 f_177(sum~cons_1~v116:0:0, v108:0:0) -> f_177(v116:0:0, v108:1:0) :|: v108:0:0 > 1 && v116:0:0 > 0 && sum~cons_1~v116:0:0 = 1 + v116:0:0 f_177(sum~cons_1~sum~cons_1~x7:0, x6:0) -> f_203(x6:0, x7:0, x8:0) :|: x7:0 > 0 && x6:0 > 1 && sum~cons_1~sum~cons_1~x7:0 = 1 + (1 + x7:0) The following rules are bounded: f_203(v123:0:0, sum~cons_1~v174:0:0, v145:0:0) -> f_203(v123:0:0, v174:0:0, v145:1:0) :|: v145:0:0 < 0 && v123:0:0 > 1 && v174:0:0 > 0 && sum~cons_1~v174:0:0 = 1 + v174:0:0 f_203(x:0, sum~cons_1~x3:0, x2:0) -> f_203(x:0, x3:0, x4:0) :|: x2:0 > 0 && x:0 > 1 && x3:0 > 0 && sum~cons_1~x3:0 = 1 + x3:0 f_177(sum~cons_1~v116:0:0, v108:0:0) -> f_177(v116:0:0, v108:1:0) :|: v108:0:0 > 1 && v116:0:0 > 0 && sum~cons_1~v116:0:0 = 1 + v116:0:0 ---------------------------------------- (12) Obligation: Rules: f_203(x9:0, x10:0, cons_0) -> f_177(x10:0, x12:0) :|: TRUE && cons_0 = 0 f_177(sum~cons_1~sum~cons_1~x7:0, x6:0) -> f_203(x6:0, x7:0, x8:0) :|: x7:0 > 0 && x6:0 > 1 && sum~cons_1~sum~cons_1~x7:0 = 1 + (1 + x7:0) ---------------------------------------- (13) IntTRSCompressionProof (EQUIVALENT) Compressed rules. ---------------------------------------- (14) Obligation: Rules: f_203(x9:0:0, sum~cons_1~sum~cons_1~x7:0:0, cons_0) -> f_203(x12:0:0, x7:0:0, x8:0:0) :|: x7:0:0 > 0 && x12:0:0 > 1 && sum~cons_1~sum~cons_1~x7:0:0 = 1 + (1 + x7:0:0) && cons_0 = 0 ---------------------------------------- (15) IntTRSUnneededArgumentFilterProof (EQUIVALENT) Some arguments are removed because they cannot influence termination. We removed arguments according to the following replacements: f_203(x1, x2, x3) -> f_203(x2, x3) ---------------------------------------- (16) Obligation: Rules: f_203(sum~cons_1~sum~cons_1~x7:0:0, cons_0) -> f_203(x7:0:0, x8:0:0) :|: x7:0:0 > 0 && x12:0:0 > 1 && sum~cons_1~sum~cons_1~x7:0:0 = 1 + (1 + x7:0:0) && cons_0 = 0 ---------------------------------------- (17) PolynomialOrderProcessor (EQUIVALENT) Found the following polynomial interpretation: [f_203(x, x1)] = x The following rules are decreasing: f_203(sum~cons_1~sum~cons_1~x7:0:0, cons_0) -> f_203(x7:0:0, x8:0:0) :|: x7:0:0 > 0 && x12:0:0 > 1 && sum~cons_1~sum~cons_1~x7:0:0 = 1 + (1 + x7:0:0) && cons_0 = 0 The following rules are bounded: f_203(sum~cons_1~sum~cons_1~x7:0:0, cons_0) -> f_203(x7:0:0, x8:0:0) :|: x7:0:0 > 0 && x12:0:0 > 1 && sum~cons_1~sum~cons_1~x7:0:0 = 1 + (1 + x7:0:0) && cons_0 = 0 ---------------------------------------- (18) YES