ad 1) May I ask why don't you just invert the condition and put the "do something" into the if-block? (And omit the else block)? It is not an error, but I think it'd be better.
If the results are wrong, don't you also need global memory synchronisation?
ad 2) The OpenCL specification:
"If barrier is inside a conditional statement, then all
work-items must enter the conditional if any work-item
enters the conditional statement and executes the
barrier."
So it is dangerous to do that unless you know that either all or none of the work-items enters the block with the barrier.
EDIT: The work-items are meant work-items inside one work-group.