test_msvc_simd_bug981648_main.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * Copyright 2014 Andrey Semashev
  3. *
  4. * Distributed under the Boost Software License, Version 1.0.
  5. * See accompanying file LICENSE_1_0.txt or copy at
  6. * https://www.boost.org/LICENSE_1_0.txt
  7. */
  8. /*
  9. * This is a part of the test for a workaround for MSVC 12 (VS2013) optimizer bug
  10. * which causes incorrect SIMD code generation for operator==. See:
  11. *
  12. * https://svn.boost.org/trac/boost/ticket/8509#comment:3
  13. * https://connect.microsoft.com/VisualStudio/feedbackdetail/view/981648#tabs
  14. *
  15. * This file contains the main entry point.
  16. */
  17. #include <cstdio>
  18. #include "test_msvc_simd_bug981648.hpp"
  19. extern void mp_grid_update_marker_parameters(headerProperty* header_prop, my_obj &current_marker);
  20. static my_obj g_my_obj;
  21. int main(void)
  22. {
  23. my_obj *p = &g_my_obj;
  24. p->m_uuid = uuid();
  25. uuid one, two;
  26. one.data[0] = 0; two.data[0] = 1;
  27. //*****************************************
  28. // This != statement generates two movdqu statements or pcmpeqd with a memory operand which crashes
  29. if (one != two) {
  30. std::printf("The first != operator works okay if it reaches this printf.\n");
  31. }
  32. my_obj a;
  33. a.m_uuid.data[0] = 1;
  34. std::printf("There should be a another printf coming next.\n");
  35. //*****************************************
  36. // The != statement in this function generates a movups and a movdqu statement.
  37. // It also crashes because the optimizer also creates a pcmpeqd for a non-aligned memory location.
  38. mp_grid_update_marker_parameters(p, a);
  39. return 0;
  40. }