diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d7d9dd04fb2eeb9e86ee5bbd4361e51e035509a2..6e6ffa5bdd506b815a91babdf4f08557087ee7a8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,7 +9,7 @@ build:
     script: 
         - pacman -Sy && pacman -S --noconfirm bison flex gettext sdl2 lib32-glibc grep
         - export AM_HOME=$(pwd)/nexus-am/
-        - cd nemu && make
+        - cd nemu && make EXTRA_FLAGS='-DDISABLE_MMIO'
         - show_log=1 ./runall.sh &> testcases.log ; echo $? > testres.log
     artifacts:
         paths:
@@ -17,6 +17,12 @@ build:
             - nemu/testcases.log
         expire_in: 1 week
 
+build-icc-pgo:
+    stage: build
+    script:
+        - pacman -Sy && pacman -S --noconfirm bison flex gettext sdl2 lib32-glibc grep
+        - export AM_HOME=$(pwd)/nexus-am/
+        - cd nemu && ./icc-build.sh
 
 test:
     stage: test
diff --git a/nemu/5e0a2631_649414.dyn b/nemu/5e0a2631_649414.dyn
deleted file mode 100644
index 3f8b1feae3423fc40d200304b67df3d7bb400fe7..0000000000000000000000000000000000000000
Binary files a/nemu/5e0a2631_649414.dyn and /dev/null differ
diff --git a/nemu/Makefile b/nemu/Makefile
index f988fa24c7807d950206022bf19fc1a801e5593f..b3e86e14d90a91ee81896536dec895ae0dde01bf 100644
--- a/nemu/Makefile
+++ b/nemu/Makefile
@@ -16,12 +16,11 @@ include Makefile.git
 .DEFAULT_GOAL = app
 
 # Compilation flags
-CXX = icpc
+CXX ?= g++
 LD = $(CXX)
-EXTRA_FLAGS ?= -prof-use
 INCLUDES  = $(addprefix -I, $(INC_DIR))
 CFLAGS   += -O3 -MMD -Wall $(INCLUDES) -fomit-frame-pointer -std=c++17
-CFLAGS   += -no-ansi-alias -DDISABLE_MMIO -no-complex-limited-range -qopt-prefetch=2 $(EXTRA_FLAGS)
+CFLAGS   += $(EXTRA_FLAGS)
 # CFLAGS   += -DDIFF_TEST_QEMU
 
 # Source code generation before any targets.
@@ -70,3 +69,4 @@ clean:
 	$(MAKE) -C tools/gen-expr clean
 	$(MAKE) -C tools/qemu-diff clean
 	$(MAKE) -C $(SUBDIRS) clean
+	rm -f *.dyn pgopti.dpi*
diff --git a/nemu/icc-build.sh b/nemu/icc-build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3adee30d7dca9b7e4d15d5703504fbb0b6b2c636
--- /dev/null
+++ b/nemu/icc-build.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+xflags="-no-ansi-alias -DDISABLE_MMIO -no-complex-limited-range -qopt-prefetch=2"
+cpus=$(grep -c '^processor' /proc/cpuinfo)
+
+make clean &&
+make EXTRA_FLAGS="$xflags -prof-gen" CXX=icpc -j$cpus &&
+make -C "$AM_HOME/apps/microbench" ARCH=x86-nemu &&
+build/nemu -b "$AM_HOME/apps/microbench/build/microbench-x86-nemu.bin" &&
+make clean &&
+make EXTRA_FLAGS="$xflags -prof-use" CXX=icpc -j$cpus
+
+exit $?
+
diff --git a/nemu/pgopti.dpi b/nemu/pgopti.dpi
deleted file mode 100644
index 1787c3cf4efecebd17577f6e200215a774ee7829..0000000000000000000000000000000000000000
Binary files a/nemu/pgopti.dpi and /dev/null differ
diff --git a/nemu/pgopti.dpi.lock b/nemu/pgopti.dpi.lock
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/nemu/src/device/vga.cc b/nemu/src/device/vga.cc
index 906196dce1de028da1ac361e1adda43a6e141341..8095b786bb84fac392e771fc34680c39a880632c 100644
--- a/nemu/src/device/vga.cc
+++ b/nemu/src/device/vga.cc
@@ -37,11 +37,13 @@ static void init_vga_impl() {
 }
 
 void update_screen() {
+#ifndef DISABLE_MMIO
   if(window == nullptr) init_vga_impl();
   SDL_ErrorCheck(SDL_UpdateTexture(texture, NULL, vmem, SCREEN_W * sizeof(vmem[0][0])));
   SDL_ErrorCheck(SDL_RenderClear(renderer));
   SDL_ErrorCheck(SDL_RenderCopy(renderer, texture, NULL, NULL));
   SDL_RenderPresent(renderer);
+#endif
 }
 
 void init_vga() {