Fix #14865

Fixes a codegen bug which generates illegal non-terminated LLVM block
when there are  wildcard pattern with guard and enum patterns in a match
expression. Also refactores the code a little.

Closes #14865