The code will be translated by compilers to something like the following pseudo-assemley code:
A - B
branch if greater then 0 to end
C - D
branch if greater then 0 to end
inc A
inc B
end:
...
Now, in order to make all possible choices in all branches, you need 3 test cases:
- A <= B (branch in first branch instruction)
- C <= D (branch in second branch instruction)
- A > B and C > D (don't branch in 2nd branch instruction and get to the increasing instructions)
Note that for alternative definition of "coverage" - "All instructions coverage", 1 test case can be enough (with the above compiled code), because even if you don't branch, the "branch if.." instruction is still executed, so for A>B and C>D test case, you actually go through all instructions.
P.S. assuming here:
Cyclomatic complexity is number of test cases that are necessary to achieve thorough test coverage of a particular module.