I did some digging about this issue and discovered that if a window is semi maximized, CompWindow::border is set to values of maximized window borders (left 0px, right 0px) but the normal border (left 1px, right 1px) is still drawn around semi-maximized windows.
So, if a window is semi-maximized, compiz will calculate the window geometry without leaving the extra pixel for the borders. Consequently the borders occupy the next available pixels, which happen to be in a different workspaces.
I did some digging about this issue and discovered that if a window is semi maximized, CompWindow::border is set to values of maximized window borders (left 0px, right 0px) but the normal border (left 1px, right 1px) is still drawn around semi-maximized windows.
So, if a window is semi-maximized, compiz will calculate the window geometry without leaving the extra pixel for the borders. Consequently the borders occupy the next available pixels, which happen to be in a different workspaces.