diff --git a/src/ir/Function.cc b/src/ir/Function.cc
index e67b0b206841dd036b757c63a3c5cae7c4f35f59..0508e0b34629df9f3e93408a1289e3bcb342fa16 100644
--- a/src/ir/Function.cc
+++ b/src/ir/Function.cc
@@ -15,8 +15,8 @@ Function::Function(FuncType* fType, bool isExt, string name)
     setSideEffects(true);
     setPureFunction(false);
     setRecursive(false);
-    setMemRead(true);
-    setMemWrite(true);
+    setMemRead(false);
+    setMemWrite(false);
     return;
   }
   entry = new BasicBlock(name + "_entry");
diff --git a/src/opt/LoopAnalysis.cc b/src/opt/LoopAnalysis.cc
index 8237937928ac9522f4591554cdd6a1719a4a6a3b..ea7a6a0a6d0485b8773c604f7c87352ca5468811 100644
--- a/src/opt/LoopAnalysis.cc
+++ b/src/opt/LoopAnalysis.cc
@@ -55,6 +55,7 @@ bool LoopAnalysis::runOnFunction(Function* func) {
   loopInfoBase->calculateDepth();
   func->setLoopInfoBase(loopInfoBase);
 
+  loopInfoBase->analyseSimpleLoop();
   // #ifdef DEBUG_MODE
   //   loopInfoBase->dump();
   // #endif
diff --git a/src/opt/LoopUnroll.cc b/src/opt/LoopUnroll.cc
index d2459fe46989f878854ce5433c66e2fb2be8a1e4..ddefdea38c31f6e9aaadcadc9737441b58a1f972 100644
--- a/src/opt/LoopUnroll.cc
+++ b/src/opt/LoopUnroll.cc
@@ -35,7 +35,6 @@ bool LoopUnroll::runOnModule(ANTPIE::Module* module) {
 bool LoopUnroll::runOnFunction(Function* func) {
   bool changed = false;
   LoopInfoBase* liBase = func->getLoopInfoBase();
-  liBase->analyseSimpleLoop();
   for (LoopInfo* loopInfo : liBase->loopInfos) {
     if (loopInfo->subLoops.empty()) {
       changed |= runOnLoop(loopInfo);
@@ -64,6 +63,7 @@ bool LoopUnroll::runOnLoop(LoopInfo* loopInfo) {
 
   // Too big
   if (size > MAX_LINE) return changed;
+  if (loopInfo->blocks.size() > 2) return changed;
 
   SimpleLoopInfo* simpleLoop = loopInfo->simpleLoop;
   BranchInst* brInst = simpleLoop->brInstr;