Basic TBAA.

Separate load/store of register, memory, runtime information, and stack
temp.

Change-Id: I9d1eadac718c48f43839b0762460defc6c641ae4
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 9d0d3f4..6430620 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -202,7 +202,8 @@
   llvm::Value* stack_end =
     irb_.LoadFromObjectOffset(thread_object_addr,
                               Thread::StackEndOffset().Int32Value(),
-                              irb_.getPtrEquivIntTy());
+                              irb_.getPtrEquivIntTy(),
+                              kTBAARuntimeInfo);
 
   // Check the frame address < thread.stack_end_ ?
   llvm::Value* is_stack_overflow = irb_.CreateICmpULT(frame_address, stack_end);
@@ -261,7 +262,7 @@
   llvm::ConstantAggregateZero* zero_initializer =
     llvm::ConstantAggregateZero::get(shadow_frame_type);
 
-  irb_.CreateStore(zero_initializer, shadow_frame_);
+  irb_.CreateStore(zero_initializer, shadow_frame_, kTBAARuntimeInfo);
 
   // Get method object
   llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
@@ -269,12 +270,14 @@
   // Store the method pointer
   irb_.StoreToObjectOffset(shadow_frame_,
                            ShadowFrame::MethodOffset(),
-                           method_object_addr);
+                           method_object_addr,
+                           kTBAARuntimeInfo);
 
   // Store the number of the pointer slots
   irb_.StoreToObjectOffset(shadow_frame_,
                            ShadowFrame::NumberOfReferencesOffset(),
-                           irb_.getJInt(sirt_size));
+                           irb_.getJInt(sirt_size),
+                           kTBAARuntimeInfo);
 
   // Push the shadow frame
   llvm::Value* shadow_frame_upcast =
@@ -1238,12 +1241,14 @@
   llvm::Value* exception_object_addr =
     irb_.LoadFromObjectOffset(thread_object_addr,
                               Thread::ExceptionOffset().Int32Value(),
-                              irb_.getJObjectTy());
+                              irb_.getJObjectTy(),
+                              kTBAARuntimeInfo);
 
   // Set thread-local exception field address to NULL
   irb_.StoreToObjectOffset(thread_object_addr,
                            Thread::ExceptionOffset().Int32Value(),
-                           irb_.getJNull());
+                           irb_.getJNull(),
+                           kTBAARuntimeInfo);
 
   // Keep the exception object in the Dalvik register
   EmitStoreDalvikReg(dec_insn.vA, kObject, kAccurate, exception_object_addr);
@@ -1384,7 +1389,7 @@
 
   llvm::Value* string_field_addr = EmitLoadDexCacheStringFieldAddr(string_idx);
 
-  llvm::Value* string_addr = irb_.CreateLoad(string_field_addr);
+  llvm::Value* string_addr = irb_.CreateLoad(string_field_addr, kTBAARuntimeInfo);
 
   if (!compiler_->CanAssumeStringIsPresentInDexCache(dex_cache_, string_idx)) {
     llvm::BasicBlock* block_str_exist =
@@ -1454,7 +1459,7 @@
     llvm::Value* type_field_addr =
       EmitLoadDexCacheResolvedTypeFieldAddr(type_idx);
 
-    llvm::Value* type_object_addr = irb_.CreateLoad(type_field_addr);
+    llvm::Value* type_object_addr = irb_.CreateLoad(type_field_addr, kTBAARuntimeInfo);
 
     if (compiler_->CanAssumeTypeIsPresentInDexCache(dex_cache_, type_idx)) {
       return type_object_addr;
@@ -1595,7 +1600,7 @@
     irb_.CreateBitCast(object_addr, jobject_ptr_ty->getPointerTo());
 
   llvm::Value* object_type_object_addr =
-    irb_.CreateLoad(object_type_field_addr);
+    irb_.CreateLoad(object_type_field_addr, kTBAARuntimeInfo);
 
   llvm::Value* equal_class =
     irb_.CreateICmpEQ(type_object_addr, object_type_object_addr);
@@ -1664,7 +1669,7 @@
     irb_.CreateBitCast(object_addr, jobject_ptr_ty->getPointerTo());
 
   llvm::Value* object_type_object_addr =
-    irb_.CreateLoad(object_type_field_addr);
+    irb_.CreateLoad(object_type_field_addr, kTBAARuntimeInfo);
 
   llvm::Value* equal_class =
     irb_.CreateICmpEQ(type_object_addr, object_type_object_addr);
@@ -1692,7 +1697,8 @@
   // Load array length
   return irb_.LoadFromObjectOffset(array,
                                    Array::LengthOffset().Int32Value(),
-                                   irb_.getJIntTy());
+                                   irb_.getJIntTy(),
+                                   kTBAARuntimeInfo);
 }
 
 
@@ -1860,7 +1866,7 @@
         reg_value = EmitLoadDalvikReg(reg_index, kObject, kAccurate);
       }
 
-      irb_.CreateStore(reg_value, data_field_addr);
+      irb_.CreateStore(reg_value, data_field_addr, kTBAAMemory);
 
       data_field_addr =
         irb_.CreatePtrDisp(data_field_addr, elem_size, field_type);
@@ -2277,7 +2283,7 @@
   llvm::Value* array_elem_addr =
     EmitArrayGEP(array_addr, index_value, elem_type, elem_jty);
 
-  llvm::Value* array_elem_value = irb_.CreateLoad(array_elem_addr);
+  llvm::Value* array_elem_value = irb_.CreateLoad(array_elem_addr, kTBAAMemory);
 
   EmitStoreDalvikReg(dec_insn.vA, elem_jty, kArray, array_elem_value);
 
@@ -2313,7 +2319,7 @@
     EmitMarkGCCard(new_value, array_addr);
   }
 
-  irb_.CreateStore(new_value, array_elem_addr);
+  irb_.CreateStore(new_value, array_elem_addr, kTBAAMemory);
 
   irb_.CreateBr(GetNextBasicBlock(dex_pc));
 }
@@ -2374,7 +2380,7 @@
 
     // TODO: Check is_volatile.  We need to generate atomic load instruction
     // when is_volatile is true.
-    field_value = irb_.CreateLoad(field_addr);
+    field_value = irb_.CreateLoad(field_addr, kTBAAMemory);
   }
 
   EmitStoreDalvikReg(dec_insn.vA, field_jty, kField, field_value);
@@ -2438,7 +2444,7 @@
 
     // TODO: Check is_volatile.  We need to generate atomic store instruction
     // when is_volatile is true.
-    irb_.CreateStore(new_value, field_addr);
+    irb_.CreateStore(new_value, field_addr, kTBAAMemory);
 
     if (field_jty == kObject) { // If put an object, mark the GC card table.
       EmitMarkGCCard(new_value, object_addr);
@@ -2460,7 +2466,7 @@
   llvm::Value* storage_field_addr =
     EmitLoadDexCacheStaticStorageFieldAddr(type_idx);
 
-  llvm::Value* storage_object_addr = irb_.CreateLoad(storage_field_addr);
+  llvm::Value* storage_object_addr = irb_.CreateLoad(storage_field_addr, kTBAARuntimeInfo);
 
   llvm::BasicBlock* block_original = irb_.GetInsertBlock();
 
@@ -2558,7 +2564,8 @@
       static_storage_addr =
         irb_.LoadFromObjectOffset(method_object_addr,
                                   Method::DeclaringClassOffset().Int32Value(),
-                                  irb_.getJObjectTy());
+                                  irb_.getJObjectTy(),
+                                  kTBAARuntimeInfo);
     } else {
       // Medium path, static storage base in a different class which
       // requires checks that the other class is initialized
@@ -2574,7 +2581,7 @@
 
     // TODO: Check is_volatile.  We need to generate atomic load instruction
     // when is_volatile is true.
-    static_field_value = irb_.CreateLoad(static_field_addr);
+    static_field_value = irb_.CreateLoad(static_field_addr, kTBAAMemory);
   }
 
   EmitStoreDalvikReg(dec_insn.vA, field_jty, kField, static_field_value);
@@ -2636,7 +2643,8 @@
       static_storage_addr =
         irb_.LoadFromObjectOffset(method_object_addr,
                                   Method::DeclaringClassOffset().Int32Value(),
-                                  irb_.getJObjectTy());
+                                  irb_.getJObjectTy(),
+                                  kTBAARuntimeInfo);
     } else {
       // Medium path, static storage base in a different class which
       // requires checks that the other class is initialized
@@ -2652,7 +2660,7 @@
 
     // TODO: Check is_volatile.  We need to generate atomic store instruction
     // when is_volatile is true.
-    irb_.CreateStore(new_value, static_field_addr);
+    irb_.CreateStore(new_value, static_field_addr, kTBAAMemory);
 
     if (field_jty == kObject) { // If put an object, mark the GC card table.
       EmitMarkGCCard(new_value, static_storage_addr);
@@ -2792,7 +2800,8 @@
   llvm::Value* code_addr =
     irb_.LoadFromObjectOffset(callee_method_object_addr,
                               Method::GetCodeOffset().Int32Value(),
-                              GetFunctionType(callee_method_idx, is_static)->getPointerTo());
+                              GetFunctionType(callee_method_idx, is_static)->getPointerTo(),
+                              kTBAARuntimeInfo);
 
   // Load the actual parameter
   std::vector<llvm::Value*> args;
@@ -2895,7 +2904,7 @@
       if (ret_shorty != 'V') {
         llvm::Value* result_addr =
             irb_.CreateBitCast(temp_space_addr, accurate_ret_type->getPointerTo());
-        llvm::Value* retval = irb_.CreateLoad(result_addr);
+        llvm::Value* retval = irb_.CreateLoad(result_addr, kTBAAStackTemp);
         EmitStoreDalvikRetValReg(ret_shorty, kAccurate, retval);
       }
     }
@@ -2917,7 +2926,7 @@
   llvm::Value* callee_method_object_field_addr =
     EmitLoadDexCacheResolvedMethodFieldAddr(callee_method_idx);
 
-  return irb_.CreateLoad(callee_method_object_field_addr);
+  return irb_.CreateLoad(callee_method_object_field_addr, kTBAARuntimeInfo);
 }
 
 
@@ -2928,13 +2937,15 @@
   llvm::Value* class_object_addr =
     irb_.LoadFromObjectOffset(this_addr,
                               Object::ClassOffset().Int32Value(),
-                              irb_.getJObjectTy());
+                              irb_.getJObjectTy(),
+                              kTBAARuntimeInfo);
 
   // Load vtable address
   llvm::Value* vtable_addr =
     irb_.LoadFromObjectOffset(class_object_addr,
                               Class::VTableOffset().Int32Value(),
-                              irb_.getJObjectTy());
+                              irb_.getJObjectTy(),
+                              kTBAARuntimeInfo);
 
   // Load callee method object
   llvm::Value* vtable_idx_value =
@@ -2943,7 +2954,7 @@
   llvm::Value* method_field_addr =
     EmitArrayGEP(vtable_addr, vtable_idx_value, irb_.getJObjectTy(), kObject);
 
-  return irb_.CreateLoad(method_field_addr);
+  return irb_.CreateLoad(method_field_addr, kTBAARuntimeInfo);
 }
 
 
@@ -3316,7 +3327,7 @@
     // Everything modulo -1 will be 0.
     eq_result = zero;
   }
-  irb_.CreateStore(eq_result, result);
+  irb_.CreateStore(eq_result, result, kTBAAStackTemp);
   irb_.CreateBr(neg_one_cont);
 
   // If divisor != -1, just do the division.
@@ -3327,11 +3338,11 @@
   } else {
     ne_result = irb_.CreateSRem(dividend, divisor);
   }
-  irb_.CreateStore(ne_result, result);
+  irb_.CreateStore(ne_result, result, kTBAAStackTemp);
   irb_.CreateBr(neg_one_cont);
 
   irb_.SetInsertPoint(neg_one_cont);
-  return irb_.CreateLoad(result);
+  return irb_.CreateLoad(result, kTBAAStackTemp);
 }
 
 
@@ -3543,7 +3554,8 @@
 
   return irb_.LoadFromObjectOffset(method_object_addr,
                                    offset.Int32Value(),
-                                   irb_.getJObjectTy());
+                                   irb_.getJObjectTy(),
+                                   kTBAARuntimeInfo);
 }
 
 
@@ -3911,7 +3923,8 @@
 void MethodCompiler::EmitUpdateDexPC(uint32_t dex_pc) {
   irb_.StoreToObjectOffset(shadow_frame_,
                            ShadowFrame::DexPCOffset(),
-                           irb_.getInt32(dex_pc));
+                           irb_.getInt32(dex_pc),
+                           kTBAARuntimeInfo);
 }