cmake_minimum_required (VERSION 2.8) project (IR_Library) enable_testing() option (USE_AVX2 "Compile for Haswell arch with AVX2, BMI, BMI2") if (USE_AVX2) message("---- Compiling for AVX2") set(CXX_SSE_FLAGS "-msse2 -m64") #"-march=core-avx2") set(LLVM_SSE_FLAGS "-mattr=+sse,+sse2,+avx2,+bmi2,+bmi -march=x86-64") else (USE_AVX2) set(CXX_SSE_FLAGS "-msse2") set(LLVM_SSE_FLAGS "-mattr=+sse,+sse2") endif (USE_AVX2) # perf_flags for xmlwf perf script set(CXX_PERF_FLAGS "-DBUFFER_PROFILING -DPERF_SCRIPT") set(CMAKE_CXX_FLAGS "${CXX_SSE_FLAGS} -std=c++11 ") set(LL_SOURCE_FILES s2p.ll p2s.ll) if (USE_AVX2) #append s2p_ideal.ll to source list set(LL_SOURCE_FILES ${LL_SOURCE_FILES} s2p_ideal.ll) endif (USE_AVX2) set(LLVM_OPT "opt-svn") set(LLVM_LLC "llc-svn") set(LLVM_LINK "llvm-link") add_executable(test_s2p test_s2p.cpp ir_impl.o) add_executable(test_link test_link.cpp ir_impl.o) add_executable(test_pack test_pack.cpp ir_impl.o) # gen/ is used to test llc backend. add_subdirectory(gen) # test packh_2,4,8 only on avx2 if (USE_AVX2) add_executable(test_pack_avx2 test_pack_avx2.cpp ir_impl.o) add_test( NAME ctest_pack_avx2 COMMAND ./test_pack_avx2) endif (USE_AVX2) include_directories("xmlwf/util" "xmlwf/lib") add_executable(xmlwf xmlwf/src/xmlwf.cpp ir_impl.o) # xmlwf_perf compiles with additional flags and is only used for the perf_xmlwf # targets below. add_executable(xmlwf_perf xmlwf/src/xmlwf.cpp ir_impl.o) set_target_properties(xmlwf_perf PROPERTIES COMPILE_FLAGS ${CXX_PERF_FLAGS} ) add_executable(u8u16 u8u16/src/u8u16.cpp ir_impl.o) add_custom_target(asm COMMAND ${LLVM_LLC} -O3 ${LLVM_SSE_FLAGS} ir_impl_opt.bc DEPENDS ir_impl_opt.bc) # link ll source files together into ir_impl.bc message("---- Link ${LL_SOURCE_FILES} ----") add_custom_command( OUTPUT ir_impl.bc COMMAND ${LLVM_LINK} ${LL_SOURCE_FILES} -o ${CMAKE_BINARY_DIR}/ir_impl.bc WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} DEPENDS ${LL_SOURCE_FILES}) # compile ir_impl.bc add_custom_command( OUTPUT ir_impl.o ir_impl_opt.bc COMMAND ${LLVM_OPT} -O3 -std-compile-opts ${LLVM_SSE_FLAGS} ir_impl.bc -o ir_impl_opt.bc COMMAND ${LLVM_LLC} -O3 ${LLVM_SSE_FLAGS} -filetype=obj ir_impl_opt.bc -o ir_impl.o DEPENDS ir_impl.bc) add_test( NAME ctest_s2p COMMAND python ${PROJECT_SOURCE_DIR}/test_s2p.py) add_test( NAME ctest_link COMMAND python ${PROJECT_SOURCE_DIR}/test_link.py) add_test( NAME ctest_pack COMMAND ./test_pack) add_test( NAME ctest_xmlwf COMMAND python ${PROJECT_SOURCE_DIR}/xmlwf/run_all.py) add_test( NAME ctest_u8u16 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/../../proto/u8u16/QA COMMAND ${PROJECT_SOURCE_DIR}/u8u16/run_all ${CMAKE_BINARY_DIR}/u8u16) add_custom_target (check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS test_s2p test_link test_pack test_llc xmlwf u8u16) # `make check` also depends on test_pack_avx2 if (USE_AVX2) add_dependencies(check test_pack_avx2) endif (USE_AVX2) # performance scripts here add_custom_target (perf_xmlwf COMMAND python ${PROJECT_SOURCE_DIR}/xmlwf/perf_script.py DEPENDS xmlwf_perf) add_custom_target (perf_u8u16 COMMAND python ${PROJECT_SOURCE_DIR}/u8u16/perf_script.py DEPENDS u8u16) # Try IR inline. Compile the whole xmlwf in IR and inline s2p into it. set(LLVM_LINK "llvm-link") set(LLVM_CLANG "/usr/local/bin/clang") # cxx_include should only be used for ir_inline approach. set(CXX_INCLUDE -I${PROJECT_SOURCE_DIR}/xmlwf/util -I${PROJECT_SOURCE_DIR}/xmlwf/lib) add_custom_target(xmlwf_ir_inline COMMAND ${LLVM_LINK} ${PROJECT_SOURCE_DIR}/s2p.ll xmlwf.ll -o xmlwf_all.bc COMMAND ${LLVM_OPT} -O3 -std-compile-opts -std-link-opts xmlwf_all.bc -o xmlwf_ir_inline.bc COMMAND ${LLVM_LLC} -O3 ${LLVM_SSE_FLAGS} -filetype=obj xmlwf_ir_inline.bc COMMAND ${CMAKE_CXX_COMPILER} xmlwf_ir_inline.o -o xmlwf_ir_inline DEPENDS s2p.ll xmlwf.ll) add_custom_command( OUTPUT xmlwf.ll COMMAND ${LLVM_CLANG} -S -emit-llvm ${CXX_INCLUDE} ${PROJECT_SOURCE_DIR}/xmlwf/src/xmlwf.cpp ${CXX_PERF_FLAGS} -o xmlwf.ll DEPENDS xmlwf/src/xmlwf.cpp)