Hi Trevor,
I am not 100% sure why you should not copy a BasicBlock, however I believe two times the same BasicBlock does not make any sense in a CFG. There would be inconsistencies as e.g if a BB A is the successor of B there are two equal basic blocks A and A' after copying A, but only one (A) can be the real successor. The other one (A') is not referenced, but still references B as the predecessor of A'.
So for me the reason is that BasicBlocks are not independent and can just be copied. They are connected to their environment and cannot be exactly the same. Even the statements in the basicblock always have to be different, as every register in LLVM can only be written once per function.
To copy a BasicBlock in LLVM you should probably create a new one and copy the statements into the new BasicBlock. This obviously does not work for boost.
Some basic functionality for graph traversal is already in LLVM (as you mentioned) like iterating over edges, children or doing stuff like depthfirstsearch or post order search.
What kind of graph algorithm would you like to execute that is not available in LLVM?
Tobi