First using the cache flush or invalidate functions on data buffers that aren't aligned with cache lines (32 bytes by default I think) can lead to all sort of problems. You may end up with one part of the cache line that contains valid data while the other doesn't, and executing a flush or invalidate function on that line will lead to memory corruption. When you declare your table as a local variable, it is allocated on the stack and probably not aligned correctly. The best way to ensure correct alignment is to declare it as static or glabal, and use gcc's __aligned__ attribute.
You are right that you shouldn't use the flush function if you use a cache bypass pointer. In fact the flush function can only make things worse, as it can overwrite the values you just put in memory with old values from the cache. On the other hand you should use an invalidate function to signal the CPU that you put new values in memory and that its cache line isn't valid anymore. If you don't do it, the CPU may overwrite your fifo_data buffer with values from its cache at any moment. But As I said before, this is dangerous if the buffer isn't aligned on a cache line. As the area is the stack, you could end up having bad values in other local variables.