Add REACTOR_DEFAULT_OPT_LEVEL macro

Allows us to configure Reactor backend optimization level via
preprocessor macro. Can be set via CMake arg.

Bug: b/145685985
Change-Id: I27a80b15846a8b43be5bff0505632213852a5dc6
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39168
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 61f8090..6d4bb75 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -116,6 +116,11 @@
 set(REACTOR_BACKEND ${DEFAULT_REACTOR_BACKEND} CACHE STRING "JIT compiler back-end used by Reactor")
 set_property(CACHE REACTOR_BACKEND PROPERTY STRINGS LLVM Subzero)
 
+# If defined, overrides the default optimization level of the current reactor backend.
+# Set to one of the rr::Optimization::Level enum values.
+set(REACTOR_DEFAULT_OPT_LEVEL "Default" CACHE STRING "Reactor default optimization level")
+set_property(CACHE REACTOR_DEFAULT_OPT_LEVEL PROPERTY STRINGS "None" "Less" "Default" "Aggressive")
+
 # LLVM disallows calling cmake . from the main LLVM dir, the reason is that
 # it builds header files that could overwrite the orignal ones. Here we
 # want to include LLVM as a subdirectory and even though it wouldn't cause
@@ -492,6 +497,10 @@
     list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DENABLE_RR_LLVM_IR_VERIFICATION")
 endif()
 
+if(REACTOR_DEFAULT_OPT_LEVEL)
+    list(APPEND SWIFTSHADER_COMPILE_OPTIONS "-DREACTOR_DEFAULT_OPT_LEVEL=${REACTOR_DEFAULT_OPT_LEVEL}")
+endif()
+
 if(WIN32)
     add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
     set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 05d4b42..af39027 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -121,7 +121,6 @@
 		// This uses a static in a function to avoid the cost of a global static
 		// initializer. See http://neugierig.org/software/chromium/notes/2011/08/static-initializers.html
 		static rr::Config config = rr::Config::Edit()
-			.set(rr::Optimization::Level::Default)
 			.add(rr::Optimization::Pass::ScalarReplAggregates)
 			.add(rr::Optimization::Pass::InstructionCombining)
 			.apply({});
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index 25c933d..fd202a3 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -68,8 +68,15 @@
 
 		using Passes = std::vector<Pass>;
 
-		Optimization() = default;
-		Optimization(Level level, const Passes & passes) : level(level), passes(passes) {}
+		Optimization(Level level = Level::Default, const Passes& passes = {})
+			: level(level), passes(passes)
+		{
+			#if defined(REACTOR_DEFAULT_OPT_LEVEL)
+			{
+				level = Level::REACTOR_DEFAULT_OPT_LEVEL;
+			}
+			#endif
+		}
 
 		Level getLevel() const { return level; }
 		const Passes & getPasses() const { return passes; }
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 81409c8..552b80e 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -68,7 +68,6 @@
 		// This uses a static in a function to avoid the cost of a global static
 		// initializer. See http://neugierig.org/software/chromium/notes/2011/08/static-initializers.html
 		static rr::Config config = rr::Config::Edit()
-			.set(rr::Optimization::Level::Default)
 			.apply({});
 		return config;
 	}