History log of /art/compiler/dex/
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
24c846a0df02d4cc2ef8a9c476305dca96be40db 26-Jan-2015 Vladimir Marko <vmarko@google.com> Quick: Fix range check for intrinsic String.charAt() on x86.

Bug: 19125146

(cherry picked from commit 00ca84730a21578dcc6b47bd8e08b78ab9b2dded)

Change-Id: I67184371597fdcc9d9186172c1cff4efd3ca3093
uick/x86/target_x86.cc
e7227c628e6f22a823945cc76e554eb2a8b0d925 13-Jan-2015 Vladimir Marko <vmarko@google.com> Fix wide volatile IGET/IPUT on ARM without atomic ldrd/strd.

If ldrd/strd isn't atomic, IPUT_WIDE uses ldrexd+strexd and
we need to record the safepoint for the ldrexd rather than
strexd. IGET_WIDE was simply missing the memory barrier.

Bug: 18993519

(cherry picked from commit ee5e273e4d0dd91b480c8d5dbcccad15c1b7353c)

Change-Id: I4e9270b994f413c1a047c1c4bb9cce5f29e42cb4
uick/arm/utility_arm.cc
uick/gen_common.cc
56e7666fe0df2c1a16b2cc6d12562c3e82199c0d 06-Jan-2015 Andreas Gampe <agampe@google.com> ART: Fix divide-by-zero for ARM

There was an infinite loop in the code generation for a divide
by literal zero.

Bug: 18887754

(cherry picked from commit cfe71e59c667abb35bc2363c49af7f8b549c44d0)

Change-Id: Ibd481918d3c6d7bc62fdd1a6807042009f561d95
uick/arm/int_arm.cc
d6bd06c713e8ec69de96510ef57bdf7adb4781ed 19-Dec-2014 Vladimir Marko <vmarko@google.com> Fix running out of temps when storing invoke-interface result.

On ARM, after emitting invoke-interface we didn't have any
free temps to use for storing the result, so we would crash
if the result was an unpromoted dalvik register with stack
location too far from SP.

Bug: 18769895
Change-Id: Ie6c131d68f1853a8317b305a22eab22faea80e90
uick/arm/target_arm.cc
uick/arm64/target_arm64.cc
uick/gen_invoke.cc
uick/mips/target_mips.cc
uick/x86/target_x86.cc
62746d8d9c4400e4764f162b22bfb1a32be287a9 09-Dec-2014 Andreas Gampe <agampe@google.com> ART: Swap-space in the compiler

Introduce a swap-space and corresponding allocator to transparently
switch native allocations to memory backed by a file.

Bug: 18596910
Change-Id: I131448f3907115054a592af73db86d2b9257ea33
uick/codegen_util.cc
f535c69f115c61ffadca1bd2706244d0aa30f9aa 17-Dec-2014 Andreas Gampe <agampe@google.com> ART: Punt to the interpreter for VerifiedMethod errors

In case that the GC map can't be created (because of size restrictions),
do not fail the class. Instead punt to the interpreter.

Bug: 17791183
Change-Id: I348bb306dbfc85c235fa93c0c527fba6627551fe
erification_results.cc
erified_method.cc
59f6b7a22845421772daa12f2c7c97ffcdf3b037 09-Dec-2014 Bill Buzbee <buzbee@google.com> Merge "ART: GenLongArith has to clobber same operands for 2-op instr" into lmp-mr1-dev
5ed44ac35c6b068227954f43e7176ec36287a2ec 13-Nov-2014 nikolay serdjuk <nikolay.y.serdjuk@intel.com> ART: GenLongArith has to clobber same operands for 2-op instr

When we generate code for 'add-long/2addr v4, v4' and v4 is in
memory, we load v4 in a physical register, do operation and
store result in memory. After that, we should clobber the
physical register because it is not valid anymore.

Signed-off-by: nikolay serdjuk <nikolay.y.serdjuk@intel.com>

(cherry picked from commit 6b9356cf0feb2a4100798481869fd4d18180c29f)

Bug: 18671047
Bug: https://code.google.com/p/android/issues/detail?id=81542
Change-Id: Ie11e29cd32358ddbdccf66eaad46aa07f1269133
uick/x86/int_x86.cc
6bde927d86d7539d6261a60f0eda67230ab01f8c 10-Nov-2014 nikolay serdjuk <nikolay.y.serdjuk@intel.com> ART: GenNegLong incorrectly handled register overlap for x86

There is a bug in the GenNegLong: it should invoke
OpRegCopy(temp_reg, rl_result.reg.GetHigh());
instead of
OpRegCopy(temp_reg, rl_result.reg);
But, anyway there is no need to handle the overlap
anymore because it is already handled in OpRegCopyWide()
which is invoked from StoreValueWide().
Signed-off-by: nikolay serdjuk <nikolay.y.serdjuk@intel.com>

(cherry picked from commit d24c9346138b7b8723461d94d9866762a59929d9)

Bug: 18671045
Bug: https://code.google.com/p/android/issues/detail?id=81544
Change-Id: I6d67a2a1507043c15de4616d0df59459630d4104
uick/x86/int_x86.cc
eb1404a0b59c4a981af61852c94129507efc331a 04-Sep-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Fix variable formatting and CodeLayout's multiple visits

The CodeLayout pass visits multiple times the same BasicBlock. This patch
fixes that issue to reduce its overhead.

The patch also fixes cUnit to c_unit in the bb_optimization files.

Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>

Bug: 18507840

(cherry picked from commit 75bcc3780bc40dd7c265e150aff5b891135ff6e3)

Change-Id: I4675ba0b4886c35f0093ac54e171dd87548f60c8
b_optimizations.h
ir_optimization.cc
25fda92083d5b93b38cc1f6b12ac6a44d992d6a4 04-Dec-2014 Mathieu Chartier <mathieuc@google.com> Remove method verification results right after compiling a method

This saves memory since it allows the code arrays from methods
compiled in future methods to use the ram we just freed from the
verification results.

GmsCore.apk:
Before: dex2oat took 77.383s (threads: 2) arena alloc=6MB java alloc=30MB native alloc=77MB free=13KB
After: dex2oat took 72.180s (threads: 2) arena alloc=6MB java alloc=30MB native alloc=60MB free=13KB

Bug: 18596910
Change-Id: I5d6df380e4fe58751a2b304202083f4d30b33b7c
uick/codegen_util.cc
erification_results.cc
erification_results.h
c375e52e813857ad4c726bfb19ef4114e11095df 01-Dec-2014 Vladimir Marko <vmarko@google.com> Quick: Fix neg-long on ARM for overlapping regs.

Bug: 18569347

(cherry picked from commit 2f340a843ea5b3413c901f8c2365243b68864468)

Change-Id: Icde3bfdd7c90d51548823ce1f81caf9484de2be5
uick/arm/int_arm.cc
19506c5641f1bd0824b1fd85fb1a5955306595d2 26-Nov-2014 Mathieu Chartier <mathieuc@google.com> Merge "Move dex cache strings from ArtMethod -> Class" into lmp-mr1-dev
bd81854ae2106531a36af378aab78c790487ef64 25-Nov-2014 buzbee <buzbee@google.com> Quick compiler: handle embedded switch data.

Although switch data is generally placed at the end of a dex
file by dx, it can occur elsewhere (and does via obsfucators).
This CL fixes a parsing error related to embedded switch data by
ensuring valid dex instructions following the embedded data appear
in their own basic blocks.

b/18524584

Change-Id: I815bb5ec939803f706f98beb3afbefc8b527f730
ir_graph.cc
f521f423b66e952f746885dd9f6cf8ef2788955d 25-Nov-2014 Mathieu Chartier <mathieuc@google.com> Move dex cache strings from ArtMethod -> Class

Adds one load for const strings which are not direct.

Saves >= 60KB of memory avg per app.
Image size: -350KB.

Bug: 17643507
Change-Id: I2d1a3253d9de09682be9bc6b420a29513d592cc8
uick/gen_common.cc
807140048f82a2b87ee5bcf337f23b6a3d1d5269 21-Nov-2014 Mathieu Chartier <mathieuc@google.com> Add fast string sharpening

String sharpening changes const strings to PC relative loads instead
of always going through the dex cache. This saves code size and
probably improves performance slightly.

Before: 49602992 system@framework@boot.oat
After: 49385904 system@framework@boot.oat

Pre-cursor to removing dex_cache_strings_ field from ArtMethod.

Bug: 17643507

Change-Id: I1787f48774631eee0accafeea257aa8d0e91e8d6
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.h
9601abfa1db1e9e29999c4abf3b597464022df40 19-Nov-2014 buzbee <buzbee@google.com> Quick compiler: fix x86 special identity

The Quick compiler recognizes and specially handles a set of
small methods - including those that simply return one of their
arguments. For x86, special identity was broken if the returned
argument was a double that was passed half in register and half
in memory.

internal b/17325447

(cherry picked from commit e8f74e58b476520cfc53970304c67b800994e33d)

Change-Id: I9afea5ef34498306528e0804489b5144e9e9aec3
uick/mir_to_lir.cc
e832e64a7e82d7f72aedbd7d798fb929d458ee8f 10-Nov-2014 Mathieu Chartier <mathieuc@google.com> Change 64 bit ArtMethod fields to be pointer sized

Changed the 64 bit entrypoint and gc map fields in ArtMethod to be
pointer sized. This saves a large amount of memory on 32 bit systems.
Reduces ArtMethod size by 16 bytes on 32 bit.

Total number of ArtMethod on low memory mako: 169957
Image size: 49203 methods -> 787248 image size reduction.
Zygote space size: 1070 methods -> 17120 size reduction.
App methods: ~120k -> 2 MB savings.

Savings per app on low memory mako: 125K+ per app
(less active apps -> more image methods per app).

Savings depend on how often the shared methods are on dirty pages vs
shared.

TODO in another CL, delete gc map field from ArtMethod since we
should be able to get it from the Oat method header.

Bug: 17643507

Change-Id: Ie9508f05907a9f693882d4d32a564460bf273ee8
uick/gen_invoke.cc
8073ba11c62ea8aeb8322b18e730005733c06e70 13-Nov-2014 Pavel Vyssotski <pavel.n.vyssotski@intel.com> ART: Implicit null check should break def tracking

Implicit null check can provoke exception that needs to be sure all VRs are saved on stack.
The fix is to reset the def tracking system at the moment of adding an implicit null check.

b/18368901

Signed-off-by: Pavel Vyssotski <pavel.n.vyssotski@intel.com>

(cherry picked from commit 9c3617a8f7413bb1181e72bc1f7086d986a86e18)

Change-Id: If7d705b8417cf29076da9ce19ec54d698f3cb0d5
uick/gen_common.cc
5be30072c5a750617dc3f9380776d074f26d9f32 02-Oct-2014 Andreas Gampe <agampe@google.com> ART: Remove wrong DCHECK

Bug: 17772057
Bug: 17763227
Bug: 17762845

Change-Id: If5d35b8e3e156173f2e47ae86ff48ebfc01ca02d
uick/arm64/int_arm64.cc
228f9251668efe5ab303f9fb78841ed138954acb 01-Oct-2014 Bill Buzbee <buzbee@google.com> Merge "ART: Overflow of bound check in ArrayCopy intrinsic" into lmp-dev
db7239ccce7748f2b494fb3b91c128b37019a093 17-Sep-2014 avignate <aleksey.v.ignatenko@intel.com> ART: Overflow of bound check in ArrayCopy intrinsic

System.arraycopy method is implemented as intrinsic on x86. It has
bound check which has a bug to overflow in certain conditions
when summ of array offset and number elements to be copied are
more than MAX_INT. For the methods like CarArrayBuffer.get it
means no OutOfBound exception to be thrown. The proposed
solution fixed that.

b/17711775

Signed-off-by: avignate <aleksey.v.ignatenko@intel.com>

(cherry picked from commit f9f0ed401f7fe4138a71b36719423b908a3b7bfb)

Change-Id: I1d4ca900df262d483a94ebea8fa686ea361772c8
uick/x86/target_x86.cc
02ff2d4187249d26fabe8e5eacc27b99984ee353 04-Sep-2014 Serguei Katkov <serguei.i.katkov@intel.com> AddIntrinsicSlowPath with resume requires clobbering

AddIntrinsicSlowPath with resume results in a call.
So all temps must be clobbered at the point where
AddIntrinsicSlowPath returns.

(cherry-picked from 9863daf4fdc1a08339edac794452dbc719aef4f1)
Change-Id: If9eb887e295ff5e59920f4da1cef63258ad490b0
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/arm/int_arm.cc
uick/arm64/int_arm64.cc
uick/gen_invoke.cc
uick/x86/target_x86.cc
b504d2f89fdd5c01816bcbad752797cb78de0e99 27-Sep-2014 buzbee <buzbee@google.com> Quick compiler: aarch64 codegen & long_min literal

Int64 overflow during instruction selection caused incorrect
code patterns to emitted in some cases of long operations with
an immediate value of 0x8000000000000000.

The code in question was attempting to determine if the immediate
operand would fit in aarch64 immediate instruction variants.

Internal b/17630605

Change-Id: I8177021b73e51302bc1032387d83b1dd567ed6db
uick/arm64/utility_arm64.cc
db273aa1fc12a0e8a0d5a608df540e5d46a16b78 07-Sep-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86: evaluation destination should be after load of source in RA [DO NOT MERGE]

In almost most cases working with Register Allocator we must first
load source and then evaluate the destination. In this particular case
for byte-code shl-int/2addr v10, v10 we first find a destination (memory)
then load source (v10 -> physical register) and generate a shift operation
on memory. This is ok for this bytecode but RA thinks that v10 is in register
(we loaded source) and this is incorrect because updated value in memory
and physycal register is not up to date.

Change-Id: Ib4c71f70dcbf78b76ca89897e3bd605a89d77d08
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
(cherry picked from commit a464466fea8df617a50055230cfe7a16ea52cc14)
uick/x86/int_x86.cc
bf5d818f7e59ce33521ad81bbab68b1e7a09e0ba 17-Sep-2014 buzbee <buzbee@google.com> ART: skip compilation of huge methods.

Besides not being worthwhile to compile, it huge methods could cause
overflow of some internal compiler structures.

internal b/17524219

Change-Id: I0e47ff4757eec265809598830a2616ac367af77d
rontend.cc
98216e53f8d538b4386b80b896edfa20e9734827 12-Sep-2014 buzbee <buzbee@google.com> Quick compiler (arm64) Fix inline Math.round()

Math.round is detected and inlined for arm64. However, the
arm64 backend incorrectly modified a source operand in place
during the round sequence. Depending on how registers are
allocated, that modification could persist. Changed to use a
temp register for the intermediate result.

Internal b/17411468

Change-Id: I7c636f985e193f8ff838768fde3b741e443bb1bb
uick/arm64/fp_arm64.cc
4e67841e99e4a206133e7010653ccd132682296a 09-Sep-2014 Mathieu Chartier <mathieuc@google.com> Change Reference.get() intrinsic to Reference.getReferent().

The reference intrinsic was incorrectly inlining
PhantomReference.get(). We now get around this by adding a
layer of indirection. Reference.get() now calls getReferent()
which is intrinsified and inlined.

Requires:
https://android-review.googlesource.com/#/c/107100/

Bug: 17429865

(cherry picked from commit cd48f2d86197d4fe87cc88077bc4af5ba66e5295)

Change-Id: Ie91e70abf43cedf3c707c7bb8a5059e19d2a2577
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
57f2bbda741d2d3d769a50268b4e0b9b54959684 04-Sep-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Fix x86_64 GenSelect case when destination is Ref

Reference in x86_64 is a 64-bit solo register. As a result, the invocation
of OpRegImm results in an error when Select opcode of the kind:
ref = boolean ? null : null;
because opRegImm does not support 64-bit destination for OpMov.

The case above is only possible for ref because no one other constant except
null is possible.

Bug: 17327895
Change-Id: I7541e744ec1c8619711712fd17be72764efcf3a8
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
(cherry picked from commit 3f51e7d942c22edaab3a7e703a1e6a2dd6a26f77)
uick/x86/int_x86.cc
ff4cfe07009ac0b0f07475ef2aa91d9aaf9ab291 30-Aug-2014 Junmo Park <junmoz.park@samsung.com> Fix SetupResourceMasks to pass correct parameters

Calling SetupTargetResourceMasks function with correct parameter.
SetupTargetResourceMasks(lir, flags, use_mask, def_mask) is correct order.

b/17369806

(cherry-picked from commit sha 2a09504334a3a3b4c47100197df0827cc6740433)

Change-Id: I49118c3f2d3d06fac83fa3d5014b7fdaff6a2b00
uick/mir_to_lir-inl.h
f72fd02c4ea0f1aa610b8a4f9f51ef86c285b1cf 03-Sep-2014 buzbee <buzbee@google.com> Merge "Quick compiler: disable GVN DO NOT MERGE" into lmp-dev
4c4f4daafbac15b856da91118d9ea55c9eefa54b 03-Sep-2014 buzbee <buzbee@google.com> Quick compiler: disable GVN DO NOT MERGE

Disable global value numbering optimization for lmp (but
keep on for master).

b/16398693

Change-Id: I125c588c987a81db54a15da1eec9dee2b009956f
rontend.cc
4d05d931d3d608f5047e0d9dfb422df018ace716 03-Sep-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix read-out-of-bounds in the compiler" into lmp-dev
b41b93a2b7916fb56b50cc6180d80e8d86d78433 28-Aug-2014 buzbee <buzbee@google.com> Quick compiler: Fix MIPS build

b/16484538

In debug builds, the Quick compiler frequently runs a sanity checker
over the register pool. Among other things, it attempts to verify
consistent representation of register pairs. However, a register's
"wide" flag is meaningful only when the register pair is associated
with a Dalvik wide value (sreg != INVALID_SREG) rather than a temp
wide value.

The MIPS build was tripping over this bad assertion. Fixed here.

Note related cl/105461

(cherry-picked from commit sha 3a658077af2a931e5d7f6cd22b777c57112c19df)

Change-Id: Id726ff1ea0f5cbcc8dba6fa3aacb3fd4fc043a63
uick/ralloc_util.cc
ade731854d18839823e57fb2d3d67238c5467d15 27-Aug-2014 Andreas Gampe <agampe@google.com> ART: Fix read-out-of-bounds in the compiler

In case of a wide dalvik register, asking for the constant value
can lead to a read out of bounds.

Bug: 17302671
Change-Id: Ie1849cd67cc418c97cbd7a8524f027f9b66e4c96
ir_graph.h
uick/codegen_util.cc
28b066ad8baa23f918e99d2e9b4771c00b5a3eca 25-Aug-2014 buzbee <buzbee@google.com> Quick compiler: fix DCHECK

A DCHECK intended to verify the soundness of the mapping between
a wide Dalvik value and a pair of temp registers incorrectly fired
when the temp register pair was associated with a wide temporary
(i.e. - when (SReg() == INVALID_SREG)).

In this particular situation, the wideness flag is meaningful only when
there is an associated valid vreg. Code rearranged to only perform
the DCHECK and reset the partner's wideness bit when we're dealing with
a live wide value.

b/16484538

Change-Id: I3b8a7bebc5d918c65ea56ae8db0a8a5cd8003386
uick/ralloc_util.cc
a846c1ac65b197844380b8d28377a850dfa1fc94 20-Aug-2014 Vladimir Marko <vmarko@google.com> Merge "X86: Fix alias info in GenInlinedIndexOf()." into lmp-dev
b5874a47a4d2c4d2971116b031b4068021ffda05 19-Aug-2014 Vladimir Marko <vmarko@google.com> X86: Fix alias info in GenInlinedIndexOf().

For 32-bit X86, GenInlinedIndexOf() pushes and pops EDI. In
one branch it then calls Load32Disp() with adjusted stack
offset. That calculates wrong alias_info for the generated
insn. If left unfixed, this could confuse load hoisting.

Bug: 17128502

(cherry picked from commit 74de63bb1cc275b411cae28a96f9b3a78b939bc2)

Change-Id: I5dc82b7aae9e9655e75843a952b8ebb04269f46b
uick/x86/target_x86.cc
c6a62592836612b09ff1a8021e49b1328d85493b 20-Aug-2014 buzbee <buzbee@google.com> Merge "Quick compiler: fix Arm64 inline locking code" into lmp-dev
ebc56bd68743dfffcfeb04f938181b18efaed85c 20-Aug-2014 buzbee <buzbee@google.com> Quick compiler: fix Arm64 inline locking code

The Arm64 monitor enter code was incorrectly comparing the
thread ID to zero rather than the lock value to determine if the
inline fast path was doable. As a result, we ended up always
using the out-of-line case.

This fix delivers a 6% improvement to DeltaBlue.

b/16707253

Change-Id: I499530da84beecf1f3f5c5ebb666e3eb12599ac0
uick/arm64/call_arm64.cc
dfa7a6c8711623bf20aad58f57ae980b497ef4d7 18-Aug-2014 Vladimir Marko <vmarko@google.com> Disable load/store elimination. DO NOT MERGE

The optimization has several issues and it has been
effectively disabled by
https://android-review.googlesource.com/103511
Disable it completely to avoid wasting compilation time.

Bug: 16862804
Change-Id: I42f69ae64170dc44f5fd6455b6a51c9bd3f93672
rontend.cc
03c9785a8a6d712775cf406c4371d0227c44148f 14-Aug-2014 Dave Allison <dallison@google.com> Revert "Revert "Reduce stack usage for overflow checks""

Fixes stack protection issue.
Fixes mac build issue.

This reverts commit 83b1940e6482b9d8feba5c492507735686650ea5.

Change-Id: I7ba17252882b23a740bcda2ea94aacf398255406
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mips/call_mips.cc
uick/x86/call_x86.cc
e470a02792ce584fe0ff1b9a7dd6aebe62ca9be5 14-Aug-2014 Vladimir Marko <vmarko@google.com> Merge "Fix intrinsic Math.abs(double) for ARM." into lmp-dev
397297f92ff3004cfcd623690d98bc49edf8c032 14-Aug-2014 Vladimir Marko <vmarko@google.com> Fix intrinsic Math.abs(double) for ARM.

Bug: 16930909

(cherry picked from commit a5f90b6f0f5b33487e71eaeb05508555f17dcf30)

Change-Id: I3ee40ffbeeabf53c72ea5781d02cda1b92b13289
uick/arm/fp_arm.cc
83b1940e6482b9d8feba5c492507735686650ea5 14-Aug-2014 Dave Allison <dallison@google.com> Revert "Reduce stack usage for overflow checks"

This reverts commit 63c051a540e6dfc806f656b88ac3a63e99395429.

Change-Id: I282a048994fcd130fe73842b16c21680053c592f
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mips/call_mips.cc
uick/x86/call_x86.cc
63c051a540e6dfc806f656b88ac3a63e99395429 26-Jul-2014 Dave Allison <dallison@google.com> Reduce stack usage for overflow checks

This reduces the stack space reserved for overflow checks to 12K, split
into an 8K gap and a 4K protected region. GC needs over 8K when running
in a stack overflow situation.

Also prevents signal runaway by detecting a signal inside code that
resulted from a signal handler invokation. And adds a max signal count to
the SignalTest to prevent it running forever.

Also reduces the number of iterations for the InterfaceTest as this was
taking (almost) forever with the --trace option on run-test.

Bug: 15435566

Change-Id: Id4fd46f22d52d42a9eb431ca07948673e8fda694

Conflicts:
compiler/optimizing/code_generator_x86_64.cc
runtime/arch/x86/fault_handler_x86.cc
runtime/arch/x86_64/quick_entrypoints_x86_64.S
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mips/call_mips.cc
uick/x86/call_x86.cc
c739de01b905729b8587003a52a55b62358e979d 13-Aug-2014 Ian Rogers <irogers@google.com> Merge "Avoid use of std::string where we have const char*." into lmp-dev
cb6b0f31ede2275e79e6199ec391147585a37a2a 12-Aug-2014 Ian Rogers <irogers@google.com> Avoid use of std::string where we have const char*.

Removing the ClassHelper caused std::string creation for all calls to
Class::GetDescriptor and a significant performance regression. Make the
std::string an out argument so the caller can maintain it and its life time
while allowing GetDescriptor to return the common const char* case.

Don't generate GC maps when compilation is disabled.

Remove other uses of std::string that are occuring on critical paths.
Use the cheaper SkipClass in CompileMethod in CompilerDriver.
Specialize the utf8 as utf16 comparison code for the common shorter byte
encoding.
Force a bit of inlining, remove some UNLIKELYs (they are prone to pessimizing
code), add some LIKELYs.

x86-64 host 1-thread interpret-only of 57 apks:
Before: 29.539s
After: 23.467s

Regular compile:
Before: 1m35.347s
After: 1m20.056s

Bug: 16853450
Change-Id: Ic705ea24784bee24ab80084d06174cbf87d557ad

Conflicts:
runtime/utils.cc
rontend.cc
erification_results.cc
erification_results.h
b0f05b9654eb005bc8c8e15f615a7f5a312f640c 17-Jul-2014 Dave Allison <dallison@google.com> Add implicit checks for x86_64 architecture.

This combines the x86 and x86_64 fault handlers into one. It also
merges in the change to the entrypoints for X86_64.

Replaces generic instruction length calculator with one that only
works with the specific instructions we use.

Bug: 16256184

Change-Id: I1e8ab5ad43f46060de9597615b423c89a836035c
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/x86/target_x86.cc
8c18c2aaedb171f9b03ec49c94b0e33449dc411b 06-Aug-2014 Andreas Gampe <agampe@google.com> ART: Generate chained compare-and-branch for short switches

Refactor Mir2Lir to generate chained compare-and-branch sequences
for short switches on all architectures.

Bug: 16241558

(cherry picked from commit 48971b3242e5126bcd800cc9c68df64596b43d13)

Change-Id: I0bb3071b8676523e90e0258e9b0e3fd69c1237f4
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/gen_common.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
fa9c8ec37c66574654e448513e1bb59af7cb9365 07-Aug-2014 Zheng Xu <zheng.xu@arm.com> Add arraycopy intrinsic for arm and arm64.

Implement intrinsic for
java.lang.System.arraycopy(char[], int, char[], int, int).

Bug: 16241558

(cherry picked from commit 947717a2b085f36ea007ac64f728e19ff1c8db0b)

Change-Id: I8199f5c9ce9827f869f0f93aaff7ec359a84d922
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
7204c04dd86ae8ce05690e38737b2abf017a0a69 11-Jun-2014 Stuart Monteith <stuart.monteith@arm.com> AArch64: Implicit StackOverflow/NPE/Suspend checks.

This implements implicit stack overflow checks and null pointer exceptions
for AArch64. Suspend checks are implemented but not switched on yet.

Bug: 16256184
Change-Id: I2eb076f2c0c9d94793d5a898fea49cf409b4eb66
Signed-off-by: Stuart Monteith <stuart.monteith@arm.com>
uick/arm64/call_arm64.cc
a7894cdb063edb88f1420a42207e0c4bd27ab4f9 06-Aug-2014 Dave Allison <dallison@google.com> Fix checks for kLiteral in local optimizations.

The check for kLiteral (literal load) just checked the kLiteral
bit in the def mask. The kEncodeAll mask has the kLiteral bit
set so this check was triggering. The fix is to check for
only the kLiteral bit being set and no other special bits.

The semantics of the special bits in the use/def mask is that
only one of them can be set at the same time.

Bug: 16824330

Change-Id: I0f1c1157e017870414ffef11767e5433d1fd4401
uick/local_optimizations.cc
4b6d27c2079e246cdeb56dca6648539a16493dca 05-Aug-2014 Ian Rogers <irogers@google.com> Merge "x86: Fix assembler for Pextr"
f768db4c1cb7ec9374e203305cf3582f32147302 05-Aug-2014 Ian Rogers <irogers@google.com> Merge "X86: Assembler: Correct r8_form for some cases"
f6e8d0304d0b0024f1af8e63c2a3a3ad78761d59 05-Aug-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Load double constant using core register"
0e63ce19bdb04d31180d7eb4a8bf6605333ade5a 10-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> x86_64: Load double constant using core register

This changes the double const loading scheme for x86_64 in order to
reduce number of memory accesses.

Change-Id: If6ee34b890287ed616ca4ea5d1c13f06a06293a9
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/utility_x86.cc
8081d2b8d7a743729557051d0294e040e61c747a 31-Jul-2014 Vladimir Marko <vmarko@google.com> Create allocator adapter for using Arena in std containers.

Create ArenaAllocatorAdapter, similar to the existing
ScopedArenaAllocatorAdapter, for allocating memory for
standard containers via the ArenaAllocator. Add the ability
to specify allocation kind rather than just kArenaAllocSTL
to both adapters. Move the scoped arena allocator to the
scoped_arena_containers.h header file.

Define template aliases for containers using the new adapter
and change a few MIRGraph and Mir2Lir members to use them.

Change-Id: I9bbc50248e0fed81729497b848cb29bf68444268
ir_graph.cc
ir_graph.h
uick/codegen_util.cc
uick/mir_to_lir.h
6175442a246cded6a9caae4658a0a1dc7cf49071 05-Aug-2014 Brian Carlstrom <bdc@google.com> Merge changes Ibe92d8b5,I9bada598

* changes:
Make system use patchoat to relocate during runtime.
Temporary fix for bad LIR generation in GenInlinedGet.
eb76e11d836ea953b4e40a28e3e69d3b0f4c86fa 30-Jul-2014 Alex Light <allight@google.com> Temporary fix for bad LIR generation in GenInlinedGet.

In GenInlinedGet we will sometimes try to load a class directly. If
we are doing that and find one, but cannot get the direct pointer
(due to image compilation or including patch information) we might
end up generating incorrect patching code due to the changing of the
cu_->dex_file attribute.

Bug: 16656190
Change-Id: I9bada598bf4fd972d6164163eedd4a496da306d6
uick/gen_invoke.cc
5a5e85693b1d5952d88377be5826068b67b0dcec 18-Jul-2014 DaniilSokolov <daniil.y.sokolov@intel.com> ART: Enable x86_64 bit support for intrinsic for System.arraycopy(char[], ..)

Implements x86_64 support for intrinsic for java.lang.System.arraycopy(char[], int, char[], int, int).

With this fix the intrinsic works on x86 and x86_64 architectures.

Change-Id: Icc2889ccd0cf7d821522abb7437893e3149e7c99
Signed-off-by: Daniil Sokolov <daniil.y.sokolov@intel.com>
uick/x86/target_x86.cc
c76c614d681d187d815760eb909e5faf488a3c35 05-Aug-2014 Andreas Gampe <agampe@google.com> ART: Refactor long ops in quick compiler

Make GenArithOpLong virtual. Let the implementation in gen_common be
very basic, without instruction-set checks, and meant as a fall-back.
Backends should implement and dispatch to code for better implementations.
This allows to remove the GenXXXLong virtual methods from Mir2Lir, and
clean up the backends (especially removing some LOG(FATAL) implementations).

Change-Id: I6366443c0c325c1999582d281608b4fa229343cf
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
2bc477043b6ab2d7b4719ba8debf0a6a5b10c225 31-Jul-2014 Mark Mendell <mark.p.mendell@intel.com> Set REG0_USED on X86 Set8R instruction

Since this instruction only affects the low byte of the register, it is
preceded by an XOR to zero the upper 3 bytes. Set8R isn't marked as
using operand 0 as an input. In practice, this works for now, as the
Xor sets the CC and Set8R uses the CC (although not that of the Xor, but
of a Cmp generally).

This just marks REG0 as using the previous contents of the register, as
it is modifying only 1 byte of 4.

Change-Id: I7a69cbdb06979da5d5d2ae17fabd7c22c5a17701
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
cf8184164650d7686b9f685850463f5976bc3251 24-Jul-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Fix Test32RM

This patch fixes Test32RM use flags and the format.

Change-Id: I486cb7f27e65caeefccbd3bbcc38257ddca033c8
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/x86/assemble_x86.cc
c763e350da562b0c6bebf10599588d4901140e45 04-Jul-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: Implement InexpensiveConstant methods.

Implement IsInexpensiveConstant and friends for A64.
Also extending the methods to take the opcode with respect to which
the constant is inexpensive. Additionally, logical operations (i.e.
and, or, xor) can now handle the immediates 0 and ~0 (which are not
logical immediates).

Change-Id: I46ce1287703765c5ab54983d13c1b3a1f5838622
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
2eba1fa7e9e5f91e18ae3778d529520bd2c78d55 31-Jul-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Add inlining support for ceil(), floor(), rint(), round()

This patch adds inlining support for the following Math, StrictMath
methods in the ARM64 backend:
* double ceil(double)
* double floor(double)
* double rint(double)
* long round(double)
* int round(float)

Also some cleanup.

Change-Id: I9f5a2f4065b1313649f4b0c4380b8176703c3fe1
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/utility_arm64.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
6bbf0967d217ab2b7bdbb78bfd076b8fb07a44e8 14-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: Implement the easy long division/remainder by a constant

Also optimizes long/int divisions by power-of-two values.

Also do some clean-up.

Change-Id: Ie414e64aac251c81361ae107d157c14439e6dab5
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
77a5b50148633c2651edb7f35f5254e40cc878dc 04-Aug-2014 Andreas Gampe <agampe@google.com> Merge "AArch64: Remove unnecessary work around for sp."
cedee4744c2d4f3611a7bb9fe98ef1bf4c37d915 01-Jul-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Remove unnecessary work around for sp.

Use RegRegRegExtend to encode instruction for "sub/add sp, sp, Xm".

Change-Id: I13d3d2d386a7bd827e1396f291a7dcb9bffd5a29
uick/arm64/codegen_arm64.h
uick/arm64/utility_arm64.cc
7906b25f79f24af3a8b8eee0454b4db1278b9b77 04-Aug-2014 Andreas Gampe <agampe@google.com> Merge "ART: Rework ARM64 entry sequence"
f29ecd69af2743a425314baa4abd6c44d8d88649 29-Jul-2014 Andreas Gampe <agampe@google.com> ART: Rework ARM64 entry sequence

Try to fold one sub of SP in the ARM64 entry sequence. When the
framesize is small, generate a sub over the full frame-size, and
adjust the spill offsets accordingly. If the framesize is too
large, use a pre-indexed store and fill upwards from there.

Change-Id: I1c15ac6276fb62b8164372de02fd92437f605938
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
89c210bf418a152ccabfbbf853ddcce33aea450d 31-Jul-2014 Bill Buzbee <buzbee@android.com> Merge "Revert "Revert "Enable Load Store Elimination for ARM and ARM64"""
fd0c237e7d80ad567399e760203f3cda404bf4c5 31-Jul-2014 Mark Mendell <mark.p.mendell@intel.com> X86: Assembler: Correct r8_form for some cases

Set r8_form to false for instruction formats that don't reference
registers.

Change-Id: Ib01edef4ef7f22de25a31dc4207889bff97d163d
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
00d1ef41d0d0d438d604d102183a6bfac58643e7 31-Jul-2014 Bill Buzbee <buzbee@android.com> Merge "ART: LoadConstWide should clobber temp reg"
54659e3a2c83d3949957a10436e55e525a430a15 30-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: LoadConstWide should clobber temp reg

If we have 2+ LoadConstWide(FP) calls in one method it is possible
that LoadConstWide will load the method poiner only once. In some
cases, for example, if we have branches, initialization might not be
done and it may lead to a segmentation fault.

Change-Id: If45fc2d1109d7ce9bd272f5c56446b2a6884daac
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/utility_x86.cc
7da9586b559290e1c16207c6513ffe485de61655 30-Jul-2014 Hiroshi Yamauchi <yamauchi@google.com> Add read barriers for the roots in the verifier.

Note: Because the roots (the class references in RegType objects) can
be updated by the read barriers, a lot of uses of type "const RegType"
were replaced with "RegType".

Bug: 12687968
Change-Id: I6cf37a87f352938d43fb51560a8d927ada104f50
erified_method.cc
b19955d3c8fbd9588f7e17299e559d02938154b6 29-Jul-2014 Vladimir Marko <vmarko@google.com> Reduce time and memory usage of GVN.

Filter out dead sregs in GVN. Reclaim memory after each LVN
in the GVN modification phase.

Bug: 16398693
Change-Id: I8c88c3009663754e1b66c0ef3f62c3b93276e385
rontend.cc
lobal_value_numbering.cc
lobal_value_numbering.h
lobal_value_numbering_test.cc
ocal_value_numbering.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_optimization.cc
bda2722ba62e5be9f9fd6a6eb0db8259bb383629 31-Jul-2014 Andreas Gampe <agampe@google.com> ART: Build fix

Make lint happy, as comments should be separated from code.

Change-Id: I4bfd88357302be9a6a104f1152e3b1fda386371e
uick/x86/target_x86.cc
cc75c1b38e811cc1cb93ce8f8fcc9a83e20844fb 31-Jul-2014 Ian Rogers <irogers@google.com> Merge "1. Fix CFI for quick compiled code in x86 & x86_64; 2. Emit CFI in .eh_frame instead of .debug_frame."
35e1e6ad4b50f1adbe9f93fe467766f042491896 30-Jul-2014 Tong Shen <endlessroad@google.com> 1. Fix CFI for quick compiled code in x86 & x86_64;
2. Emit CFI in .eh_frame instead of .debug_frame.

With CFI, we can correctly unwind past quick generated code.
Now gdb should unwind to main() for both x86 & x86_64 host-side ART.

Note that it does not work with relocation yet.

Testing:
1. art/test/run-test --host --gdb [--64] --no-relocate 005
2. In gdb, run 'b art_quick_invoke_stub', then 'r', then 'c' a few times
3. In gdb, run 'bt'. You should see stack frames down to main()

Change-Id: I5350d4097dc3d360a60cb17c94f1d02b99bc58bb
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
aa910d5ef43256102809e397de305c23f1c315e6 31-Jul-2014 Andreas Gampe <agampe@google.com> ART: Fix verifier mishandling erroneous array component types

The verifier must not assume that component types are not erroneous.

Bug: 16661259
Change-Id: I23b2f517259ca9c0b8a1aa38f6348fcd61e0b22e
uick/gen_common.cc
63999683329612292d534e6be09dbde9480f1250 15-Jul-2014 Serban Constantinescu <serban.constantinescu@arm.com> Revert "Revert "Enable Load Store Elimination for ARM and ARM64""

This patch refactors the implementation of the LoadStoreElimination
optimisation pass. Please note that this pass was disabled and not
functional for any of the backends.

The current implementation tracks aliases and handles DalvikRegs as well
as Heap memory regions. It has been tested and it is known to optimise
out the following:
* Load - Load
* Store - Load
* Store - Store
* Load Literals

Change-Id: I3aadb12a787164146a95bc314e85fa73ad91e12b
ompiler_enums.h
rontend.cc
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/local_optimizations.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
eg_storage.h
1c7c3990fe5fc5f1afe74f3d94e95015d7419186 30-Jul-2014 Andreas Gampe <agampe@google.com> ART: Remove bogus dcheck

Mea culpa.

Change-Id: I6fd3b678e30354c5ab5ec6da5b3619c26d486563
uick/gen_invoke.cc
984305917bf57b3f8d92965e4715a0370cc5bcfb 28-Jul-2014 Andreas Gampe <agampe@google.com> ART: Rework quick entrypoint code in Mir2Lir, cleanup

To reduce the complexity of calling trampolines in generic code,
introduce an enumeration for entrypoints. Introduce a header that lists
the entrypoint enum and exposes a templatized method that translates an
enum value to the corresponding thread offset value.

Call helpers are rewritten to have an enum parameter instead of the
thread offset. Also rewrite LoadHelper and GenConversionCall this way.
It is now LoadHelper's duty to select the right thread offset size.

Introduce InvokeTrampoline virtual method to Mir2Lir. This allows to
further simplify the call helpers, as well as make OpThreadMem specific
to X86 only (removed from Mir2Lir).

Make GenInlinedCharAt virtual, move a copy to X86 backend, and simplify
both copies. Remove LoadBaseIndexedDisp and OpRegMem from Mir2Lir, as they
are now specific to X86 only.

Remove StoreBaseIndexedDisp from Mir2Lir, as it was only ever used in the
X86 backend.

Remove OpTlsCmp from Mir2Lir, as it was only ever used in the X86 backend.

Remove OpLea from Mir2Lir, as it was only ever defined in the X86 backend.

Remove GenImmedCheck from Mir2Lir as it was neither used nor implemented.

Change-Id: If0a6182288c5d57653e3979bf547840a4c47626e
ompiler_enums.h
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
c32447bcc8c36ee8ff265ed678c7df86936a9ebe 27-Jul-2014 Bill Buzbee <buzbee@android.com> Revert "Enable Load Store Elimination for ARM and ARM64"

On extended testing, I'm seeing a CHECK failure at utility_arm.cc:1201.

This reverts commit fcc36ba2a2b8fd10e6eebd21ecb6329606443ded.

Change-Id: Icae3d49cd7c8fcab09f2f989cbcb1d7e5c6d137a
ompiler_enums.h
rontend.cc
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/local_optimizations.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
eg_storage.h
fcc36ba2a2b8fd10e6eebd21ecb6329606443ded 15-Jul-2014 Serban Constantinescu <serban.constantinescu@arm.com> Enable Load Store Elimination for ARM and ARM64

This patch refactors the implementation of the LoadStoreElimination
optimisation pass. Please note that this pass was disabled and not
functional for any of the backends.

The current implementation tracks aliases and handles DalvikRegs as well
as Heap memory regions. It has been tested and it is known to optimise
out the following:
* Load - Load
* Store - Load
* Store - Store
* Load Literals

Change-Id: Iefae9b696f87f833ef35c451ed4d49c5a1b6fde0
ompiler_enums.h
rontend.cc
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/local_optimizations.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
eg_storage.h
a65d63e4eb81605fd798f1ca038d651b0faa29eb 27-Jul-2014 Bill Buzbee <buzbee@android.com> Merge "SetConstantWide should mark both SSA regs as constant"
5e3f45bdb987ba7fe7a4114cb5fe8483432015b6 27-Jul-2014 Bill Buzbee <buzbee@android.com> Merge "ART: ReEnable check for a gap between method's arg "in" vregs and rest of its vregs"
b07c1f9f4d6088ca2d4c1a10819e57b19acf7f22 26-Jul-2014 Andreas Gampe <agampe@google.com> ART: Special-case cb(n)z even for in-reg constant

Call out to OpCmpImmBranch in GenCompareAndBranch if the constant
is zero and we are testing == or !=, even when zero has been loaded
to a register already. This avoids a register size mismatch on 64b
architectures when basically doing a null check, and generally
squashes a cmp + branch to a cbz or cbnz on Arm and Mips. X86 is
not degraded.

Bug: 16562601
Change-Id: I1997760f43dc186a84247ad30ae91053f71d102d
uick/gen_common.cc
688e7c5c9f36573dd4da2edd889470d930b0054b 15-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: ReEnable check for a gap between method's arg "in" vregs and rest of its vregs

The Quick backend's runtime model includes a gap between a method's
argument ("in") vregs and the rest of its vregs. Handling a range instruction
which spans the gap is somewhat complicated, and should not happen
in normal usage of dx. Punt to the interpreter if it happened.

This issue relates to https://code.google.com/p/android/issues/detail?id=66371
Which was fixed, but the problem returned after some changes in the verify
flags set for the range bytecodes.

Change-Id: I214f32e7b4227a450257f30607135930d0adff53
Signed-off-by: Katkov, Serguei I <serguei.i.katkov@intel.com>
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
ir_graph.cc
b551fdcda9eb128c80de37c4fb978968bec6d4b3 25-Jul-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Clean up CalleeSaveMethod frame and the use of temp registers.

CalleeSaveMethod frame size changes :
SaveAll : 368 -> 176
RefOnly : 176 -> 96
RefsAndArgs : 304 -> 224

JNI register spill size changes :
160 -> 88

In the transition assembly, use registers following the rules:
1. x0-x7 as temp/argument registers.
2. IP0, IP1 as scratch registers.
3. After correct type of callee-save-frame has been setup, all registers
are scratch-able(probably except xSELF and xSUSPEND).
4. When restore callee-save-frame, IP0 and IP1 should be untouched.
5. From C to managed code, we assume all callee save register in AAPCS
will be restored by managed code except x19(SUSPEND).

In quick compiler:
1. Use IP0, IP1 as scratch register.
2. Use IP1 as hidden argument register(IP0 will be scratched by
trampoline.)

Change-Id: I05ed9d418b01b9e87218a7608536f57e7a286e4c
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/target_arm64.cc
75c99e9dd8512a44d97d9818a74a69065ad82df0 24-Jul-2014 Andreas Gampe <agampe@google.com> Merge "x86: GenSelect utility update"
9ee4519afd97121f893f82d41d23164fc6c9ed34 17-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86: GenSelect utility update

The is follow-up https://android-review.googlesource.com/#/c/101396/
to make x86 GenSelectConst32 implementation complete.

Change-Id: I69f318e18093f9a5b00f8f00f0f1c2e4ff7a9ab2
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
55fff044d3a4f7196098e25bab1dad106d9b54a2 10-Jul-2014 Vladimir Marko <vmarko@google.com> Rewrite topological sort order and improve GVN.

Rewrite the topological sort order to include a full loop
before the blocks that go after the loop. Add a new iterator
class LoopRepeatingTopologicalSortIterator that differs from
the RepeatingTopologicalSortIterator by repeating only loops
and repeating them early. It returns to the loop head if the
head needs recalculation when we reach the end of the loop.

In GVN, use the new loop-repeating topological sort iterator
and for a loop head merge only the preceding blocks' LVNs
if we're not currently recalculating this loop.

Also fix LocalValueNumbering::InPlaceIntersectMaps() which
was keeping only the last element of the intersection, avoid
some unnecessary processing during LVN merge and add some
missing braces to MIRGraph::InferTypeAndSize().

Bug: 16398693
Change-Id: I4e10d4acb626a5b8a28ec0de106a7b37f9cbca32
b_optimizations.h
ataflow_iterator-inl.h
ataflow_iterator.h
lobal_value_numbering.cc
lobal_value_numbering.h
lobal_value_numbering_test.cc
ocal_value_numbering.cc
ir_graph.cc
ir_graph.h
ir_graph_test.cc
ir_optimization.cc
ir_optimization_test.cc
ass_driver_me.h
ass_me.h
reg_analysis.cc
7c66c8dffeb299743e6180b36a74018fa563ab44 23-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Fix null pointer check elimination for catch entries."
0a810d2eab27cd097ebd09a44f0ce83aa608285b 11-Jul-2014 Vladimir Marko <vmarko@google.com> Fix null pointer check elimination for catch entries.

Remove the special treatment of catch blocks for null
pointer check elimination and class initialization check
elimination. In both cases this can help optimizing
previously missed cases. In the null check case, this
avoids incorrect optimization as exposed by the new test.

Bug: 16230771
Change-Id: I834b7a1835d9ca8572f4f8d8516d93913c701ad1
ir_optimization.cc
ir_optimization_test.cc
35690630b82dc1dbf4a7ada37225893a550ea1e0 16-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86: Fix assembler for Pextr

Pextr family instructions use r/m part of rmod byte as destination.
This should be handled appropriately.
Disassembler works correctly.

Change-Id: I89d00cb11ae792e9d28c178ba79a0bc1fa27e3c5
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/assemble_x86.cc
597da1f76e542b9699f8e5f8cacfea84f8854429 15-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> SetConstantWide should mark both SSA regs as constant

Without this change user have no chances to get the highest part
of wide reg using utility functions.

Change-Id: I2f56229ffb98276768a77c1e4a2913f288999328
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
ir_optimization.cc
a59dd80f9f48cb750d329d4d4af2d99d72b484d1 03-Jul-2014 Alex Light <allight@google.com> Runtime can now be set to require relocation

Add a pair of runtime flags -Xrelocate and -Xnorelocate that can force
the runtime to require that all files that are run are relocated, to
prevent attacks based on the known art base address.

Add support for running patchoat on oat files compiled without an image.

Change run-test to have new --prebuild and --relocate flags.

Bug: 15358152

Change-Id: I91166c62dd1ab80e5cbcb7883a2cd0d56afca32d
uick_compiler_callbacks.h
e10a0bd05b195f71cc0ff2d59568d02d29939927 22-Jul-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Stack overflow checks and NPE checks for optimizing."
f12feb8e0e857f2832545b3f28d31bad5a9d3903 17-Jul-2014 Nicolas Geoffray <ngeoffray@google.com> Stack overflow checks and NPE checks for optimizing.

Change-Id: I59e97448bf29778769b79b51ee4ea43f43493d96
uick/mir_to_lir.h
7ea6f79bbddd69d5db86a8656a31aaaf64ae2582 15-Jul-2014 Andreas Gampe <agampe@google.com> ART: Throw StackOverflowError in native code

Initialize stack-overflow errors in native code to be able to reduce
the preserved area size of the stack.

Includes a refactoring away from constexpr in instruction_set.h to allow
for easy changing of the values.

Change-Id: I117cc8485f43da5f0a470f0f5e5b3dc3b5a06246
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mir_to_lir.h
2983d230534aee99090d28b2666dae094440f1c4 22-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Use vabs/fabs on arm/arm64 for intrinsic abs()."
5030d3ee8c6fe10394912ede107cbc8df63b7b16 17-Jul-2014 Vladimir Marko <vmarko@google.com> Use vabs/fabs on arm/arm64 for intrinsic abs().

Bug: 11579369
Change-Id: If09da85e22786faa13a2d74f62cee68ea67bd087
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
e72ff8022968b23efedc56c0afdc1d24e8a928c2 18-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Do not attempt to compile a method with too many registers"
0d8ea4661c584fc095129f853d0d72b0fa09cda5 18-Jul-2014 Andreas Gampe <agampe@google.com> ART: Do not attempt to compile a method with too many registers

The mir_graph has a hard limit on how many ssa registers it can
handle, and will silently fail or fatal out in debug builds when
more SSA registers are necessary. This adds a check in the frontend
that tries to catch some of these cases, and makes the DCHECK a
CHECK to not silently fail.

Bug: 16018097
Change-Id: Iad82178945a8f8c34943cc7573fd73d2b4decade
rontend.cc
ir_graph.h
72b660ec5df56cad8ff6d526b4377a462fc53ce5 18-Jul-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Fix GenDalvikArgsRange for 64-bit ref"
8e3acdd132aef1391676a5db2696804900aacd8e 14-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Fix GenDalvikArgsRange for 64-bit ref

32-bit virtual register can be in 64-bit solo register.
So we should not compute the size of virtual register
basing on size of phyical register.

Change-Id: I4e11be13df8469be63808d0ce9d1ca6f80bef483
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/target_x86.cc
c3561ae381960cbd52a83b7591504f158ec06920 17-Jul-2014 nikolay serdjuk <nikolay.y.serdjuk@intel.com> Improved implementation of inline of String.indexOf

This version pushes EDI only once and only in 32-bit mode.

Change-Id: I4e871d3531ac539536f8f53ec09ffb664409c9cc
uick/x86/target_x86.cc
03fc5abc4c6372c4583179d35e56f6d521806698 18-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: inline Math.Max/Min (float and double)"
fd60fbcce909655aad71fa3094aa51d49302f19f 18-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Fix GVN to handle normal paths leading to catch entry."
11ca61259be6ec8e03eaff1e98905232728b3d45 17-Jul-2014 Vladimir Marko <vmarko@google.com> Fix GVN to handle normal paths leading to catch entry.

When the catch block is empty, the catch entry is actually
the normal path block after the try block. Fix the LVN
merge for catch entries that didn't expect it during GVN.

Bug: 16360024
Change-Id: I9adfc3445245d3fa3c4809d4df1b7b76fbef5ff2
lobal_value_numbering_test.cc
ocal_value_numbering.cc
1222c96fafe98061cfc57d3bd115f46edb64e624 15-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: inline Math.Max/Min (float and double)

This implements the inlined version of Math.Max/Min intrinsics.

Change-Id: I2db8fa7603db3cdf01016ec26811a96f91b1e6ed
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
Signed-off-by: Shou, Yixin <yixin.shou@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
fb8a07bdf92ab097c1d309a8a6b70dacc81f4478 17-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Refactor GenSelect, refactor gen_common accordingly"
90969af6deb19b1dbe356d62fe68d8f5698d3d8f 16-Jul-2014 Andreas Gampe <agampe@google.com> ART: Refactor GenSelect, refactor gen_common accordingly

This adds a GenSelect method meant for selection of constants. The
general-purpose GenInstanceof code is refactored to take advantage of
this. This cleans up code and squashes a branch-over on ARM64 to a
cset.

Also add a slow-path for type initialization in GenInstanceof.

Change-Id: Ie4494858bb8c26d386cf2e628172b81bba911ae5
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
30ab8a8a6597962adf63f3a438ec34b754cc117e 17-Jul-2014 Andreas Gampe <agampe@google.com> ART: Lock an arg reg in GenInlinedGet

Must lock an explicit target register so that it doesn't get used
for a temp and clobbered.

Bug: 16352802
Change-Id: I9e4ac76f92460cdbe59392989d12f8d0321cc624
uick/gen_invoke.cc
9791bb427fd812c1268edab6fb3ac7b82ad9fb93 17-Jul-2014 Jeff Hao <jeffhao@google.com> Merge "Fix art test failures for Mips."
69dfe51b684dd9d510dbcb63295fe180f998efde 11-Jul-2014 Dave Allison <dallison@google.com> Revert "Revert "Revert "Revert "Add implicit null and stack checks for x86""""

This reverts commit 0025a86411145eb7cd4971f9234fc21c7b4aced1.

Bug: 16256184
Change-Id: Ie0760a0c293aa3b62e2885398a8c512b7a946a73
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
d9cb8ae2ed78f957a773af61759432d7a7bf78af 09-Jul-2014 Douglas Leung <douglas@mips.com> Fix art test failures for Mips.

This patch fixes the following art test failures for Mips:
003-omnibus-opcodes
030-bad-finalizer
041-narrowing
059-finalizer-throw

Change-Id: I4e0e9ff75f949c92059dd6b8d579450dc15f4467
Signed-off-by: Douglas Leung <douglas@mips.com>
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
22d5e735f403c57525fe868304c7123f0ce66399 16-Jul-2014 Ian Rogers <irogers@google.com> Remove object_utils.h.

Break into object_lock, field_helper and method_helper.
Clean up header files following this.
Also tidy some of the Handle code in response to compiler errors when resolving
the changes in this CL.

Change-Id: I73e63015a0f02a754d0866bfaf58208aebcaa295
uick/mir_to_lir.cc
ebaca192314e21d26b97646fa962e468ff07b893 16-Jul-2014 Mathieu Chartier <mathieuc@google.com> Merge "Revert "Revert "Revert "Revert "Add intrinsic for Reference.get()"""""
4ee7a665e7f9cd2c5ace2d6304e33f64067b209f 11-Jul-2014 Fred Shih <ffred@google.com> Revert "Revert "Revert "Revert "Add intrinsic for Reference.get()""""

Fixed TargetReg issue causing build failure for x86.
This reverts commit 9e82bd3f0ce9e5f5777bea2f752ff3e251d32f9f.

Change-Id: I7e6a526954467aaf68deeed999880dfe9aa5f06e
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
0e359ef64546e472ed7e2292c8a48354f9907a37 16-Jul-2014 Ian Rogers <irogers@google.com> Merge "Break apart header files."
e63db27db913f1a88e2095a1ee8239b2bb9124e8 16-Jul-2014 Ian Rogers <irogers@google.com> Break apart header files.

Create libart-gtest for common runtime and compiler gtest routines.
Rename CompilerCallbacksImpl that is quick compiler specific.
Rename trace clock source constants to not use the overloaded profiler term.

Change-Id: I4aac4bdc7e7850c68335f81e59a390133b54e933
uick_compiler_callbacks.cc
uick_compiler_callbacks.h
ed7a0f2fb84b200ab6ef34e30dcbba4c0cf8d435 10-Jun-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: improve usage of TargetReg() and friends.

TargetReg(arg1) does now always return a 32-bit register. We also avoid
using this function directly and rather use the two-arguments overload
or TargetPtrReg().

Change-Id: I746b3c29a2a2553b399b5c3e7ee3887c7e7c52c3
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/mir_to_lir.h
9522af985466b2a05ef5cdede0808777dea7236e 15-Jul-2014 Andreas Gampe <agampe@google.com> ART: Squash a cmp w/ zero and b.ls to cbz (ARM/ARM64)

In case of array bounds checks at constant index 0 we generate a
compare and a branch. Squash into a cbz.

Change-Id: I1c6a6e37a7a2356b2c4580a3387cedb55436e251
uick/arm/int_arm.cc
uick/arm64/int_arm64.cc
e50383288a75244255d3ecedcc79ffe9caf774cb 04-Jul-2014 Nicolas Geoffray <ngeoffray@google.com> Support fields in optimizing compiler.

- Required support for temporaries, to be only used by baseline compiler.
- Also fixed a few invalid assumptions around locations and instructions
that don't need materialization. These instructions should not have an Out.

Change-Id: Idc4a30dd95dd18015137300d36bec55fc024cf62
ir_field_info.cc
cf90ba7ebe00346651f3b7ce1e5b1f785f7caabd 12-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Add another special case to GenSelect for ARM64"
39c8a99a3fdd9876980502ab12ed74a27e6be369 12-Jul-2014 Andreas Gampe <agampe@google.com> ART: Add another special case to GenSelect for ARM64

This adds a special case for a select of two constants that have a
difference of exactly one.

Change-Id: I6e8bea791cb25af1b855d62e2333fd7fe6ac4e3a
uick/arm64/int_arm64.cc
6ef2aa67656cf8e67bbd6f0f4aec0402d7158297 12-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Rework TargetReg(symbolic_reg, wide)"
ccc60264229ac96d798528d2cb7dbbdd0deca993 05-Jul-2014 Andreas Gampe <agampe@google.com> ART: Rework TargetReg(symbolic_reg, wide)

Make the standard implementation in Mir2Lir and the specialized one
in the x86 backend return a pair when wide = "true". Introduce
WideKind enumeration to improve code readability. Simplify generic
code based on this implementation.

Change-Id: I670d45aa2572eedfdc77ac763e6486c83f8e26b4
ompiler_enums.h
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
eg_storage.h
421efca6d71ffe348295872743317bf107a9a94a 11-Jul-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix def use.

Add comment to GenPCUseDefEncoding(). Fix def-use flags for several
instruction encodings.

Change-Id: Ifc5a2484395486c01a64307a4acddc794026d46a
uick/arm64/assemble_arm64.cc
uick/arm64/target_arm64.cc
f08f0ca4b9538bff516f354532ced57cf077da66 12-Jul-2014 Ian Rogers <irogers@google.com> Merge "Improve performance of invokevirtual/invokeinterface with embedded imt/vtable"
98d1cc8033251c93786e2fa8c59a2e555a9493be 16-May-2014 Mingyao Yang <mingyao@google.com> Improve performance of invokevirtual/invokeinterface with embedded imt/vtable

Add an embedded version of imt/vtable into class object. Both tables start at
fixed offset within class object so method/entry point can be loaded directly
from class object for invokeinterface/invokevirtual.

Bug: 8142917
Change-Id: I4240d58cfbe9250107c95c0708c036854c455968
uick/gen_invoke.cc
uick/x86/int_x86.cc
af263df7f643e699abf622c64447d31bacc14c34 12-Jul-2014 Andreas Gampe <agampe@google.com> ART: Change GenPCUseDefEncoding(), turn on Load Hoisting for ARM64

This defines the PC resource mask as empty, as the PC is not
accessible on ARM64.

Unify code paths with x86 in LoadStoreElimination and LoadHoisting.

Change-Id: Iea8b9e666f306c7a6ff52b6c5bf7e05b35346b2c
rontend.cc
uick/arm64/target_arm64.cc
uick/local_optimizations.cc
uick/mir_to_lir.h
uick/resource_mask.h
uick/x86/target_x86.cc
48f5c47907654350ce30a8dfdda0e977f5d3d39f 27-Jun-2014 Hans Boehm <hboehm@google.com> Replace memory barriers to better reflect Java needs.

Replaces barriers that enforce ordering of one access type
(e.g. Load) with respect to another (e.g. store) with more general
ones that better reflect both Java requirements and actual hardware
barrier/fence instructions. The old code was inconsistent and
unclear about which barriers implied which others. Sometimes
multiple barriers were generated and then eliminated;
sometimes it was assumed that certain barriers implied others.
The new barriers closely parallel those in C++11, though, for now,
we use something closer to the old naming.

Bug: 14685856

Change-Id: Ie1c80afe3470057fc6f2b693a9831dfe83add831
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/utility_mips.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
b7e78cb6bdc57f2beaa8bccf383289ebdd53e552 12-Jul-2014 Andreas Gampe <agampe@google.com> Merge "AArch64: Fix and enable reverseBytes intrinsic."
873c371eea7d8700c8037d790de168b5ed7c20d0 11-Jul-2014 Stuart Monteith <stuart.monteith@arm.com> ART: Fix GenSelect for ARM64

Add CSINV and replace CSNEG in GenSelect.
Some tests were failing in 083-complier-regression as CSNEG
was used instead of CSINV. CSNEG on xzr yields 0, whereas
CSINV negates the bits and yields -1, which was the intention.

Change-Id: I60557e34483f98310f7d33f18d8db203fba6e78f
Signed-off-by: Stuart Monteith <stuart.monteith@arm.com>
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/int_arm64.cc
0f73aa8f64417232e3f3d09e53f49084d2783fe0 12-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Update counting VR for promotion"
59a42afc2b23d2e241a7e301e2cd68a94fba51e5 04-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> Update counting VR for promotion

For 64-bit it makes sense to compute VR uses together for
int and long because core reg is shared.

Change-Id: Ie8676ece12c928d090da2465dfb4de4e91411920
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/arm/codegen_arm.h
uick/arm64/codegen_arm64.h
uick/mips/codegen_mips.h
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
7c6c2ac4252ac31b42967e0f0233e8d32c5b5abe 01-Jul-2014 Matteo Franchin <matteo.franchin@arm.com> Aarch64: easy division and remainder for long ints.

Also adding test 701 to test easy division and remainder for int and
long integers.

Change-Id: I8212c84e4d9eb3e9f3f4f1f1c3418537bb13dc55
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
49ab79da140b9ae79f9efca70c42eeaa84e361ff 11-Jul-2014 Sebastien Hertz <shertz@google.com> Merge "Revert "Revert "Revert "Add intrinsic for Reference.get()""""
9e82bd3f0ce9e5f5777bea2f752ff3e251d32f9f 11-Jul-2014 Sebastien Hertz <shertz@google.com> Revert "Revert "Revert "Add intrinsic for Reference.get()"""

This reverts commit d4415e8bd04c4a9367744ff0149597b4f37a0e0a.

Change-Id: I34553ccbdcfea35c7742d21be2a74dc7085ab2a0
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
d4415e8bd04c4a9367744ff0149597b4f37a0e0a 11-Jul-2014 Christopher Ferris <cferris@google.com> Revert "Revert "Add intrinsic for Reference.get()""

This reverts commit a9b870b73a155ce70c867d5b3f9758fab0b45f07.

Change-Id: Ic2a9b47f2b911bef4b764d10bc33cf000e4b4211
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
a9b870b73a155ce70c867d5b3f9758fab0b45f07 11-Jul-2014 Christopher Ferris <cferris@google.com> Revert "Add intrinsic for Reference.get()"

This reverts commit 460503b13bc894828a2d2d47d09e5534b3e91aa1.

Change-Id: Ie63f43049307e02e3b90f4e034abc9ea54ca4e24
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
6a1f4ad192e596b6bf43b39c26846300f401a692 11-Jul-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Revert "Revert "Revert "Add implicit null and stack checks for x86""""
0025a86411145eb7cd4971f9234fc21c7b4aced1 11-Jul-2014 Nicolas Geoffray <ngeoffray@google.com> Revert "Revert "Revert "Add implicit null and stack checks for x86"""

Broke the build.

This reverts commit 7fb36ded9cd5b1d254b63b3091f35c1e6471b90e.

Change-Id: I9df0e7446ff0913a0e1276a558b2ccf6c8f4c949
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
7fb36ded9cd5b1d254b63b3091f35c1e6471b90e 10-Jul-2014 Dave Allison <dallison@google.com> Revert "Revert "Add implicit null and stack checks for x86""

Fixes x86_64 cross compile issue. Removes command line options
and property to set implicit checks - this is hard coded now.

This reverts commit 3d14eb620716e92c21c4d2c2d11a95be53319791.

Change-Id: I5404473b5aaf1a9c68b7181f5952cb174d93a90d
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
93279da4a8475d187a0a2e75d50c88def5b4b8a5 10-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: Do not dump hidden basic blocks and add a counter to file naming"
5a8ecafb7fa63cf3ebb448bb1c904858e9c29717 10-Jul-2014 Andreas Gampe <agampe@google.com> Merge "x86_64: Enable fp-reg promotion"
c380191f3048db2a3796d65db8e5d5a5e7b08c65 08-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Enable fp-reg promotion

Patch introduces 4 register XMM12-15 available for promotion of
fp virtual registers.

Change-Id: I3f89ad07fc8ae98b70f550eada09be7b693ffb67
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/codegen_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
03c672f1a8e6cc5bef0348f1d321afb9b26ed53a 11-Jul-2014 Christopher Ferris <cferris@google.com> Merge "Revert "Revert "Add intrinsic for Reference.get()"""
75cb5a2468dfa79600cec8668fc2e85bbc7334a7 11-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix GenSelect and GenFusedLongCmpBranch for ARM64"
381f8acbfbad0f84e60b7ebe9fb9584536fb373f 10-Jul-2014 Andreas Gampe <agampe@google.com> ART: Fix GenSelect and GenFusedLongCmpBranch for ARM64

Depending on the result, we need to issue a wide csel. Also need
to handle constants, and src and dest being the same.

In GenFusedLongCmpBranch there is an ordering issue. If we swap
the inputs, we did not Load the second one.

Change-Id: Icb9876ca1288602d078b9fb89ea964ec2c910e0c
rontend.cc
uick/arm64/int_arm64.cc
7ee5cd1789b098c72010cd26a873f1cd2513e1b1 11-Jul-2014 Christopher Ferris <cferris@google.com> Merge "Revert "Add intrinsic for Reference.get()""
e2ebfb4c7c90863c8dae72723030bf1e2e0e4589 11-Jul-2014 Mathieu Chartier <mathieuc@google.com> Merge "Add intrinsic for Reference.get()"
183636622546ce73c8b67e586e0bc0799fe9c905 11-Jul-2014 Ian Rogers <irogers@google.com> Merge "Updates to help classes derived from X86Mir2Lir"
e9f3e71c90094e87ff83bd5449a2fc4d65f717b2 04-Jul-2014 Mark Mendell <mark.p.mendell@intel.com> Updates to help classes derived from X86Mir2Lir

Just a couple of extra changes to help me out. These changes won't
affect anyone else.

Change-Id: I0e0985a4f16822d5cbfabbf81c9902d34ebdb5da
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/mir_to_lir.h
a8869e60d93ba9eed36a5b53553b7609f58fc05b 19-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Do not dump hidden basic blocks and add a counter to file naming

Currently, if the system dumps the CFG, it dumps the hidden BasicBlocks.
Also, the patch adds a counter that gets incremented to make the file naming
unique, using AtomicInteger.

Change-Id: I55b489c2c2bded73b62d64a94a4a8a54d2ebed2b
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ir_graph.cc
460503b13bc894828a2d2d47d09e5534b3e91aa1 18-Jun-2014 Fred Shih <ffred@google.com> Add intrinsic for Reference.get()

Added an intrinsic function for Reference.get(). Return immediately
without going through JNI if the slow path is not currently in use.
Otherwise, branch off to the the existing JNI function.

Approximately 47x speedup for cases where slow path is not enabled.

Change-Id: I13ad65a356fe4e104d8d83980694dc2740d7d039
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
2ab40eb3c23559205ac7b9b039bd749458e8a761 02-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Add Invokes to DecodedInstruction

Add a method Invokes to test for the kInvoke flag.
Also moved IsPseudoMirOp to DecodedInstruction to use it for the various
querry methods.

Change-Id: I59a2056b7b802b8393fa2b0d977304d252b38c89
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
rontend.cc
ir_analysis.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
uick/dex_file_method_inliner.cc
uick/mir_to_lir.cc
uick/x86/utility_x86.cc
reg_analysis.cc
fe12035ea434be9b24f578cf51e53c3bb34d945c 10-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: Handle Extended MIRs in a uniform manner"
49b874b65412a95f3bf0b1e6f60f3d457dca68da 10-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: Detached blocks should not be processed by compiler"
f2466a766947f952c5c41186a6c5e26fb862bb37 10-Jul-2014 Udayan Banerji <udayan.banerji@intel.com> ART: Handle Extended MIRs in a uniform manner

The special handling is needed since some extended MIRs can hold values in
args array, and we might want to handle the dataflow for those in a
specialized manner. Current dataflow attributes may not be able to describe
it for the extended MIRs.

Change-Id: I8b64f3142a4304282bb31f1d4686eba72284d97d
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ir_dataflow.cc
ir_graph.h
a3fe7422d7ce8bfb01f95decef45f91a44d39264 09-Jul-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix and enable reverseBytes intrinsic.

There is no revsh on arm64, use rev16 and sxth instead.

Change-Id: I5f9879352f0ad76b386c82cbf476894af888a64c
uick/arm64/utility_arm64.cc
uick/gen_invoke.cc
cb804742f8786826286046e9c4489ef9d7ceb7ec 10-Jul-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> ART: Rename CallInlining to SpecialMethodInliner

The CallInlining pass is used to inline just a set of pre-categorized methods.
This set of methods includes empty, instance getters, instance setters, argument
return, and constant return. Since it inlines only "special methods", it makes
sense to name it to reflect that.

Change-Id: Iea2c1820080b0c212c99e977f6b5d34ee0774868
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
b_optimizations.h
ir_graph.h
ir_optimization.cc
ass_driver_me_opts.cc
989367a47b015dd85f850cf756b436fb044b5aea 12-Jun-2014 Niranjan Kumar <niranjan.kumar@intel.com> ART: Detached blocks should not be processed by compiler

It is possible for blocks to be detached. This means that 'successor_block_info->block'
may evaluate to 'NullBasicBlockId' The code should detect this case and handle it
appropriately.

Signed-off-by: vladimir.a.ivanov <vladimir.a.ivanov@intel.com
Signed-off-by: Niranjan Kumar <niranjan.kumar@intel.com
Change-Id: I410059cd2cbda342cc1380050c0972fcaa2b7a8e
ir_graph.cc
f2b3f3373ae99ed7640e58a3abaa75d546ce2fc6 10-Jul-2014 Andreas Gampe <agampe@google.com> ART: Enable some ARM64 optimizations.

Enables kSuppressLoads, kTrackLiveTemps, kSafeOptimizations,
kPromoteCompilerTemps, kClassInitCheckElimination,
kSuppressExceptionEdges and kMatch.

Change-Id: Id3650adce7140dde8d667cd3f1b4a1c2598f156e
rontend.cc
5fa647d5f663033e4ed3d398aece1f8211d7f460 10-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Slow path for iget should expect return in core reg"
4eca9f53ce6c4e59ebad93a049e86d4965e87c9d 07-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> Slow path for iget should expect return in core reg

Slow path for iget invokes the C implementation.
In all cases the C function returns the result in core reg.
So implementation should expect the result in core reg
independent on whether it is fp or not.

Change-Id: I57fb0e684c38af22316398d8071f087bd4bd253c
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/gen_common.cc
fb16129c3c62f73d00ab7570e147e497e787eaad 10-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Global Value Numbering."
95a059793c4c194f026afc74c713cc295d75d91a 30-May-2014 Vladimir Marko <vmarko@google.com> Global Value Numbering.

Implement the Global Value Numbering for optimization
purposes. Use it for the null check and range check
elimination as the LVN used to do.

The order of evaluation of basic blocks needs improving as
we currently fail to recognize some obviously identical
values in methods with more than one loop. (There are three
disabled tests that check this. This is just a missed
optimization, not a correctness issue.)

Change-Id: I0d0ce16b2495b5a3b17ad1b2b32931cd69f5a25a
b_optimizations.h
rontend.cc
rontend.h
lobal_value_numbering.cc
lobal_value_numbering.h
lobal_value_numbering_test.cc
ocal_value_numbering.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_field_info.h
ir_graph.cc
ir_graph.h
ir_optimization.cc
ass_driver_me_opts.cc
50fb243619d337d20b56d2713d861166d48cb491 10-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Handle potential <clinit>() correctly in LVN."
f418f3227e0001c8d75257ceff0c248cc406d81a 09-Jul-2014 Vladimir Marko <vmarko@google.com> Handle potential <clinit>() correctly in LVN.

Bug: 16177324
Change-Id: I727ab6ce9aa9a608fe570cf391a6b732a12a8655
ocal_value_numbering.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_optimization.cc
ir_optimization_test.cc
34e826ccc80dc1cf7c4c045de6b7f8360d504ccf 29-May-2014 Dave Allison <dallison@google.com> Add implicit null and stack checks for x86

This adds compiler and runtime changes for x86
implicit checks. 32 bit only.

Both host and target are supported.
By default, on the host, the implicit checks are null pointer and
stack overflow. Suspend is implemented but not switched on.

Change-Id: I88a609e98d6bf32f283eaa4e6ec8bbf8dc1df78a
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
c21dc06adc8c8447561208a3fb72ccf6d0443613 09-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: Check slow_paths_.Size() every time"
8159af6320f7413a9d0fff1e29220c01f29c6e96 08-Jul-2014 Chao-ying Fu <chao-ying.fu@intel.com> ART: Check slow_paths_.Size() every time

This patch fixes a bug, when a new slow path is created
during slowpath->Compile().

Change-Id: I4896a82781102694c25f4483112c6de3c56e072c
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/gen_common.cc
021b60f31a4443081e63591e184b5d707bba28c1 09-Jul-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: GenInlinedCas must use wide rl_src_offset under 64-bit targets

This patch fixes to use wide rl_src_offset for int and long types
under 64-bit targets, and fixes movzx8 and movsx8 to use r8_form
on the second register only.

Change-Id: Ib8c0756609100f9bc5c228f1eb391421416f3af6
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
00caeedf50998444e53a7a085183019fb7bdf742 10-Jul-2014 Andreas Gampe <agampe@google.com> ART: Refactor frontend.cc

Refactor frontend.cc. Pull out flags, merge them in arrays keyed by
the instruction set. Simplify the checks and application of flags.

Change-Id: I12d5216df8d1f12e7fbe39d8132e4725c55bc8e7
rontend.cc
3d14eb620716e92c21c4d2c2d11a95be53319791 10-Jul-2014 Dave Allison <dallison@google.com> Revert "Add implicit null and stack checks for x86"

It breaks cross compilation with x86_64.

This reverts commit 34e826ccc80dc1cf7c4c045de6b7f8360d504ccf.

Change-Id: I34ba07821fc0a022fda33a7ae21850957bbec5e7
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eb24baec056dbe5871f1bc64b793eb2e69907866 08-Jul-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> x86_64: enable Peek and Poke intrinsics

This implements intrinsics for:
Memory.peekByte/Short/Int/Long()
Memory.pokeByte/Short/Int/Long()

Change-Id: I6da6250f262dfd7aded35c2e3ade2d0916bd73cb
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/int_x86.cc
62f28f943e2da2873c7a09096c292f01a21c6478 09-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Fix a compile assert name with inverted meaning."
2aaed94965c2d483598660db11a1e7d608682516 08-Jul-2014 Vladimir Marko <vmarko@google.com> Fix a compile assert name with inverted meaning.

Change-Id: I50cc9a8b88c19e1ce7bc5b34cc4b7d650b2f052d
uick/dex_file_method_inliner.cc
665f681020ec313d6aea1aa26db582176d780079 09-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Workaround for invalid monitor-exit catch ranges."
e8ae81453e1d6c19d7db2001a1e7b1849f74241c 08-Jul-2014 Vladimir Marko <vmarko@google.com> Workaround for invalid monitor-exit catch ranges.

Avoid bogus exception edges from monitor-exit to a
catch handler that does exactly the same monitor-exit.

Bug: 15745363
Change-Id: I2b8b44b313c470557714744bdfb7beaef2cd2246
ir_graph.cc
ir_graph.h
460f4ef18761ad25f384172e45dff2ad0b60b7aa 08-Jul-2014 Vladimir Marko <vmarko@google.com> Add kIntrinsicIsStatic flag for System.arraycopy().

Change-Id: I40ffb07e62474f418eabb7361f129c633022666c
uick/dex_file_method_inliner.cc
9c1bd6b8744920b62afcb08571ffcfba055c73a0 08-Jul-2014 Vladimir Marko <vmarko@google.com> Fix style issue.

Change-Id: Ifc73dd4331d91be8c6c5eed2159ec1733fa84995
uick/dex_file_method_inliner.cc
74d8348cfd7100fd6bd06d00dce3110a4545c4f8 08-Jul-2014 Vladimir Marko <vmarko@google.com> Merge "Check invoke type for intrinsic method invokes."
724c0fe2b39578eafac027e5925f27e95d40e3ba 03-Jul-2014 Vladimir Marko <vmarko@google.com> Check invoke type for intrinsic method invokes.

Bug: 16017877
Change-Id: I931c0b19b500a042bc9235aa18212c4ab5240745
uick/dex_file_method_inliner.cc
70c4f06f9965cdb9319a2c85f65acda20086d765 25-Jun-2014 DaniilSokolov <daniil.y.sokolov@intel.com> ART: Intrinsic implementation for java.lang.System.arraycopy.

Implements intrinsic for java.lang.System.arraycopy(char[], int, char[], int, int) -
this method is internal to android class libraries and used in such classes as StringBuffer and
StringBuilder. It is not possible to call it from application code. The intrinsic for
this method is implemented as inline method (assembly code is generated manually).

The intrinsic is x86 32 bit only.

Change-Id: Id1b1e0a20d5f6d5f5ebfe1fdc2447b6d8a515432
Signed-off-by: Daniil Sokolov <daniil.y.sokolov@intel.com>
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
ae2efea4582df773f80be274bdc754f732b07df3 07-Jul-2014 Ian Rogers <irogers@google.com> Merge "ART: Add HADDPS/HADDPD/SHUFPS/SHUFPD instruction generation"
2cfe30bd592cb6ae63bb4c28ccaf4b069d6ab565 09-Jul-2014 Ian Rogers <irogers@google.com> Merge "X86 Backend support for vectorized float and byte 16x16 operations"
60bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43 09-Jul-2014 Udayan Banerji <udayan.banerji@intel.com> X86 Backend support for vectorized float and byte 16x16 operations

Add support for reserving vector registers for the duration of vector loop.
Add support for 16x16 multiplication, shifts, and add reduce.

Changed the vectorization implementation to be able to use the dataflow
elements for SSA recreation and fixed a few implementation details.

Change-Id: I2f358f05f574fc4ab299d9497517b9906f234b98
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Olivier Come <olivier.come@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ackend.h
ompiler_enums.h
ir_dataflow.cc
ir_graph.cc
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
7b68fb3b9b421d4b20c1993704986d637f1cab91 09-Jul-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Clean-up after cmp-long fix"
94f3eb0c757d0a6a145e24ef95ef7d35c091bb01 24-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Clean-up after cmp-long fix

The patch adresses the coments from review done by Ian Rogers.
Clean-up of assembler.

Change-Id: I9dbb350dfc6645f8a63d624b2b785233529459a9
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/assemble_x86.cc
uick/x86/x86_lir.h
dfc56e681beb055801491792026cb9976d8566e8 09-Jul-2014 Ian Rogers <irogers@google.com> Merge "Clean-up call_x86.cc"
407a9d2847161b843966a443b71760b1280bd396 04-Jul-2014 Serguei Katkov <serguei.i.katkov@intel.com> Clean-up call_x86.cc

Also adds some DCHECKs and fixes for the bugs found by them.

Change-Id: I455bbfe2c6018590cf491880cd9273edbe39c4c7
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
251a057f52946452ac1c485b38d4ebafcf3bc5ad 09-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix FP promotion"
01758d53a96a5adc914a2433279a9c283e5a4c2a 09-Jul-2014 Andreas Gampe <agampe@google.com> ART: Fix FP promotion

A previous CL changed != by mistake to ==, causing incorrect
promotion results for ARM32.

Change-Id: I62572e3e86d38a55be7043196027563735010b30
uick/ralloc_util.cc
7a94961d0917495644193b281b04a570a783bb07 08-Jul-2014 Andreas Gampe <agampe@google.com> ART: Do not emit load when inlining unused Thread.currentThread()

When the result is not used, do not emit the load. This avoids
uninitialized registers leading to size-check errors.

Change-Id: I212392ffea7243720f120b2f12679df286106a02
uick/gen_invoke.cc
fbf156c9394e777385ae2661e673a4c783dfd836 07-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Aarch64: fix bug and enable register promotion."
f101319480b1fe6575891043d0c3f0599292c25c 07-Jul-2014 Matteo Franchin <matteo.franchin@arm.com> Aarch64: fix bug and enable register promotion.

Iteration over arguments in invoke implementation was not correct
for wide arguments.

Change-Id: I46c7edcbfc9e32ded0e9a535fab3d333905bcf41
rontend.cc
uick/arm64/target_arm64.cc
f22af67db2a6e7221dd15320d1a7688f1b423668 06-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Fix missing dependency in new X86 instruction"
01a50d660bd1fa692b132a24ec0f18f402e69de2 06-Jul-2014 Mark Mendell <mark.p.mendell@intel.com> Fix missing dependency in new X86 instruction

AX is written by this opcode. Note the dependency.

Change-Id: I25209e1fb4ceb0387269436c8b00730b1caa03bc
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
a77ee5103532abb197f492c14a9e6fb437054e2a 02-Jul-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: TargetReg update for x86

Also includes changes in common code. Elimination of use of TargetReg
with one parameter and direct access to special target registers.

Change-Id: Ied2c1f87d4d1e4345248afe74bca40487a46a371
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/arm64/codegen_arm64.h
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/x86_lir.h
3ee86bcbbc29f17b0243954a52dcda96b09411e0 03-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Load 64 bit constant into GPR by single instruction for 64bit mode"
b5860fb459f1ed71f39d8a87b45bee6727d79fe8 22-Jun-2014 buzbee <buzbee@google.com> Register promotion support for 64-bit targets

Not sufficiently tested for 64-bit targets, but should be
fairly close.

A significant amount of refactoring could stil be done, (in
later CLs).

With this change we are not making any changes to the vmap
scheme. As a result, it is a requirement that if a vreg
is promoted to both a 32-bit view and the low half of a
64-bit view it must share the same physical register. We
may change this restriction later on to allow for more flexibility
for 32-bit Arm.

For example, if v4, v5, v4/v5 and v5/v6 are all hot enough to
promote, we'd end up with something like:

v4 (as an int) -> r10
v4/v5 (as a long) -> r10
v5 (as an int) -> r11
v5/v6 (as a long) -> r11

Fix a couple of ARM64 bugs on the way...

Change-Id: I6a152b9c164d9f1a053622266e165428045362f3
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
eg_storage.h
eg_storage_eq.h
0107273ae05d4624495bbaae62b9194f8ae6685b 07-Jul-2014 Andreas Gampe <agampe@google.com> Merge "Aarch64: fix references handling in Load*Indexed."
255e014542b2180620230e4d9d6000ae06846bbd 04-Jul-2014 Matteo Franchin <matteo.franchin@arm.com> Aarch64: fix references handling in Load*Indexed.

Fix the way we handle references in Load/StoreBaseIndexed and friends.
We assume references are 64-bit RegStorage entities, with the
difference that they are load as 32-bit values.

Change-Id: I7fe987ef9e97e9a5042b85378b33d1e85710d8b5
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
407f5c1a74892685f0ee603f034c0730381902a9 30-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Fix InstanceofFinal

Comparison should be made using GetReg()

Change-Id: Ic5bebf680395d9b93710511db9760d0e867b38cb
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/int_x86.cc
63fe93d9f9d2956b1ee2b98cdd6ddd2153f5f9cf 30-Jun-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Enable Inlining.

This patch fixes the remaining issues with inlining for ARM64.

Change-Id: I2d85b7c4f3fb2b667bf6029fbc271ab954378889
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
Signed-off-by: Matteo Franchin <matteo.franchin@arm.com>
rontend.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_invoke.cc
15d7a46d198f8064efbe4ab10696d448ed9dc60f 04-Jul-2014 Matteo Franchin <matteo.franchin@arm.com> Aarch64: fix encoding map for kA64Fmov2xS.

Change-Id: I5127a4443969dc2322461a4b4a34d6c39a0ffd64
uick/arm64/assemble_arm64.cc
ef505256e530951033a705e84a0682e7adcedf30 04-Jul-2014 Andreas Gampe <agampe@google.com> Merge "x86_64: Turn on promotion optimization"
699c04aa7cb7d0e8187fba2cbec3f0319e4da5bb 28-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Turn on promotion optimization

This CL turns on the promotion optimization (longs).
The 64-bit references support is disabled in x86_64 backend.

Change-Id: I62723388f549b51bae41c8a6b334228b2d782610
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
c5e4ce116e4d44bfdf162f0c949e77772d7e0654 10-Jun-2014 nikolay serdjuk <nikolay.y.serdjuk@intel.com> x86_64: Fix intrinsics

The following intrinsics have been ported:

- Abs(double/long/int/float)
- String.indexOf/charAt/compareTo/is_empty/length
- Float.floatToRawIntBits, Float.intBitsToFloat
- Double.doubleToRawLongBits, Double.longBitsToDouble
- Thread.currentThread
- Unsafe.getInt/Long/Object, Unsafe.putInt/Long/Object
- Math.sqrt, Math.max, Math.min
- Long.reverseBytes

Math.min and max for longs have been implemented for x86_64.

Commented out until good tests available:
- Memory.peekShort/Int/Long, Memory.pokeShort/Int/Long

Turned off on x86-64 as reported having problems
- Cas

Change-Id: I934bc9c90fdf953be0d3836a17b6ee4e7c98f244
uick/gen_invoke.cc
uick/x86/assemble_x86.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
23abec955e2e733999a1e2c30e4e384e46e5dde4 02-Jul-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Add few more inline functions

This patch adds inlining support for the following functions:
* Math.max/min(long, long)
* Math.max/min(float, float)
* Math.max/min(double, double)
* Integer.reverse(int)
* Long.reverse(long)

Change-Id: Ia2b1619fd052358b3a0d23e5fcbfdb823d2029b9
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
5192cbb12856b12620dc346758605baaa1469ced 01-Jul-2014 Yixin Shou <yixin.shou@intel.com> Load 64 bit constant into GPR by single instruction for 64bit mode

This patch load 64 bit constant into a register by a single movabsq
instruction on 64 bit bit instead of previous mov, shift, add
instruction sequences.

Change-Id: I9d013c4f6c0b5c2e43bd125f91436263c7e6028c
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
uick/x86/assemble_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
ffcdd9f13daba70a64bb85688726ae23aa7a6eda 02-Jul-2014 Andreas Gampe <agampe@google.com> Merge "x86_64: Unify 64-bit check in x86 compiler"
dd64450b37776f68b9bfc47f8d9a88bc72c95727 01-Jul-2014 Elena Sayapina <elena.v.sayapina@intel.com> x86_64: Unify 64-bit check in x86 compiler

Update x86-specific Gen64Bit() check with the CompilationUnit target64 field
which is set using unified Is64BitInstructionSet(InstructionSet) check.

Change-Id: Ic00ac863ed19e4543d7ea878d6c6c76d0bd85ce8
Signed-off-by: Elena Sayapina <elena.v.sayapina@intel.com>
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
6f9dbb8d4aa72c9b24ea45358751123b6e4c7488 02-Jul-2014 Andreas Gampe <agampe@google.com> Merge "ART: Quick compiler: More size checks, add TargetReg variants"
4d5d794382cd6d3a25392d17543d5987e432d314 26-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Simplify FlushIns

This change simplifies FlushIns for x86_64.

Change-Id: I2b41fae32603e0951e3847cc1e4f9c6bfab349a0
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/target_x86.cc
4b537a851b686402513a7c4a4e60f5457bb8d7c1 01-Jul-2014 Andreas Gampe <agampe@google.com> ART: Quick compiler: More size checks, add TargetReg variants

Add variants for TargetReg for requesting specific register usage,
e.g., wide and ref. More register size checks.

With code adapted from https://android-review.googlesource.com/#/c/98605/.

Change-Id: I852d3be509d4dcd242c7283da702a2a76357278d
ir_graph.h
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
eg_location.h
f9872f0b5f713af867b4e32e647a1b92f94fb01a 02-Jul-2014 Andreas Gampe <agampe@google.com> ART: Fix size error reported by ARM64 backend

Also removes a spurious LOG in dex2oat.

Change-Id: Ia264fbfb3cb8d59978f3a61e814eb6940e272ece
uick/gen_invoke.cc
595248a0d9b96a4b442bb0cd3fecd55ae630b03f 30-Jun-2014 Andreas Gampe <agampe@google.com> Merge "AArch64: Rename A64_/A32_ register prefix to x/w."
baa7c88a34fdfd230a2a383c2e388945f4d907b6 30-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Rename A64_/A32_ register prefix to x/w.

A64/A32 look like architecture name, but they are all for arm64.
Use lower-case to name the registers defined in "ARM ARM" which can
also be directly used in assembly file.
Use upper-case to name the registers which are other aliases.

Change-Id: I0ac38ed75f977fdc362288b01179b84feaee5614
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
4c7cc15590a2f921e6055f723e46694966cb7665 23-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Fix GenArrayBoundsCheck

The GenArrayBoundsCheck uses args registers to put array_length and
index as a parameter to out call. To ensure that we do not corrupt
register values there is a check whether need arg is not busy.
We need to use reg num comparison instead of reg comparison.

Change-Id: I260f02d1c155b69be8652dee2e89f3b63d15297c
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
903989dae724ec0b186ec98c2afd1e074ed41d4d 01-Jul-2014 Vladimir Marko <vmarko@google.com> AArch64: Fix OpRegRegImm64 add/sub for large negative imm.

Bug: 15837964
Change-Id: I401edf687352fae3dca03c0a807dac5750e454f6
uick/arm64/utility_arm64.cc
949cd973513f1ae29280fcde7953b0f7e70172a7 23-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Enable GenSpecialCase.

With the following fixes:
1. Map reference register to 64-bit argument register.
2. Set max_mapped_in_ to the index of last in. (Originally it was the
low part of the wide register)

Change-Id: If41de654a004a0561396e349d1f150517a72ab2f
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
2db3e269e3051dacb3c8a4af8f03fdad9b0fd740 26-Jun-2014 Douglas Leung <douglas@mips.com> Fix quick mode bugs for Mips.

This patch enable quick mode for Mips and allows the emulator to boot.
However the emulator is still not 100% functional. It still have problems
launching some apps.

Change-Id: Id46a39a649a2fd431a9f13b06ecf34cbd1d20930
Signed-off-by: Douglas Leung <douglas@mips.com>
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/ralloc_util.cc
a64d728836712e9295ada7de44d8cc3165d595a8 27-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: implement easy division and reminder."
c6301bcfbefa1c320f922d2209caee3481dc1aa2 27-Jun-2014 Andreas Gampe <agampe@google.com> ART: ARM64 fp return reg locations are FP

Change-Id: Ica14b63ebde8efda113a146939309a6c37adc9aa
uick/arm64/arm64_lir.h
a94d7fd18a11dc14fe43c5f814115b73d48846c2 27-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Fix topological ordering and use it for optimizations."
fb0fecffb31398adb6f74f58482f2c4aac95b9bf 20-Jun-2014 Olivier Come <olivier.come@intel.com> ART: Add HADDPS/HADDPD/SHUFPS/SHUFPD instruction generation

The patch adds the HADDPS, HADDPD, SHUFPS, and SHUFPD instruction generation
for X86.

Change-Id: Ida105d3e57be231a5331564c1a9bc298cf176ce6
Signed-off-by: Olivier Come <olivier.come@intel.com>
uick/x86/assemble_x86.cc
uick/x86/x86_lir.h
b9d11f7e2f60bdebfd2ece34e01ecc789921837d 25-Jun-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Fix wide argument increment"
e63d9d4e42e659a365a9a06b910852ebc297f457 24-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: int-to-long should ensure that int in kCoreReg

it is possible that int in xmm so implementation of int-to-long
should ensure that src in core reg before usage of move with
sign extension which does not support xmm case.

Change-Id: Ibab9df7564f0f1c1f3e1f5ff67c38f1a5e3cdb69
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
b6564c19c5e14a3caa3f8da423b0da510fda7026 24-Jun-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Fix wide argument increment

This patch fixes to always increment the index for a wide argument,
and fixes the index upper bound.
Otherwise, the mapping may be incorrect.

Change-Id: I0116d8fd0a0a5c1270a23129c73a9e3651132977
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/target_x86.cc
fe7aee2d20b47dad6029a588e0c7394f0c75d080 25-Jun-2014 Mathieu Chartier <mathieuc@google.com> Merge "More advanced timing loggers."
f5997b4d3f889569d5a2b724d83d764bfbb8d106 20-Jun-2014 Mathieu Chartier <mathieuc@google.com> More advanced timing loggers.

The new timing loggers have lower overhead since they only push into
a vector. The new format has two types, a start timing and a stop
timing. You can thing of these as brackets associated with a
timestamp. It uses these to construct various statistics when needed,
such as: Total time, exclusive time, and nesting depth.

Changed PrettyDuration to have a default of 3 digits after the decimal
point.

Exaple of a GC dump with exclusive / total times and indenting:
I/art (23546): GC iteration timing logger [Exclusive time] [Total time]
I/art (23546): 0ms InitializePhase
I/art (23546): 0.305ms/167.746ms MarkingPhase
I/art (23546): 0ms BindBitmaps
I/art (23546): 0ms FindDefaultSpaceBitmap
I/art (23546): 0ms/1.709ms ProcessCards
I/art (23546): 0.183ms ImageModUnionClearCards
I/art (23546): 0.916ms ZygoteModUnionClearCards
I/art (23546): 0.610ms AllocSpaceClearCards
I/art (23546): 1.373ms AllocSpaceClearCards
I/art (23546): 0.305ms/6.318ms MarkRoots
I/art (23546): 2.106ms MarkRootsCheckpoint
I/art (23546): 0.153ms MarkNonThreadRoots
I/art (23546): 4.287ms MarkConcurrentRoots
I/art (23546): 43.461ms UpdateAndMarkImageModUnionTable
I/art (23546): 0ms/112.712ms RecursiveMark
I/art (23546): 112.712ms ProcessMarkStack
I/art (23546): 0.610ms/2.777ms PreCleanCards
I/art (23546): 0.305ms/0.855ms ProcessCards
I/art (23546): 0.153ms ImageModUnionClearCards
I/art (23546): 0.610ms ZygoteModUnionClearCards
I/art (23546): 0.610ms AllocSpaceClearCards
I/art (23546): 0.549ms AllocSpaceClearCards
I/art (23546): 0.549ms MarkRootsCheckpoint
I/art (23546): 0.610ms MarkNonThreadRoots
I/art (23546): 0ms MarkConcurrentRoots
I/art (23546): 0.610ms ScanGrayImageSpaceObjects
I/art (23546): 0.305ms ScanGrayZygoteSpaceObjects
I/art (23546): 0.305ms ScanGrayAllocSpaceObjects
I/art (23546): 1.129ms ScanGrayAllocSpaceObjects
I/art (23546): 0ms ProcessMarkStack
I/art (23546): 0ms/0.977ms (Paused)PausePhase
I/art (23546): 0.244ms ReMarkRoots
I/art (23546): 0.672ms (Paused)ScanGrayObjects
I/art (23546): 0ms (Paused)ProcessMarkStack
I/art (23546): 0ms/0.610ms SwapStacks
I/art (23546): 0.610ms RevokeAllThreadLocalAllocationStacks
I/art (23546): 0ms PreSweepingGcVerification
I/art (23546): 0ms/10.621ms ReclaimPhase
I/art (23546): 0.610ms/0.702ms ProcessReferences
I/art (23546): 0.214ms/0.641ms EnqueueFinalizerReferences
I/art (23546): 0.427ms ProcessMarkStack
I/art (23546): 0.488ms SweepSystemWeaks
I/art (23546): 0.824ms/9.400ms Sweep
I/art (23546): 0ms SweepMallocSpace
I/art (23546): 0.214ms SweepZygoteSpace
I/art (23546): 0.122ms SweepMallocSpace
I/art (23546): 6.226ms SweepMallocSpace
I/art (23546): 0ms SweepMallocSpace
I/art (23546): 2.144ms SweepLargeObjects
I/art (23546): 0.305ms SwapBitmaps
I/art (23546): 0ms UnBindBitmaps
I/art (23546): 0.275ms FinishPhase
I/art (23546): GC iteration timing logger: end, 178.971ms

Change-Id: Ia55b65609468f212b3cd65cda66b843da42be645
rontend.cc
fbd18f1923334f3208cfe6ba5f1d4f9eb421b063 24-Jun-2014 Andreas Gampe <agampe@google.com> Merge "Revert "ART: Split out more cases of Load/StoreRef, volatile as parameter""
de68676b24f61a55adc0b22fe828f036a5925c41 24-Jun-2014 Andreas Gampe <agampe@google.com> Revert "ART: Split out more cases of Load/StoreRef, volatile as parameter"

This reverts commit 2689fbad6b5ec1ae8f8c8791a80c6fd3cf24144d.

Breaks the build.

Change-Id: I9faad4e9a83b32f5f38b2ef95d6f9a33345efa33
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
7e47f713067b55e24b5d24f2c892ceefd7971ebf 24-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Split out more cases of Load/StoreRef, volatile as parameter"
3c12c512faf6837844d5465b23b9410889e5eb11 24-Jun-2014 Andreas Gampe <agampe@google.com> Revert "Revert "ART: Split out more cases of Load/StoreRef, volatile as parameter""

This reverts commit de68676b24f61a55adc0b22fe828f036a5925c41.

Fixes an API comment, and differentiates between inserting and appending.

Change-Id: I0e9a21bb1d25766e3cbd802d8b48633ae251a6bf
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
7db22606228d21b3adba04851409a4a78e6b4263 24-Jun-2014 Calin Juravle <calin@google.com> Merge "Always compile leafs during profile based compilation."
2689fbad6b5ec1ae8f8c8791a80c6fd3cf24144d 23-Jun-2014 Andreas Gampe <agampe@google.com> ART: Split out more cases of Load/StoreRef, volatile as parameter

Splits out more cases of ref registers being loaded or stored. For
code clarity, adds volatile as a flag parameter instead of a separate
method.

On ARM64, continue cleanup. Add flags to print/fatal on size mismatches.

Change-Id: I30ed88433a6b4ff5399aefffe44c14a5e6f4ca4e
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
38a09040432001f1a4330ac80b80b1178e1eaf8a 23-Jun-2014 Calin Juravle <calin@google.com> Always compile leafs during profile based compilation.

Bug:12877748
Change-Id: Idbee9eaa87c419454728de195bdbdd9b0e6b7b50
rontend.cc
1c55703526827b5fc63f5d4b8477f36574649342 23-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Correct fix for cmp-long

We cannot rely on the sign of the sub instruction because
LONG_MAX - LONG_MIN = -1 and the sign will indicate that
LONG_MAX < KONG_MIN and it is incorrect.

The fix also contains small improvement for load wide constant.

Change-Id: I74df70d7c198cebff5cad8c1d5614c1d29b79a1b
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
2073e7553d1ca65f13b6c4e4fe364c2a345a1511 23-Jun-2014 Andreas Gampe <agampe@google.com> Revert "Revert "ART: Fix StoreValue to use RefDisp when necessary.""

This reverts commit e98297bafe84e2ac15eb73739f27826fcaae1203.

No matter if holding a reference or not, the store needs to be tagged
as updating a Dalvik register.

Change-Id: Icb80e1b6f82103cff33ee971faaaa02f9ad4a683
uick/gen_loadstore.cc
a5377fe9231b441856b3c9bfa4aa003445436958 23-Jun-2014 Ian Rogers <irogers@google.com> Merge "Revert "ART: Fix StoreValue to use RefDisp when necessary.""
e98297bafe84e2ac15eb73739f27826fcaae1203 22-Jun-2014 Ian Rogers <irogers@google.com> Revert "ART: Fix StoreValue to use RefDisp when necessary."

This reverts commit 596bea8f6331fe8ad6eb456afa1f7dfe1b92e09c.

Change-Id: I1942bfc5127e8a631c5b24d107d304c7cd994e78
uick/gen_loadstore.cc
596bea8f6331fe8ad6eb456afa1f7dfe1b92e09c 20-Jun-2014 Andreas Gampe <agampe@google.com> ART: Fix StoreValue to use RefDisp when necessary.

Split from https://android-review.googlesource.com/#/c/98605

Change-Id: Ib3a03428ddbec659591b838404bbfa1553fe18e9
uick/gen_loadstore.cc
b493c2983016a78de498c3a3aef302b1353dca99 21-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Enable some optimizations"
4370d3d3a92b45ac3bdceae0c3059648b0f3fc1d 21-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Fix fp-to-core conversion"
7499cd1d4445fd00aa3c9503497a171fae9bf20e 21-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Fix comp-long"
0498223110174a055c743219c6cd82bee90d6034 20-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Fix comp-long

If result and source are the same VR then implementation does
a wrong thing clearing dest in the beginning.

Change-Id: I66d97a828aa38121676561858119ccd44aaa4d50
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
5078d978f21620824d9c2fdcd73063260592398c 20-Jun-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86_64: Fix fp-to-core conversion

Long max value cannot be represented with double precision
and check fp against max_long does not guard invocation of
conversion instruction. As a result conversion ends up with
min long instead of max long.

The patch changes the guard check to not allow conversion
instruction for max long.

Change-Id: Ied761051ec27cf6c833040c25a2c61ab9fcea414
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/fp_x86.cc
990f110b45127055d99fe894afb1ae4cfd92046c 20-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix StoreValue to use RefDisp when necessary."
49c5f50cbc8e4d8c195d8f1409abcfde08b39786 20-Jun-2014 Andreas Gampe <agampe@google.com> ART: Fix register overlap checks in CopyArgumentRegs

This is a make-shift CL. Expect this to be replaced by a reworked
implementation.

Change-Id: Ia74697d1436efd2971bc4c791fabed66d2e9d72d
uick/gen_invoke.cc
54ee4442a3bd5169258c32234c5dfc187360b043 20-Jun-2014 buzbee <buzbee@google.com> Quick compiler: remove Arm64 "EXPERIMENTAL" filter

Support for the compilation of all dex opcodes should now exist.
We'll go ahead and leave the filter code in for a new weeks, as it
may be handy if we need a quick workaround.

Change-Id: I8f1857136d78347b7d2337db2c793ad41ad45cb9
rontend.cc
c61b3c984c509d5f7c8eb71b853c81a34b5c28ef 18-Jun-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: implement easy division and reminder.

This implements easy division and reminder for integer only (32-bit).
The optimisation applies to div/rem by powers of 2 and to div by small
literals (between 3-15).

Change-Id: I71be7c4de5d2e2e738b88984f13efb08f4388a19
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/mir_to_lir.h
622bdbe6c295b08d06dfaa8d896b9ca152aa899c 19-Jun-2014 Vladimir Marko <vmarko@google.com> Fix topological ordering and use it for optimizations.

Use the topological sort order for ClassInitCheckElimination
and NullCheckEliminationAndTypeInference.

Change-Id: I315ca7f300dd11390f48aefebfe988baf91bdcf1
b_optimizations.h
ataflow_iterator.h
ir_graph.cc
ir_graph.h
ir_optimization_test.cc
ass_driver_me.h
ass_driver_me_post_opt.cc
ost_opt_passes.h
a81fe3d512ef846aad3398222afd1f0588bbaf7c 19-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Several fixes required for enabling promotion"
7133659eeea45e391aa12affea75e39e8c300eb0 19-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Fix neg_double"
202e74780054ce2b0d87ddf0591cd83b6506de1d 19-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Log information when skipping method during compilation"
060e6febbe2db5e1d754d2743d6534b217d868fe 19-Jun-2014 Andreas Gampe <agampe@google.com> ART: Log information when skipping method during compilation

Add a reason for skipping a method to the log.

Change-Id: I3b31ee64cce6b531b25397f646cdfee650704ad6
rontend.cc
ir_analysis.cc
ir_graph.h
02959eae949f37445c184ae6f3df4d068ff309e0 18-Jun-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> x86_64: Fix neg_double

In a case, when src and dest regs are the same, previous
implementation of the neg_double bytecode returns an
incorrect result.

This implementation uses shifts and xor and works for both
cases.

Change-Id: I137d9a90298ec225d80435d35558da8abb69cd01
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/fp_x86.cc
995b32cc8e94a9730d6cf663a23afc9c997c1771 19-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Implicit checks in the compiler are independent from Runtime"
5655e84e8d71697d8ef3ea901a0b853af42c559e 18-Jun-2014 Andreas Gampe <agampe@google.com> ART: Implicit checks in the compiler are independent from Runtime

When cross-compiling, those flags are independent. This is an
initial CL that helps bypass fatal failures when cross-compiling,
as not all architectures support (and have turned on) implicit
checks.

The actual transport for the target architecture when it is
different from the runtime needs to be implemented in a follow-up
CL.

Bug: 15703710
Change-Id: Idc881a9a4abfd38643b862a491a5af9b8841f693
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/target_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/x86/target_x86.cc
f987927a68d0489970c1eca6a32fd02ca9913357 19-Jun-2014 Andreas Gampe <agampe@google.com> ART: Reserve 8B for float literals on ARM64

This is a cludge to make sure literal pools will be 8B aligned.
A better approach would be post-processing - that way we could
pack the floats.

Change-Id: Ia9c6f53e0f6e37b4be79e1efe7f14feb49f2052b
uick/arm64/utility_arm64.cc
57eb0b46e4b6ff91b5b74010057d6f733d869bfd 19-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Change rrr add and sub for ARM64"
9f975bfe091e9592a1b6b5b46d224ec04b1183b6 19-Jun-2014 Andreas Gampe <agampe@google.com> ART: Change rrr add and sub for ARM64

OpRegRegImm will fall back to loading a constant into a register
and then doing the operation with three registers. That is, for
example, the case when we allocate large stack frames. However,
the currently chosen operations are add/sub shifted, which does
*not* allow to specify SP (x31 will be interpreted as xzr). Switch
to add/sub extended. There won't be a practical difference, as we
do not call with anything other than 0 shift.

Change-Id: I2b78df9f044d2963e3e890777c855b339952f9f4
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/utility_arm64.cc
7cd26f355ba83be75b72ed628ed5ee84a3245c4f 19-Jun-2014 Andreas Gampe <agampe@google.com> ART: Target-dependent stack overflow, less check elision

Refactor the separate stack overflow reserved sizes from thread.h
into instruction_set.h and make sure they're used in the compiler.

Refactor the decision on when to elide stack overflow checks:
especially with large interpreter stack frames, it is not a good
idea to elide checks when the frame size is even close to the
reserved size. Currently enforce checks when the frame size is
>= 2KB, but make sure that frame sizes 1KB and below will elide
the checks (number from experience).

Bug: 15728765
Change-Id: I016bfd3d8218170cbccbd123ed5e2203db167c06
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mips/call_mips.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
47b31aa855379471c06735b738396fa76e7c1988 19-Jun-2014 Andreas Gampe <agampe@google.com> ART: Start implementation of OpRegRegRegExtend for ARM64

We need a sign-extending add for packed-switch and sparse-switch,
as the 32b values are signed offsets. This starts an implementation
that is sufficient for the use cases.

Change-Id: Ib5bae24b902077346a97d5e9e061533f9cdfcdb0
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/utility_arm64.cc
e4a6bd7550508e96aeb575e5aa1faa6fef35e20d 13-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Enable some optimizations

Except kLoadStoreElimination and kPromoteRegs.

Change-Id: Iaebf6652641fe32c9e9b21469e4f898af2d67250
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
3157f9a18d0524e33b4feb67664974afc13ae351 18-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Several fixes required for enabling promotion

This patch includes x86_64 fixes which solve the issues
reproducible with promotion optimization enabled.

Change-Id: I3a3b0d290380d639705cd58f38b8d62b1eb930d3
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/int_x86.cc
5969734b3036a7073c378e0687dd3e90c43d21a7 18-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Add x86 inlined abs method for float/double"
7071c8d5885175a746723a3b38a347855965be08 05-Mar-2014 Yixin Shou <yixin.shou@intel.com> Add x86 inlined abs method for float/double

Add the optimized implementation of inlined abs method for
float/double for X86 side.

Change-Id: I2f367542f321d88a976129f9f7156fd3c2965c8a
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/utility_x86.cc
9b743ef7955a70952f3e147f9ce8d9d47c9051f9 18-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Fix OpCmpMemImmBranch."
7c1c263f3227169e055200cc481c022f1cf37213 17-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix OpCmpMemImmBranch.

The temp register can be 64-bit in some cases(ArgReg or RefReg).
Always compare 32-bit value no matter what the temp register is.

Change-Id: Ib237dd081da0b5900b8c2418df1621d3245cb03d
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
71921a3ff18ba27061a013465c1b2d850a235dfa 18-Jun-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Clobber r8 to r11 and xmm0 to xmm15"
4c115b85cc48f4dfc8fc2b0484ddfeb29f02d658 17-Jun-2014 Vladimir Marko <vmarko@google.com> Revert "Add x86 inlined abs method for float/double"

This reverts commit e88b89ad1d1a583daf205c7a387ba13f549f95f1.

Change-Id: I2ba21b7442ba3696482d45001e6bd32e8baf9d1f
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/utility_x86.cc
0210d11658becc2bf02fe79788c87276a857d0e9 16-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Add transition assembly to wrapper native functions.

There is slight difference between managed code ABI and AAPCS. We
can make managed code ABI to be the same with AAPCS. But considering
that, we might introduce more differences later for performance. It
is better to have a wrapper to deal with the differences.

Change-Id: I46ced072e9e3a83f713d2bf86fa478fc6144ee81
uick/arm64/fp_arm64.cc
838b38fa3b2fb4a64f8a316459d372020f6e8feb 17-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "ART: Implement rem_double/rem_float for x86/x86-64"
bd3682eada753de52975ae2b4a712bd87dc139a6 11-Jun-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: Implement rem_double/rem_float for x86/x86-64

This adds inlined version of the rem_double/rem_float bytecodes
for x86/x86-64 platforms. This patch also removes unnecessary
fmod and fmodf stubs from runtime.

Change-Id: I2311aa2adf08d6614527e0da070e3b6ce2343a20
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/x86_lir.h
cf20c1a6d58eb45fb660722354761925b0a103e1 17-Jun-2014 Vladimir Marko <vmarko@google.com> Fix build: style issue.

Change-Id: I2a1e81dc7c95b7e21f4fde47e2f88dae653b25f0
uick/x86/fp_x86.cc
d87c29c7c5f04f643677d87cd202e90bda8fed02 17-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Add x86 inlined abs method for float/double"
35ec2b5faf9a2dbc3c0cddb7ebc09952b8a27d2a 17-Jun-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Clobber r8 to r11 and xmm0 to xmm15

This clobbers r8 to r11 and xmm0 to xmm15, so that
they can be reloaded after an external C call.

Change-Id: If5cac97e475083912026309891dc332f14f8683a
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/x86/target_x86.cc
c41e6dc89ec6593e9af9af524f2ec7be6e2d24a4 13-Jun-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: improve 64-bit immediates loads.

Improve the quick backend to load immediates by choosing the best
of the following strategies:

- use wzr, xzr to load 0 (via mov) or -1 (via mvn),
- use logical immediates (orr),
- use one movz/movn optionally followed by one or more movk,
- use the literal pool.

Change-Id: I8e46e6d9eaf46b717761dd9d60e63ee3f2a5422b
uick/arm64/codegen_arm64.h
uick/arm64/utility_arm64.cc
d6b2237d82507b393cf105a0c6ebf04616bc78a6 16-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "ART: Instanceof returns true if ref == 0 on x86-64"
bd7ebdbd928673f8136dcbe3f755610e3ae9bc7d 16-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "Use GetLow() to access low register of a pair"
b9b9d66fb4eba71b8691f8b1172fe252b3901aad 16-Jun-2014 Mark Mendell <mark.p.mendell@intel.com> Use GetLow() to access low register of a pair

A couple of spots were missed.

Change-Id: I14bd1d1bec4b497b742ef9edaf762e0c8e4ebf79
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/int_x86.cc
57cd219d8a7869a06d669bed08460013cf24398b 16-Jun-2014 buzbee <buzbee@google.com> Merge "Arm64 hard-float"
33ae5583bdd69847a7316ab38a8fa8ccd63093ef 12-Jun-2014 buzbee <buzbee@google.com> Arm64 hard-float

Basic enabling of hard-float for Arm64. In future CLs we'll
consolidate the various targets - there is a lot of overlap.

Compilation remains turned off in this CL, but I expect
to enable a subset shortly. With compilation fully enabled
(including the EXPERIMENTAL opcodes with the exception of
REM and THROW), we get the following run-test results:

003-omnibus-opcode failures:
Classes.checkCast
Classes.arrayInstance
UnresTest2
Haven't gone deep, but these appear to be related to throw/catch and/or
stacktrace.

For REM, the generated code looks reasonable to me - my guess is that
we've got something wrong on the transition to the runtime. Haven't
looked deeper yet, though.

The bulk of the other failure also appear to be related to transitioning
to the runtime system, or handling try/catch.

run-test status:
Status with optimizations disabled, REM_FLOAT/DOUBLE and THROW disabled:
succeeded tests: 94
failed tests: 22
failed: 003-omnibus-opcodes
failed: 004-annotations
failed: 009-instanceof2
failed: 024-illegal-access
failed: 025-access-controller
failed: 031-class-attributes
failed: 044-proxy
failed: 045-reflect-array
failed: 046-reflect
failed: 058-enum-order
failed: 062-character-encodings
failed: 063-process-manager
failed: 064-field-access
failed: 068-classloader
failed: 071-dexfile
failed: 083-compiler-regressions
failed: 084-class-init
failed: 086-null-super
failed: 087-gc-after-link
failed: 100-reflect2
failed: 107-int-math2
failed: 201-built-in-exception-detail-messages

Change-Id: Ib66209285cad8998d77a14781de300af02a96b15
ompiler_enums.h
rontend.cc
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.cc
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
e88b89ad1d1a583daf205c7a387ba13f549f95f1 05-Mar-2014 Yixin Shou <yixin.shou@intel.com> Add x86 inlined abs method for float/double

Add the optimized implementation of inlined abs method for
float/double for X86 side.

Change-Id: I4e095644a90524354040174954c1e127c7bb4ee2
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/utility_x86.cc
954550063b5ac323e31d0b0564b5f9a9a023545c 09-Jun-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: Instanceof returns true if ref == 0 on x86-64

On x86-64 platform rl_result and kArg0 is not the same, so we have to
handle this in the proper way.

Change-Id: Ia651f5dd8dd2cf584f510739ed58b46197dfee94
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/int_x86.cc
8c7a02a7d6eab177b0d34b732522ea6dc491e131 14-Jun-2014 buzbee <buzbee@google.com> Quick compiler:interpret on type mismatch

The Dex specification is a bit loose - particularly in regards
to types. The Quick compiler, though, makes some assumptions
about types. In particular, it doesn't expect to encounter the
use of a long or double virtual register pair that was defined
by two independent 32-bit operations.

dx does not create such patterns (at least in recent memory).
However, at least one such case exists in the wild. The next
version of the Dex specification will add more type constraints
and formally disallow such cases. Meanwhile, existing code will
be handled by identifying these cases an reverting to interpretation
for the offending method.

Fix for internal b/15616104

Change-Id: Ibe9c423be9a952ff58cf8d985aa164885b8dd2ae
rontend.cc
ir_analysis.cc
ir_graph.h
reg_analysis.cc
df88a9e44673655009cc560947d29c1400516f12 14-Jun-2014 Ian Rogers <irogers@google.com> Merge "x86_64: Enable compilation"
136aaee2993a4a5fd93eb9371584161c6d1c7445 06-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Enable compilation

This patch enables compilation of all methods for x86_64
except image.

Change-Id: Ie210809f2595cc25da688a4ad0363c258bcf8233
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
5aa6e04061ced68cca8111af1e9c19781b8a9c5d 14-Jun-2014 Ian Rogers <irogers@google.com> Tidy x86 assembler.

Use helper functions to compute when the kind has a SIB, a ModRM and RegReg
form.

Change-Id: I86a5cb944eec62451c63281265e6974cd7a08e07
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/mips/assemble_mips.cc
uick/mips/codegen_mips.h
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
97ed29f800c56a06fd6989e0883e4c97bedd2453 14-Jun-2014 Andreas Gampe <agampe@google.com> Merge "ART: Hide unreachable basic blocks in the compiler"
4439596b00c91f565370bf0813cc2f9165093693 13-Jun-2014 Andreas Gampe <agampe@google.com> ART: Hide unreachable basic blocks in the compiler

Unreachable blocks are not handled uniformly in the optimization
passes. Uniformly hide them to avoid initialization errors.

Bug: 15573463
Change-Id: Ia9e89fa357d5672a6cd8389f28a06ff618fe60ee
rontend.cc
ir_graph.cc
ir_graph.h
sa_transformation.cc
7e399fd3a99ba9c9dbfafdf14f75dd318fa7d454 11-Jun-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Disable all optimizations and fix bugs

This disables all optimizations and ensures that art tests still pass.

Change-Id: I43217378d6889bb04f4d064f8d53cb3ff4c20aa0
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
rontend.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
169489b4f4be8c5dd880ba6f152948324d22ff79 11-Jun-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Add support for inlined methods

This patch adds support for Arm64 inlined methods.

Change-Id: Ic6aeed6d2d32f65cd1e63cf482f83cdcf958798a
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
e2eb29e98be3ba72cce7da40847ab3d605b9455d 12-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Enable MOVE_*, some CONST_*, CMP_*.

With the fixes of GenArithImmOpLong, GenShiftOpLong, OpRegImm,
OpRegRegImm, OpRegRegImm64, EncodeLogicalImmediate and fmov.

Change-Id: I8cae4f921d5150a6b8e4803ca4dee553928d1a58
rontend.cc
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
c0090a4206306a80a830de35c7b4c74a43df690a 12-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Rewrite use/def masks to support 128 bits."
8dea81ca9c0201ceaa88086b927a5838a06a3e69 06-Jun-2014 Vladimir Marko <vmarko@google.com> Rewrite use/def masks to support 128 bits.

Reduce LIR memory usage by holding masks by pointers in the
LIR rather than directly and using pre-defined const masks
for the common cases, allocating very few on the arena.

Change-Id: I0f6d27ef6867acd157184c8c74f9612cebfe6c16
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/resource_mask.cc
uick/resource_mask.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
adea0aa22790254bf9978984e9ffc3688a41e129 12-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "ART: arm64 explicit stack overflow checks"
f8ec48e8eff0050de1451fc8e9c3a71c26d5ce7e 06-Jun-2014 Stuart Monteith <stuart.monteith@arm.com> ART: arm64 explicit stack overflow checks

Implement only the explicit checks for the quick backend for arm64.
Implicit checks require fault handlers, which are currently unimplemented.

CMN + CMP have extended versions implemented for comparisons against the
stack pointer. More extended opcode implementations will need to follow.

Change-Id: I8db297aec73df818b20fe410297800c886701c76
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/utility_arm64.cc
f72b7d6066238fd3faa25aac671dbaa02aeafac9 12-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: fix MarkGCCard, enabling more MIR opcodes."
3e1e549c564045d852ace46388eb06427d63e6ca 12-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Add D/CHECK_CONSTEXPR macros for use in constexpr context."
a5d74015f320306a770519748757d776b977ec56 12-Jun-2014 Ian Rogers <irogers@google.com> Fix typo comment by removing.

Change-Id: I09764f194317634164be9431328013205fba2910
uick/x86/int_x86.cc
d8191d000413504b33702e0f52e1e8e522a47ec0 11-Jun-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> ART: Add mul_long bytecode for X86-64

This patch implements the inlined version of the mul-long
bytecode for X86-64 platform.

Change-Id: I828e5861e17024d33f09223e0245380aef63a622
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/int_x86.cc
836424805dd48af67088d30992a3f2e6841ca047 11-Jun-2014 Vladimir Marko <vmarko@google.com> Add D/CHECK_CONSTEXPR macros for use in constexpr context.

Make most RegStorage methods constexpr, make StorageSize()
const.

Change-Id: Ie63faa3b081094b3dd30352c6240fdf10ef8b87e
eg_storage.h
c879aaec949f429c9b029bbbfaa76be8872cef0a 11-Jun-2014 Ian Rogers <irogers@google.com> Merge "ART: Update the DecodedInstruction for the Fused extended bytecodes."
a194acf232b761b2ead114bdc6c38af112bf08cd 12-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Clean up ArmMirToLir::LoadDispBody()/StoreDispBody()."
5487494e54e719d3bb4ead7a0b73e1d456fec8da 11-Jun-2014 Ian Rogers <irogers@google.com> Workaround frame size issues.

x86 and x86-64 are exceeding the frame size for the switch interpreter.
The SOMETIMES_INLINE hack doesn't work with GCC as inline and the noinline
attribute are mutually exclusive. As a temporary solution move the effected
code to the the interpreter_common.cc file.
Bug: 14882674

Change-Id: Id5383ef5436046b36565cd1d76de8e3d59f42cff
uick/arm64/target_arm64.cc
e1f65bcb957a65c6d45b319d968bc53a833f2c65 09-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: PassMEDataHolder should have a data field

For passes that would like to pass data around while working, let them actually
allocate it if need be in the Start, use it during the Worker, and
potentially free it during the End.

Change-Id: I03238ef17158f7e2615d6defe5d7f15432c8a511
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
b_optimizations.cc
b_optimizations.h
ass.h
ass_me.h
ost_opt_passes.cc
ost_opt_passes.h
33004d96271f5b6b9dfac165ea61102d0d55a303 16-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Clean up ARM load/store with offset imm8 << 2."
37573977769e9068874506050c62acd4e324d246 16-Jun-2014 Vladimir Marko <vmarko@google.com> Clean up ARM load/store with offset imm8 << 2.

Change-Id: I95ed6860131b99eef7ed727f54745976949cbcb3
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
55884bc1e2e1b324809b462455ccaf5811ffafd8 10-Jun-2014 Mark Mendell <mark.p.mendell@intel.com> X86_64: Proper IMT fix

Unfortunately, 97184: X86_64: Pass 'hidden method index' in EAX wasn't
correct. TargetReg(kInvokeTgt) is ALSO EAX, and so invoke-interface
blows up, since the saved index is overwritten by the generated code.

Change kInvokeTgt to EDI (the same as ARG0).

Change-Id: I4b1d260237274ee26b9283d810d1b74484ea59af
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/target_x86.cc
c26efa86c02c214665d30760df9d6f370d1c9ef1 01-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Update the DecodedInstruction for the Fused extended bytecodes.

The BasicBlockOpt function creates extended MIRs but does not update the
associated DecodedInstruction. This results in an impossibility to re-create
the SSA algorithm.

Change-Id: I4a6393281e0ee52094f72f3de0001858c3d41ba3
Signed-off-by: Jean Christophe Beyler
ir_optimization.cc
db9d523ff305721d4ca3f1470d1b2ce64c736e0a 10-Jun-2014 Vladimir Marko <vmarko@google.com> Clean up ArmMirToLir::LoadDispBody()/StoreDispBody().

Refactor the 64-bit load and store code to use a shared
helper function that can be used for any opcode with the
displacement limited to 8-bit value shifted by 2 (i.e. max
1020). Use that function also for 32-bit float load and
store as it is actually better than the old code for
offsets exceeding the 1020 byte limit.

Change-Id: I7dec38bae8cd9891420d2e92b1bac6138af5d64e
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
fd2e291297463a3d5bdb18adc2a1eacbe2759152 06-Jun-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: fix MarkGCCard, enabling more MIR opcodes.

Fixing register usage in MarkGCCard. Also enabling more MIR opcodes in
the compiler filter.

Change-Id: I877250f8deaefc69115e861344ca47cc5ccea8ff
rontend.cc
uick/arm64/call_arm64.cc
uick/arm64/utility_arm64.cc
ea248f8b048d904a8fe806b6a52372985945274d 10-Jun-2014 Ian Rogers <irogers@google.com> Remove TARGET_REX_SUPPORT define.

Change-Id: I1c3644176c101064261d13b50484d2e3ae456316
uick/x86/target_x86.cc
uick/x86/x86_lir.h
fd755e0034373eea3c4c420a870f6f6bbf729734 10-Jun-2014 Ian Rogers <irogers@google.com> Merge "X86_64: Pass 'hidden method index' in EAX"
0f9b9c508814a62c6e21c6a06cfe4de39b5036c0 09-Jun-2014 Ian Rogers <irogers@google.com> Tidy up x86 assembler and fix byte register encoding.

Also fix reg storage int size issues.
Also fix bad use of byte registers in GenInlinedCas.

Change-Id: Id47424f36f9000e051110553e0b51816910e2fe8
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/x86_lir.h
a0b0ba04bd733d487dfe5b443dbc72894d63a46a 10-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "X86_64: Fix core.oat compilation issues"
846447a1d550771a78696f7ae05e066223e6b456 10-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Reduce dex2oat compilation logs"
88c3484eb7a9956f69f41ced53deeac126a258fc 10-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: fix and enable sparse- and packed-switch."
d3703d82a0afc28a4ea0cb0f6d88e9f8adc23e43 09-Jun-2014 Mark Mendell <mark.p.mendell@intel.com> X86_64: Pass 'hidden method index' in EAX

Method* is in EDI, and EAX isn't an argument register, so EAX is free
to hold the hidden method index.

Change-Id: I793a54d00a4593e140f97144419d849b53bfdf44
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_invoke.cc
uick/x86/target_x86.cc
30022aff96bfcce588cd15f8f46f3f720f69c471 06-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Reduce dex2oat compilation logs

Disable printing of all compiled methods to logcat.

Change-Id: Ie210809f2595cc25da688a4ad0363c258bcf9233
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
ade54a2fba4ec977dc4ff019004a2ba68e9ea075 09-Jun-2014 Mark Mendell <mark.p.mendell@intel.com> X86_64: Fix core.oat compilation issues

Fix neg-long and X86Mir2Lir::GenInstanceofFinal

Change-Id: I7fbcc1a89857cc461f74b55573ac6cb7c8e64561
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
5acc8b0e23b12b481a9e97f84d084b79cd544319 05-Jun-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: fix and enable sparse- and packed-switch.

Changed implementation of sparse- and packed-switch to use w and x
registers appropriately. Also added a couple of utilities to obtain a
w/s register corresponding to a given x/d register and viceversa.

Change-Id: I485a110f6e91b09227d9e2a0b8b14224a10bca90
rontend.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
2d41a655f4f0e4b2178bbd7e93901a5ed6eae4a6 09-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix kOpLsl, rem-float/double.

Change-Id: I6f7293493c0f94f96882d2e559e3eef659a23aec
uick/arm64/fp_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_invoke.cc
a014776f4474579d4dfc72e3374ba45c6f6e5f35 07-Jun-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Add long bytecode supports (2/2)

This patch adds implementation of math and complex long bytcodes,
and basic long arithmetic.

Change-Id: I811397d7e0ee8ad0d12b23d32ba58314d479d714
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_common.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
e0ccdc0dd166136cd43e5f54201179a4496d33e8 07-Jun-2014 Chao-ying Fu <chao-ying.fu@intel.com> x86_64: Add long bytecode supports (1/2)

This patch includes switch enabling and GenFillArray,
assembler changes, updates of regalloc behavior for 64-bit,
usage in basic utility operations, loading constants,
and update for memory operations.

Change-Id: I6d8aa35a75c5fd01d69c38a770c3398d0188cc8a
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_loadstore.cc
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
8550197244d470bf7645075e5400750f2cab4e42 07-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Hard Float ABI support in QCG"
58994cdb00b323339bd83828eddc53976048006f 16-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Hard Float ABI support in QCG

This patch shows our efforts on resolving the ART limitations:
- passing "float"/"double" arguments via FPR
- passing "long" arguments via single GPR, not pair
- passing more than 3 agruments via GPR.

Work done:
- Extended SpecialTargetRegister enum with kARG4, kARG5, fARG4..fARG7.
- Created initial LoadArgRegs/GenDalvikX/FlushIns version in X86Mir2Lir.
- Unlimited number of long/double/float arguments support
- Refactored (v2)

Change-Id: I5deadd320b4341d5b2f50ba6fa4a98031abc3902
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ompiler_enums.h
rontend.cc
uick/arm/target_arm.cc
uick/arm64/target_arm64.cc
uick/gen_invoke.cc
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
576ca0cd692c0b6ae70e776de91015b8ff000a08 07-Jun-2014 Ian Rogers <irogers@google.com> Reduce header files including header files.

Main focus is getting heap.h out of runtime.h.

Change-Id: I8d13dce8512816db2820a27b24f5866cc871a04b
uick/arm/call_arm.cc
uick/arm64/call_arm64.cc
uick/mips/call_mips.cc
uick/x86/call_x86.cc
14108093a9f31472ff0f400dd2d34b1d856b7d19 06-Jun-2014 Vladimir Marko <vmarko@google.com> Merge "Use ScopedArenaVector instead of std::vector in SSA transformation."
20aa7cbe93d782e0e756a36e70d610fe84b4bbb4 06-Jun-2014 Calin Juravle <calin@google.com> Merge "Fixed and refactored profiler options handling"
c1b643cc6ac45dbd0eabdcd7425c7e86006c27d6 31-May-2014 Calin Juravle <calin@google.com> Fixed and refactored profiler options handling

- extracted profiler options in a separate class
- switched from system property reading to command line arguments
- added profile based compilation options to CompilerOptions
- removed no longer used kProfile compilation filter
- optimize dex files only if the profiler is enabled
- clean up unused arguments

Bug: 12877748
Bug: 15275634
Change-Id: I37ff68e7694370950ce8db2360562e9058ecebb7
rontend.cc
ir_analysis.cc
c9360ce1f1dabb4075b09dd6db49ee6d4212a6fc 05-Jun-2014 Vladimir Marko <vmarko@google.com> Use ScopedArenaVector instead of std::vector in SSA transformation.

Change-Id: Ibf8471274f2d5e11fcc185044745434c3c82ed74
ir_optimization_test.cc
sa_transformation.cc
04f4d8abe45d6e79eca983e057de76aea24b7df9 30-May-2014 Wei Jin <wejin@google.com> Add an optimization for removing redundant suspend tests in ART

This CL:
(1) eliminates redundant suspend checks (dominated by another check),

(2) removes the special treatment of the R4 register, which got
reset on every native call, possibly yielding long execution
sequences without any suspend checks, and

(3) fixes the absence of suspend checks in leaf methods.

(2) and (3) increase the frequency of suspend checks, which improves
the performance of GC and the accuracy of profile data. To
compensate for the increased number of checks, we implemented an
optimization that leverages dominance information to remove
redundant suspend checks on back edges. Based on the results of
running the Caffeine benchmark on Nexus 7, the patch performs
roughly 30% more useful suspend checks, spreading them much more
evenly along the execution trace, while incurring less than 1%
overhead. For flexibility consideration, this CL defines two flags
to control the enabling of optimizations. The original
implementation is the default.

Change-Id: I31e81a5b3c53030444dbe0434157274c9ab8640f
Signed-off-by: Wei Jin <wejin@google.com>
ir_graph.cc
ir_graph.h
uick/arm/arm_lir.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/mir_to_lir.cc
76af0d307194045ece429dbaf62e93d3e08c6c20 05-Jun-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Turn on 64-bit core registers initialization.

This enables 64-bit core registers initialization for x86_64.
The backend update with 64-bit temp support is in progress.

Change-Id: If7c9a62c1145f81050adda86f2beed427220baa2
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/target_x86.cc
089142cf1d0c028b5a7c703baf0b97f4a4ada3f7 05-Jun-2014 Vladimir Marko <vmarko@google.com> Avoid register pool allocations on the heap.

Create a helper template class ArrayRef and use it instead
of std::vector<> for register pools in target_<arch>.cc to
avoid these heap allocations during program startup.

Change-Id: I4ab0205af9c1d28a239c0a105fcdc60ba800a70a
uick/arm/target_arm.cc
uick/arm64/target_arm64.cc
uick/mips/target_mips.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/target_x86.cc
511c8a653d5896e81428393a1c3d427da64e36f3 03-Jun-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix cmp-long and method with long arguments.

1. Fix cmp-long.
2. Use single register to pass long argument.
3. Flush StackReference<ArtMethod> on arm64 the same as in common code.
3. Fix the mismatch in calculate reg offset.

Change-Id: Ie2723260fb143512e4da6ee88d4f3aded80d3d5e
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/gen_invoke.cc
ca9da5090a946331ca5e72a39c6f70721d3b326c 03-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "Correct another RegStorage::Solo32"
d44f1a6027b04c0d080089e6a8d87a4d19b5933f 03-Jun-2014 Mark Mendell <mark.p.mendell@intel.com> Correct another RegStorage::Solo32

It should be RegStorage::FloatSolo32

Change-Id: Iadfc6654254e5a1d117b35cc2d88ceb7057cc30d
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/utility_x86.cc
e997429dec7fd0682abc3c3f9885c64af1be6386 03-Jun-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: split list of opcodes in compiler filter."
87662da8f55e3a21ac8f4f6d970035708c933c0b 03-Jun-2014 buzbee <buzbee@google.com> Merge "Quick compiler: reference cleanup"
ec3f3d14915ec8f8c59bb88190928faa63ed9eb8 29-May-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: split list of opcodes in compiler filter.

Some of the opcodes that are currently enabled in the compiler
filter are generating assertion failures when using libartd.so.
In this patch, these opcodes are marked as experimental
via #if ... #endif and are disabled. This allows using libartd.so
to run the tests and for development. Further commits will follow
to fix the assertion issues.

Change-Id: I9493fddc281542cb15ced38b262f37f4ef4f0870
rontend.cc
a0cd2d701f29e0bc6275f1b13c0edfd4ec391879 01-Jun-2014 buzbee <buzbee@google.com> Quick compiler: reference cleanup

For 32-bit targets, object references are 32 bits wide both in
Dalvik virtual registers and in core physical registers. Because of
this, object references and non-floating point values were both
handled as if they had the same register class (kCoreReg).

However, for 64-bit systems, references are 32 bits in Dalvik vregs, but
64 bits in physical registers. Although the same underlying physical
core registers will still be used for object reference and non-float
values, different register class views will be used to represent them.
For example, an object reference in arm64 might be held in x3 at some
point, while the same underlying physical register, w3, would be used
to hold a 32-bit int.

This CL breaks apart the handling of object reference and non-float values
to allow the proper register class (or register view) to be used. A
new register class, kRefReg, is introduced which will map to a 32-bit
core register on 32-bit targets, and 64-bit core registers on 64-bit
targets. From this point on, object references should be allocated
registers in the kRefReg class rather than kCoreReg.

Change-Id: I6166827daa8a0ea3af326940d56a6a14874f5810
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
03dbc04d1d5a3bd62801989b16e994a9ed0dafb5 02-Jun-2014 Ian Rogers <irogers@google.com> Make class status volatile.

Discourage loads and stores from reordering around the status being updated.
Bug: 15347354

Change-Id: Ice805cb834617747c8209e98a142d3e5c7585719
uick/gen_common.cc
a4307aca310aac0ac62dcb5435daa02b1f950558 02-Jun-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Fix comments and link before MIR to next in Remove method

There are some comments without a period at the end and the remove does not
link the MIR before the one we want to remove to the one after.

Change-Id: Ia1263d3191e39b4f8f76ef62b28f7fbb1c6c0403
Signed-off-by: Jean Christophe Beyler jean.christophe.beyler@intel.com
ir_graph.cc
e4283be97047a26d3476acd3863dcc386498be17 01-Jun-2014 buzbee <buzbee@google.com> Merge "Quick compiler: fix array overrun."
35ba7f3a78d38885ec54e61ed060d2771eeceea7 31-May-2014 buzbee <buzbee@google.com> Quick compiler: fix array overrun.

MIRGraph::InlineCalls() was using the MIR opcode to recover
Dalvik instruction flags - something that is only valid for
Dalvik opcodes and not the set of extended MIR opcodes.

This is probably the 3rd or 4th time we've had a bug using
the MIR opcode in situations that are only valid for the Dalvik
opcode subset. I took the opportunity to scan the code for
other cases of this (didn't find any), and did some cleanup while
I was in the neighborhood.

We should probably rework the DalvikOpcode/MirOpcode model whenver we
get around to removing DalvikInstruction from MIR.

Internal bug b/15352667: out-of-bound access in mir_optimization.cc

Change-Id: I75f06780468880892151e3cdd313e14bfbbaa489
rontend.cc
ir_analysis.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/dex_file_method_inliner.cc
uick/mir_to_lir.cc
uick/x86/utility_x86.cc
reg_analysis.cc
b20c373e45200102eaf2d4aac35d366067e0074b 30-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Enable extended MIR"
22460ecbaae7e489a3bc17a2adb2e7e9d0028f9c 30-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: Method* as a reference"
3326027d2cc52463db3786a860cf238e8feb349e 30-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: x86_64 workaround"
fd5a852e49796374899772381f15c9033dae0057 30-May-2014 Narayan Kamath <narayan@google.com> Fix build.

Lint error due to a wrong #include guard.

Change-Id: I3b5d56c412580ec14f5c09b859a1bd6f9eb667ee
ass_driver_me_post_opt.h
ost_opt_passes.h
05e27ff942b42e123ea9519d13d31070ab96f0ac 28-May-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Enable extended MIR

This patch enables all the extended MIR opcodes for ARM64. Please note
that currently the compiler will never generate these opcodes since the
BB optimisations are not enabled.

Change-Id: Ia712b071f62301db868297d37567795128b5bf2e
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
rontend.cc
ir_optimization.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
2469e60e6ff08c2a0b4cd1e209246c5d91027679 07-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Setting up cleanup

- Moved code around to actually have the clean-up code in a PassDriver format.
This allows us to better control what is being called after an optimization
It also allows the use of a centralized pass system for both optimizations
and cleanup.

Change-Id: I9d21e9bb9ee663739722f440d82adf04f73e380c
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
b_optimizations.cc
b_optimizations.h
rontend.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization_test.cc
ass_driver_me.cc
ass_driver_me.h
ass_driver_me_opts.cc
ass_driver_me_opts.h
ass_driver_me_post_opt.cc
ass_driver_me_post_opt.h
ass_me.h
ost_opt_passes.cc
ost_opt_passes.h
sa_transformation.cc
d9f4c52071b305b777c7d7d08176b19882b393d8 30-May-2014 buzbee <buzbee@google.com> Quick compiler: x86_64 workaround

A recent CL changed the allocation of temp registers destined to
hold a reference such that on 64-bit systems a 64-bit register
would be allocated. However, for bring-up purposes, the x86_64
backend wants the ability to continue holding long values in a
register pair.

Change-Id: I25d9f755fafbe96144226677f85c6d5cad1ffa76
uick/ralloc_util.cc
f2c3e564fa9e484c29f35f10d4659ab2d7b8614a 29-May-2014 buzbee <buzbee@google.com> Quick compiler: Method* as a reference

This is the first of two CLs intended to fix up and make consistent
the handling of references in the Quick backend. A sibling
CL c/96237 updates the runtime to treat Method* as a compressed
reference when stored. This CL makes a similar change for the
backend.

As far as the general handling of in-register references, though,
the current Quick backend is not consistent even for non-Method*
references. Sometimes they are treated as references, but other
times are handled as if they were 32-bit ints. A subsequent CL
will deal with that issue.

Change-Id: I5591c5eea6cca6ed22208ab806fd38b959c9d03d
uick/gen_invoke.cc
reg_analysis.cc
ea0b6e284cab12eed88eebf6aa19e6292af57389 29-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: fixing some assertions."
2ac01fc279e8397beacf90302b0f215040eb78fa 22-May-2014 Vladimir Marko <vmarko@google.com> Improve tracking of memory locations in LVN.

Rewrite the tracking of values stored in memory to allow
recognizing the same value after storing it in memory and
loading it back to vreg. Drop reliance on value name
ordering for memory versioning in preparation for GVN.

Also fix a few minor issues in LVN.

Change-Id: Ifabe2d47d669d9ec43942cea6fd157e41af77ec8
ocal_value_numbering.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_optimization.cc
0955f7e470fb733aef07096536e9fba7c99250aa 23-May-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: fixing some assertions.

Fixing some assertions while attempting to get libartd.so to work.
Fixing also the shift logic in LoadBaseIndexed() and StoreBaseIndexed().
This commit only fixes a part of the assertion issues.

Change-Id: I473194d4260dd59a8ee6d73114429728c977ee0e
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
a9f1ce6fbe8a9247d0d8e20727f590b091e816da 28-May-2014 Vladimir Marko <vmarko@google.com> Fix pass driver's dump_pass_list_ and print_pass_list_.

The lists were allocated with new char[], so they should
have been held by std::unique_ptr<const char[]> rather than
std::unique_ptr<const char>. However, it's much cleaner with
std::string.

Change-Id: Ie7c604773272194345f5e6e3c4803c3a914edf99
ass_driver.h
ass_driver_me.cc
6d25996baef5037d0aa8beb2f517755f2fb7b91f 28-May-2014 Ian Rogers <irogers@google.com> Merge "ART: Print and dump functionalities per pass"
32f38c0775aba280fe02e8fafe0d35a5debc4eac 28-May-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Support r8-r15, xmm8-xmm15 in assembler"
32c02c15b879174bb8ae13b964ba1f49eb5c6e70 28-May-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Add 64-bit version of instructions in asm"
a20468c004264592f309a548fc71ba62a69b8742 30-Apr-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Support r8-r15, xmm8-xmm15 in assembler

Added REX support. The TARGET_REX_SUPPORT should be used during build.

Change-Id: I82b457ff5085c8192ad873923bd939fbb91022ce
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
33a60e47278d09acfa44d92ad85b1902b57a6b5b 27-May-2014 Bill Buzbee <buzbee@android.com> Merge "Set the type of a RegStorage correctly"
67c482f6737343f3afbf214995d67d98b0b36c91 27-May-2014 buzbee <buzbee@google.com> Merge "Art compiler: remove unnecessary sqrt call"
055c29fd0f752328981f1b7ccadb1862eecedd40 27-May-2014 buzbee <buzbee@google.com> Art compiler: remove unnecessary sqrt call

For reasons lost in the mists of time, the Dalvik JIT tested
the results of an inlined sqrt for NaN on Arm targets, and then
called an out-of-line routine to recompute if true. The Quick
compiler inherited this behavior. It is not necessary, and the CL
purges it (along with the out-of-line sqrt entrypoint).

Change-Id: I8c8fa6feacf9b7c3b9e190dfc6f728932fd948c6
uick/arm/fp_arm.cc
6c35a6ba61a190cfd3698bba0aa14038a0867cfe 27-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: generalize NarrowRegLoc()"
0c52451e9be14a6bff9ffefce89ff1d60691af60 27-May-2014 Mark Mendell <mark.p.mendell@intel.com> Set the type of a RegStorage correctly

This will be used as a FP value, so call the right function to create
the RegStorage.

Change-Id: I2bd832746afac509d20f195a7770f2fbd215cbd7
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/utility_x86.cc
96992e8f2eddba05dc38a15cc7d4e705e8db4022 19-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Add 64-bit version of instructions in asm

Add missed 64-bit versions of instructions.

Change-Id: I8151484d909dff487cb7e521494a0be249a42214
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
8bceccec7eddff8cd872aa20505b4a3a6be60a16 29-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Print and dump functionalities per pass

LOG is a great logging tool but sometimes a pass has some debugging text it
want to be able to turn on/off easily.

By going via a print_pass flag, we can actually turn it on/off easily per pass
when debugging/instrumenting.

- Added a pass printer to help debug messages for future passes.
- Added a print_pass flag in CompilationUnit to filter out messages.

At the same time, did a similar system for dumping the CFG.

- Also moved some API into public from protected.

Change-Id: Ie0e89a8fc773e8583f3e4ffd6e4bd2eebdbb2bf4
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ompiler_ir.h
rontend.cc
ass.h
ass_driver.h
ass_driver_me.cc
ab5b370e44629332e73ffd66bfe8b8a924236c5c 27-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Add suspend check in managed code."
bbc66c5855fa4f36b6f94311607f0119a93d809a 27-May-2014 Bill Buzbee <buzbee@android.com> Merge "ART: Better SSA Allocation when recreating SSA"
4896d7b6fb75add25f2d6ba84346ac83d8ba9d51 02-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Better SSA Allocation when recreating SSA

The SSA calculation is not allocation friendly. This makes the
SSARepresentation remember how much is allocated and not reallocate
if SSA should be recalculated.

Also added some allocation friendly code for the dominance code.

Change-Id: Icd5586b7e2fefae8e1535975ab400b1ca95b500f
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ir_dataflow.cc
ir_graph.cc
ir_graph.h
sa_transformation.cc
032d3775552e27eda98af2066306b773f3762b64 23-May-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Enable FLOAT and DOUBLE opcodes

This patch enables all the DOUBLE and FLOAT opcodes except for REM ones.
It has been tested and passes all Dalvik tests except for:

failed: 018-stack-overflow[pid=1076]
failed: 107-int-math2[pid=1593]

Change-Id: I581f219bde354e3402aa3ad6e24ef15566da5f78
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
ompiler_enums.h
rontend.cc
uick/arm64/fp_arm64.cc
48241e786121e1c4c050d9cfad3d22de270a3e75 23-May-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Add suspend check in managed code.

TODO: Remove x19 in the frame in runtime, generic jni, compiled jni.

Change-Id: Ibdc292c9e7adb3a5d3eff353c22f60ffc101f549
rontend.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
85089dd28a39dd20f42ac258398b2a08668f9ef1 26-May-2014 buzbee <buzbee@google.com> Quick compiler: generalize NarrowRegLoc()

Some of the RegStorage utilites (DoubleToLowSingle(),
DoubleToHighSingle(), etc.) worked only for targets which
which treat double precision registers as a pair of aliased
single precision registers.

This CL elminates those utilities, and replaces them with
a new RegisterInfo utility that will search an aliased register
set and return the member matching the required storage
configuration (if it exists).

Change-Id: Iff5de10f467d20a56e1a89df9fbf30d1cf63c240
uick/arm/fp_arm.cc
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
eg_storage.h
cd9b4e287c20b14655d21e3f349733e80a5aaf23 24-May-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Rebase on top of "64-bit temp register support""
fe94578b63380f464c3abd5c156b7b31d068db6c 22-May-2014 Mark Mendell <mark.p.mendell@intel.com> Implement all vector instructions for X86

Add X86 code generation for the vector operations. Added support for
X86 disassembler for the new instructions.

Change-Id: I72b48f5efa3a516a16bb1dd4bdb5c9270a8db53a
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
eg_storage.h
8c895b3385ed96a0b040c35222c0338058895d49 24-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: fix register clobbering."
642fe34958ba7fafa81341823241616edde0380c 24-May-2014 buzbee <buzbee@google.com> Quick compiler: fix register clobbering.

Ensure all aliased children of a register set are clobbered
when any member is clobbered. Additionally, use a clobbering
mask to avoid clobbering non-overlapping siblings.

Change-Id: Ic0d88a30f3e5b7a359396f6541d602739fa3124a
uick/mir_to_lir.h
uick/ralloc_util.cc
0999a6f7c83d10aa59b75f079f0d2fdbac982cf7 21-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Rebase on top of "64-bit temp register support"

Added the 64-bit core/temp register definition, fixed RegisterPool
creation for x86_64 so that 64-bit core/temps are NOT used for now.
The long arithmetic still operates with register pair on x86_64 and
it is a subject for change in a separate patch.

Change-Id: I2be06d5aefaf80141983bc9d8ed8a2ee24c2b21b
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/x86/target_x86.cc
uick/x86/x86_lir.h
919ed6b2e2aa58a6153eb1d74edc29edc50d514a 24-May-2014 Bill Buzbee <buzbee@android.com> Merge "Revert "ART: Better SSA Allocation when recreating SSA""
d4750f202170a448119c1813a964574bfea0dded 24-May-2014 Bill Buzbee <buzbee@android.com> Revert "ART: Better SSA Allocation when recreating SSA"

Temporarily reverting until memory footprint cost of adding a vreg to ssa entrance map on every applicable MIR node can be assessed..

This reverts commit cb73fb35e5f7c575ed491c0c8e2d2b1a0a22ea2e.

Change-Id: Ia9c03bfc5d365ad8d8b949e870f1e3bcda7f9a54
ir_dataflow.cc
ir_graph.cc
ir_graph.h
sa_transformation.cc
be7ba65210f0eb9cd86b3b76337020b039191ba6 24-May-2014 Ian Rogers <irogers@google.com> Merge "ART: Better SSA Allocation when recreating SSA"
8512758d1208d3c32bf67db9c925b8fc6e077fd7 12-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: BasicBlock API Implementation

- Adding BasicBlock Utility functions.

Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
Change-Id: Ia264b4e68a9a56441ca143f1d98e5a333cf87b29
ir_graph.cc
ir_graph.h
82f3c1b76a19f196a482cad9d5c1aac769d5a397 23-May-2014 Ian Rogers <irogers@google.com> Merge "ART: API to dex instructions"
e24580a135aa6e85cdc49426ec74d2ae1e326243 23-May-2014 Vladimir Marko <vmarko@google.com> Merge "Rewrite BitVector index iterator."
a5b8fde2d2bc3167078694fad417fddfe442a6fd 23-May-2014 Vladimir Marko <vmarko@google.com> Rewrite BitVector index iterator.

The BitVector::Iterator was not iterating over the bits but
rather over indexes of the set bits. Therefore, we rename it
to IndexIterator and provide a BitVector::Indexes() to get
a container-style interface with begin() and end() for range
based for loops.

Also, simplify InsertPhiNodes where the tmp_blocks isn't
needed since the phi_nodes and input_blocks cannot lose any
blocks in subsequent iterations, so we can do the Union()
directly in those bit vectors and we need to repeat the loop
only if we have new input_blocks, rather than on phi_nodes
change. And move the temporary bit vectors to scoped arena.

Change-Id: I6cb87a2f60724eeef67c6aaa34b36ed5acde6d43
b_optimizations.cc
b_optimizations.h
it_vector_block_iterator.cc
it_vector_block_iterator.h
ir_graph.cc
ir_graph.h
sa_transformation.cc
61bc2b3770c8078c7dbe1a9fd4faf0ab1c129701 23-May-2014 Vladimir Marko <vmarko@google.com> Remove obsolete pass_driver.cc .

Obsoleted by https://android-review.googlesource.com/93433 .

Change-Id: I01865d17160fdc698f43c61fa4f5642d0f1391d9
ass_driver.cc
567e9dbc65ee183cda2a052dbf224c8c4a8f9423 23-May-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Disable optimizations on x86_64"
4c80043aa75d0dfa62dd2fd1845bc2b92110336d 07-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Disable all intrinsics

Intrinsics are subject to rework for x86_64 and disabled for now.

Change-Id: Ice67db083fe43dc4faa9276faf02234a4a24f207
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/gen_invoke.cc
ba279d9b7b3fd065ffbeae6b2dc2997af2d20aa4 16-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Disable optimizations on x86_64

This patch disables all QCG optimizations as ARM64 does.
Optimizations are subject to step-by-step enabling according
to test results.

Change-Id: Idd6e10f3b67e8c0f1f029bb26a0e9bf40061aeac
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
d293fb40cf1cd23ead34f6002da037cead69cba2 19-May-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86: For integer ALU operation handle v+=v case

When destination and operand are the same Virtual Register
we should ensure that destination RegLocation is updated after
operand is loaded with LoadValue in physical register.

Change-Id: I59da106471b0c494203af01c99583f51dbc0f9ee
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
54d36b6bf280c22ae69280feffa9d65d6417b153 23-May-2014 Chao-ying Fu <chao-ying.fu@intel.com> Create two CompilerTemp for a wide compiler temp

We create a new CompilerTemp for the high part of
a wide compiler temp to fix counting compiler temps.
Otherwise, assertion failures may happen inside
GetNumUsedCompilerTemps(), if there are any wide compiler temps.
Previously, we never ask for a wide compiler temp, such that
we don't hit the issue.

Change-Id: I9e79ad15e4192665b9d8a9dae5a5453496e48a79
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
ir_optimization.cc
5ef3d95466ffdea0f4348a64218d08b1b5a29aa7 23-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Enable LONG_* and INT_* opcodes."
c3db20b7e6f847339d6ecbd89846c173a7ccc967 06-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: API to dex instructions

- Added the GetConstant function call in DecodedInstruction.
- Added a few rewriter helper functions for later higher level rewriting.
- Added Setter/Getter data and query functions.
- Added Clobber memory/Const/Call/Cast data and query functions.
- Added expression information (add, multiply, ...).
- Added a IsLinear function for additions and subtractions.

- Added an empty constructor for the DecodedInstruction:
- Useful for the creation of a MIR constructor too.
- Added the IsConditionalBranch utility function.

Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
Change-Id: Ie21f2a7779b38c1b383334f04126c2d792cae462
ir_graph.cc
ir_graph.h
44e5bdec17d0528b90cc0773be2beb76dcafdc5b 29-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Topological Sort Traversal Implementation

- Added a topological sort implementation for traversal.
- Useful for traversals that require traversing the predecessors first.
- Added a function to BasicBlock to detect if it is an exception block.

Change-Id: I573da1768a635c6fd0259573dbb46b112132e129
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ataflow_iterator.h
ir_graph.cc
ir_graph.h
ass.h
ass_driver.cc
ass_me.h
ed65c5e982705defdb597d94d1aa3f2997239c9b 22-May-2014 Serban Constantinescu <serban.constantinescu@arm.com> AArch64: Enable LONG_* and INT_* opcodes.

This patch fixes some of the issues with LONG and INT opcodes. The patch
has been tested and passes all the dalvik tests except for 018 and 107.

Change-Id: Idd1923ed935ee8236ab0c7e5fa969eaefeea8708
Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
rontend.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
eg_storage.h
4f59668b3d51f63601ebe59dbd2b7e8a7c5bd093 01-May-2014 James C Scott <james.c.scott@intel.com> ART: Pass driver generalization

- Generalizing Pass Driver.
- Migrating ME Pass Driver to use the new generalized Pass Driver.

There will be some more changes after in the compiler code to generalize
it a bit more by separating what is being done by the optimizing passes
and post-pass cleanups.

Change-Id: I140a70e88483d7c3991b7d336bd593b2613ae194
Signed-off-by: James C Scott <james.c.scott@intel.com>
b_optimizations.cc
b_optimizations.h
rontend.cc
ass.h
ass_driver.h
ass_driver_me.cc
ass_driver_me.h
ass_me.h
3aa57730e2aec451bb836918d936c6862598d8d6 17-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: MIR, SSARepresentation, and BasicBlock Additional API

Adding the API calls to the MIR structure to help with higher level code.
Some code has been added to BasicBlock as well for the removal.
Some code has also been added to SSARepresentation.
A constructor has been added to DecodedInstruction.

Change-Id: Ie65948d53d83fd8250545c94c88b442a68d702c7
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ir_graph.cc
ir_graph.h
uick/dex_file_method_inliner.cc
sa_transformation.cc
481b4027849c8c8b0f6f25a2d5c460e11f8eb64d 22-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: free up space in MIR."
7bf9c46e93c6f7551f2645cf9bbd1ec9f797c86c 22-May-2014 Vladimir Marko <vmarko@google.com> Merge "Method inlining across dex files in boot image."
a51a0b0300268b605e3ad71b0e87ff394032c5e7 21-May-2014 Vladimir Marko <vmarko@google.com> Method inlining across dex files in boot image.

Fix LoadCodeAddress() and LoadMethodAddress() to use the dex
file in addition to the method index to uniquely identify
the literal. With that fix in place, when we have both the
direct code and the direct method, we can safely pass the
actual target method id instead of the method id from the
same dex file in the method lowering info. This was already
done for calls from apps into boot image (and thus there was
a bug with a tiny risk of the wrong literal being used) and
now we also do that for calls within the boot image. The
latter allows the inlining pass to inline many more methods
than before in the boot image.

Bug: 15021903
Change-Id: Ic765ce9809b43ef07e7db32b8e3fbc9acb09147f
uick/codegen_util.cc
uick/mir_to_lir.h
ef562fdef7e0071cae11e07a9e53fb152d0934b8 21-May-2014 buzbee <buzbee@google.com> Quick compiler: free up space in MIR.

The width field in MIR isn't especially useful - it could always
be recalculated from the Dalvik instruction. This CL eliminates
it to allow the 16 bits it occupied to be used for the ID of the
parent BasicBlock.

Change-Id: I75ab8562ca217f0f819ecfc417014dee74bc587e
ocal_value_numbering_test.cc
ir_graph.cc
ir_graph.h
ir_optimization_test.cc
uick/dex_file_method_inliner.cc
b01bf15d18f9b08d77e7a3c6e2897af0e02bf8ca 14-May-2014 buzbee <buzbee@google.com> 64-bit temp register support.

Add a 64-bit temp register allocation path. The recent physical
register handling rework supports multiple views of the same
physical register (or, such as for Arm's float/double regs,
different parts of the same physical register).

This CL adds a 64-bit core register view for 64-bit targets. In
short, each core register will have a 64-bit name, and a 32-bit
name. The different views will be kept in separate register pools,
but aliasing will be tracked. The core temp register allocation
routines will be largely identical - except for 32-bit targets,
which will continue to use pairs of 32-bit core registers for holding
long values.

Change-Id: I8f118e845eac7903ad8b6dcec1952f185023c053
rontend.cc
rontend.h
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/codegen_util.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
9593976c3753b6ff6390cd022d70ed7e116dc847 20-May-2014 Ian Rogers <irogers@google.com> Merge "Allow X86 QBE to be extended"
e87f9b5185379c8cf8392d65a63e7bf7e51b97e7 30-Apr-2014 Mark Mendell <mark.p.mendell@intel.com> Allow X86 QBE to be extended

Enhancements and updates to allow X86Mir2LIR Backend to be subclassed
for experimentation. Add virtual in a whole bunch of places, and make
some other changes to get this to work.

Change-Id: I0980a19bc5d5725f91660f98c95f1f51c17ee9b6
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ir_graph.h
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
9cdf48e03c302e03e2ec118a22cbdfae460b1665 20-May-2014 buzbee <buzbee@google.com> Arm64 - update fp callee save base

Hit commit button too quickly - this should have been part
of CL 95013.

Change-Id: I4a733414db74d6e9cab2d8fbe2eb9b398fff3f45
uick/arm64/arm64_lir.h
214eee43f1507b3bc8595bf0d438ba97d21dc7a3 20-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: fixes in A64 code generation."
607fa7b07233a7233ebe21bba8f3e7c1925ae0f2 20-May-2014 Ian Rogers <irogers@google.com> Merge "Now we have a proper C++ library, use std::unique_ptr."
700a402244a1a423da4f3ba8032459f4b65fa18f 20-May-2014 Ian Rogers <irogers@google.com> Now we have a proper C++ library, use std::unique_ptr.

Also remove the Android.libcxx.mk and other bits of stlport compatibility
mechanics.

Change-Id: Icdf7188ba3c79cdf5617672c1cfd0a68ae596a61
ompiler_ir.h
rontend.h
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_analysis.cc
ir_graph.h
ir_optimization.cc
uick/codegen_util.cc
sa_transformation.cc
erified_method.cc
082833c8d577db0b2bebc100602f31e4e971613e 18-May-2014 buzbee <buzbee@google.com> Quick compiler, out of registers fix

It turns out that the register pool sanity checker was not
working as expected, leaving some inconsistencies unreported.
This could result in "out of registers" failures, as well
as other more subtle problems.

This CL fixes the sanity checker, adds a lot more check and cleans
up the previously undetected episodes of insanity.

Cherry-pick of internal change 468162

Change-Id: Id2da97e99105a4c272c5fd256205a94b904ecea8
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
bc6d197cdb02eeac0c98ec4ed37f530b003a4e7a 13-May-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: fixes in A64 code generation.

- Disabled special method compilation, as it requires hard-float ABI,
- Disabled suspend checks, as runtime is not yet ready (e.g. trampolines
are not setting the suspend register, etc),
- Changing definition of zero register (the zero register has now 0x3f
as its register number),
- Fixing some issues with handling of cmp instructions in the assembler:
we now use the shift-register rather than the extended-register variant
of cmp and cmn,
- Partially fixing register setup (register sN is now mapped to dN),
- Fixing and completing implementation of register spills/unspills,
- Fixing LoadBaseDispBody() and StoreBaseDispBody().

Change-Id: Ia49ba48b6ca0f782380066345b7a198cb6c1dc1d
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
d65c51a556e6649db4e18bd083c8fec37607a442 29-Apr-2014 Mark Mendell <mark.p.mendell@intel.com> ART: Add support for constant vector literals

Add in some vector instructions. Implement the ConstVector
instruction, which takes 4 words of data and loads it into
an XMM register.

Initially, only the ConstVector MIR opcode is implemented. Others will
be added after this one goes in.

Change-Id: I5c79bc8b7de9030ef1c213fc8b227debc47f6337
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ompiler_enums.h
ir_graph.cc
uick/codegen_util.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
1e97c4a4ab9f17d1394b952882d59d894b1e3c74 16-May-2014 Bill Buzbee <buzbee@android.com> Merge "Add x86_64 code generation support"
c830430ed65497c2268649d8e78121364e31b184 15-May-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Fix quick compiler monitor implementation.

Also with some small fixes :
1. Enable some dex byte code to compile.
2. Copy the register definition from runtime.cc.
3. A quick fix for "cmp Wn, Wm" in the assembler.
4. Optimise GenMoveException a bit by using xzr.
5. Fix improper use of StoreValueWide() on 32-bit value in FlushIns().
6. Fix one debug assert in the assembler.
It can pass all cases in run-all-test, except 044 which also fails with
the interpreter.

Change-Id: I9cc0253f1039c78d5100640235ac33e884b02560
rontend.cc
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/target_arm64.cc
380d24d9af676d047148083774fa634b77a00634 16-May-2014 Ian Rogers <irogers@google.com> Merge "Compatibility layer to transition from UniquePtr to std::unique_ptr."
507dfdd147c97bfbadebfd63584d094b6a4e7b47 16-May-2014 Ian Rogers <irogers@google.com> Compatibility layer to transition from UniquePtr to std::unique_ptr.

Use ART_WITH_STLPORT (enabled for the target) to cause the use of UniquePtr,
for the host switch to std::unique_ptr. For now the type remains called
UniquePtr.
Make dalvik compile with clang on the host, move its build to C++11.

Change-Id: I5ba8d2757904bc089ed62047ea03de3c0853fb12
ocal_value_numbering.h
ir_analysis.cc
erified_method.cc
e1a71b2a6e899645b006c29ba37695f521545a5b 16-May-2014 Bill Buzbee <buzbee@android.com> Merge "ART: A Compile Filter for x86_64"
13ff8cd5d29c66de49506b0d7dddf8e0a959e104 15-May-2014 Bill Buzbee <buzbee@google.com> Merge "Quick Compiler: fix Arm cts failures"
fe8cf8b1c1b4af0f8b4bb639576f7a5fc59f52ea 15-May-2014 Bill Buzbee <buzbee@google.com> Quick Compiler: fix Arm cts failures

Fixes move_wide_16#testN1, move_wide_16#testN2

Two bugs for the price of one (thanks CTS!)

First, the new stack overflow checking code was broken for very
large frames. For Arm on method entry, we only have 1 available
temp register, r12, until argument registers are flushed.
Previously, for explicit checks on large frames,
r12 was immediately loaded with the stack_end value. However,
later on when the frame is extended, if the frame size exceeds
the range of a reg-reg-imm subtract, the codegen utilities will
allocate a new temporary register to complete the operation. r12
was getting clobbered. Similarly, for medium-large frames r12
could get clobbered during frame creation.

What we should always do when directly using fixed registers like
this is to lock them to prevent them from being allocated as a
temp. The other half of the first bug is easily solved by delaying
the load of stack_end until after the new sp is computed. We'll
increase the stall cost, but this is an uncommon case.

The second bug was likely a typo in LoadValueDisp(). I'm a bit
surprised we hadn't hit this one earlier - but perhaps it was
recently introduced. The wrong base register was being used in
the non-float, wide, excessive offset case (which I suppose is also
somewhat uncommon).

Cherry-pick of internal commit If5b30f729e31d86db604045dd7581fd4626e0b55

Change-Id: If5b30f729e31d86db604045dd7581fd4626e0b55
uick/arm/call_arm.cc
uick/arm/utility_arm.cc
b2c3e10deb6a2f069748c7a48e778a5da66900fd 15-May-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix MonitorExit code on ARM"
b14329f90f725af0f67c45dfcb94933a426d63ce 15-May-2014 Andreas Gampe <agampe@google.com> ART: Fix MonitorExit code on ARM

We do not emit barriers on non-SMP systems. But on ARM, we have
places that need to conditionally execute, which is done through
an IT instruction. The guide of said instruction thus changes
between SMP and non-SMP systems.

To cleanly approach this, change the API so that GenMemBarrier
returns whether it generated an instruction. ARM will have to
query the result and update any dependent IT.

Throw a build system error if TARGET_CPU_SMP is not set.

Fix runtime/Android.mk to work with new multilib host.

Bug: 14989275
Change-Id: I9e611b770e8a1cd4ca19367d7dae0573ec08dc61
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
93dcff30c9bea0d6c7ca3a71a1bf460336c3467d 15-May-2014 Ian Rogers <irogers@google.com> Fix CompilationUnit constructor issues.

Ensure target64 is initialized. Switch from NULL to nullptr as the former gives
compilation errors with std::unique_ptr from libc++.

Change-Id: I7153368d9324d10ef257f7c7ce9571a1753e5ba8
rontend.cc
a1926cdbd05314accb55cc7d8fcb37fb361bbf8a 15-May-2014 Andreas Gampe <agampe@google.com> Merge "ART: Fix ARM dmb placement in monitor-exit"
f54fcba62745f897b9e741594dc5f4b2143601f6 14-May-2014 Bill Buzbee <buzbee@android.com> Merge "Support any cpu register sequence in LoadArgRegs"
5c13d43f69a5c893b4ee7abf02772ad526b3d263 14-May-2014 Bill Buzbee <buzbee@android.com> Merge "x86_64: Handle UnsafeGet/Put equal to x86"
d115735fe5523ff72319f0968f773683323c7f79 14-May-2014 Vladimir Marko <vmarko@google.com> Merge "Fix special getter/setter to use RegClassForFieldLoadStore()."
c93ac8b73b5772e43b6dd1cc9e1deee79ca68849 13-May-2014 Vladimir Marko <vmarko@google.com> Fix special getter/setter to use RegClassForFieldLoadStore().

This ensures correct register class is used for volatile
load/store in these getters and setters.

Bug: 14112919
Change-Id: Ib7aa83d441fb007e97f9acc2a778bc20ffed837c
uick/mir_to_lir.cc
uick/mir_to_lir.h
5678455bdf9ebf2bd88ab39a9aeb6e08b7c6e245 12-May-2014 Vladimir Kostyukov <vladimir.kostyukov@intel.com> ART: A Compile Filter for x86_64

This patch enables an x86_64 compile filter for everything
we're not ready to compile right now.

Signed-off-by: Vladimir Kostyukov <vladimir.kostyukov@intel.com>
Change-Id: I9ba87cf7f05e3465f12fd16a87b54f9649baf88a
rontend.cc
26ee07a9dbdff5d7ea61ff412e5fb7f510972aad 12-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> Support any cpu register sequence in LoadArgRegs

The LoadArgRegs was designed only for case when
arg1.reg < arg2.reg < arg3.reg which is not true for x86_64 ABI.
Now LoadArgRegs supports three args passed by any cpu register.

Change-Id: I62f58c47ec12b8e3f8124724cb3b5371dde8173f
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/gen_invoke.cc
9bf549d472462e4d1888a97c218a8c26fe3bfefb 12-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Handle UnsafeGet/Put equal to x86

This patch extends "Handle x86_64 architecture equal to x86"
and covers UnsafeGet/UnsafePut.

Change-Id: Ib07cfc217c7825cff0b49cfbb9151452d62b1b68
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/gen_invoke.cc
9b9dec8bbcb812315eb0b68b3465c6c567f09527 14-May-2014 Andreas Gampe <agampe@google.com> ART: Fix ARM dmb placement in monitor-exit

This moves the dmb in quick-compiled monitor-exit before the str
perfoming the unlock.

Change-Id: I231f98ff21eb7bac45b4a1b7ff57316deeb858cc
uick/arm/call_arm.cc
eb8167a4f4d27fce0530f6724ab8032610cd146b 08-May-2014 Mathieu Chartier <mathieuc@google.com> Add Handle/HandleScope and delete SirtRef.

Delete SirtRef and replaced it with Handle. Handles are value types
which wrap around StackReference*.

Renamed StackIndirectReferenceTable to HandleScope.

Added a scoped handle wrapper which wraps around an Object** and
restores it in its destructor.

Renamed Handle::get -> Get.

Bug: 8473721

Change-Id: Idbfebd4f35af629f0f43931b7c5184b334822c7a
ir_field_info.cc
ir_method_info.cc
9ee801f5308aa3c62ae3bedae2658612762ffb91 12-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> Add x86_64 code generation support

Utilizes r0..r7 in register allocator, implements spill/unsill
core regs as well as operations with stack pointer.

Change-Id: I973d5a1acb9aa735f6832df3d440185d9e896c67
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
3ec5da20f27da3bb8cea7ae29538c30c4b1549b4 13-May-2014 Andreas Gampe <agampe@google.com> ART: Fix typo in ThreadOffset modification

Change-Id: Ifc3bd44a2a8442dcc242f4abcb17ae2acbc3b4e7
uick/gen_invoke.cc
2f244e9faccfcca68af3c5484c397a01a1c3a342 08-May-2014 Andreas Gampe <agampe@google.com> ART: Add more ThreadOffset in Mir2Lir and backends

This duplicates all methods with ThreadOffset parameters, so that
both ThreadOffset<4> and ThreadOffset<8> can be handled. Dynamic
checks against the compilation unit's instruction set determine
which pointer size to use and therefore which methods to call.

Methods with unsupported pointer sizes should fatally fail, as
this indicates an issue during method selection.

Change-Id: Ifdb445b3732d3dc5e6a220db57374a55e91e1bf6
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/arm64_lir.h
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
0c5e8417a1e82f6e31fbfc33be7e64d9073d6ef4 13-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: fix compile-time perf regression"
ba57451494946a128703e1cbd8bf5969ee8dc598 13-May-2014 buzbee <buzbee@google.com> Quick compiler: fix compile-time perf regression

The recent changes to the temp register liveness tracking
introduced a measureable compile-time performance regression.
This CL cleans it up.

Change-Id: Id698b93e957f0ecab7ddfab94727f85e49cf10cf
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
0dc242d6fc1254e6ca1c31e08e612bbf45644b17 12-May-2014 Vladimir Marko <vmarko@google.com> Avoid unnecessary copy/load in EvalLoc() and LoadValue().

EvalLoc()/EvalLocWide() are used to prepare a register where
a value is subsequently stored, so they shouldn't copy the
old value to the new register for register class mismatch.

The only exception where we actually need a copy is
LoadValue()/LoadValueWide(), so we inline the old code that
makes the copy there. We also avoid loading inexpensive
constants when the value is already in the register.

Change-Id: I07519e9d4d9b3f7272233d196435f3035e4a3ca9
uick/gen_loadstore.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/int_x86.cc
d111c6eeb01955964d9c7f68126adcb1e1824ab3 12-May-2014 buzbee <buzbee@google.com> Quick compiler: RegStorage tweak

Previously, the RegStorage struct allowed for up to 32 physical
registers per register class. Although this is sufficient to
handle instruction encodings for all targets, some targets may
re-use the register number encoding for different physical elements.

For example, Arm64 uses register encoding 0x1f for both the stack
pointer and the zero register. This change adds a bit to the low
register number, allowing 0..63. Targets can use this extra
encoding space to differentiate between multiple uses of the same
encoding pattern.

Change-Id: I11f2ebbce8865a08627eef5868bb51fae6421c33
eg_storage.h
e1910f1d802dff79bba5ef61e1c4fd0b95f6e5b0 11-May-2014 buzbee <buzbee@google.com> Merge "Quick compiler: Fix liveness tracking"
30adc7383a74eb3cb6db3bf42cea3a5595055ce1 10-May-2014 buzbee <buzbee@google.com> Quick compiler: Fix liveness tracking

Rework temp register liveness tracking to play nicely with aliased
physical registers, and re-enable liveness tracking optimization.

Add a pair of x86 utility routines that act like UpdateLoc(),
but only show in-register live temps if they are of the expected
register class.

Change-Id: I92779e0da2554689103e7488025be281f1a58989
rontend.cc
uick/gen_loadstore.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
90cf3eefb4cd4dbd7ccd514738055b4d193981fe 09-May-2014 Vladimir Marko <vmarko@google.com> Merge "Clean up ScopedArenaAllocatorAdapter."
69f08baaa4b70ce32a258f3da43cf12f2a034696 11-Apr-2014 Vladimir Marko <vmarko@google.com> Clean up ScopedArenaAllocatorAdapter.

Make the adapter equality-comparable, define aliases for
containers using the adapter and use those aliases.
Fix DebugStackIndirectTopRefImpl assignment.

Change-Id: I689aa8a93d169f63a659dec5040567d7b1343277
ocal_value_numbering.h
ir_analysis.cc
ir_optimization.cc
674744e635ddbdfb311fbd25b5a27356560d30c3 24-Apr-2014 Vladimir Marko <vmarko@google.com> Use atomic load/store for volatile IGET/IPUT/SGET/SPUT.

Bug: 14112919
Change-Id: I79316f438dd3adea9b2653ffc968af83671ad282
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
8b1f6050ae4f6291d0ed082cf5d2efed2da0eef4 08-May-2014 Ian Rogers <irogers@google.com> Merge "X86: EmitArrayImm shouldn't truncate to 16 bits"
e45fb9e7976c8462b94a58ad60b006b0eacec49f 06-May-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: Change arm64 backend to produce A64 code.

The arm backend clone is changed to produce A64 code. At the moment
this backend can only compile simple methods (both leaf and non-leaf).

Most of the work on the assembler (assembler_arm64.cc) has been done.
Some work on the LIR generation layer (functions such as OpRegRegImm
& friends) is still necessary. The register allocator still needs to
be adapted to the A64 instruction set (it is mostly unchanged from
the arm backend). Offsets for helpers in gen_invoke.cc still need to
be changed to work on 64-bit.

Change-Id: I388f99eeb832857981c7d9d5cb5b71af64a4b921
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/create.sh
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
uick/codegen_util.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
9ed427724a18dc24f9eb2ddf39e4729bea203c2e 07-May-2014 Mark Mendell <mark.p.mendell@intel.com> X86: EmitArrayImm shouldn't truncate to 16 bits

The code in X86Mir2Lir::EmitArrayImm() always truncates the immediate
value to 16 bits. This can't be right. The code in EmitImm() will check
the expected immediate size from the entry.

Change-Id: I75b3b96e41777838b0f243d65f3f2ded2e1dbdd2
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
410d87ff51e9432768924d2f294592818f93c244 07-May-2014 Vladimir Marko <vmarko@google.com> Merge "Cleanup ARM load/store wide and remove unused param s_reg."
052a647973b590c9d5007a2e16f313f4e32a70bd 07-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Add fake arm64 backend, and disable it by method filter."
221b86d96f6e1971d24e3d6a283352c58cedbd32 07-May-2014 Vladimir Marko <vmarko@google.com> Merge "ART: BitVector and Optimization changes"
3bf7c60a86d49bf8c05c5d2ac5ca8e9f80bd9824 07-May-2014 Vladimir Marko <vmarko@google.com> Cleanup ARM load/store wide and remove unused param s_reg.

Use a single LDRD/VLDR instruction for wide load/store on
ARM, adjust the base pointer if needed. Remove unused
parameter s_reg from LoadBaseDisp(), LoadBaseIndexedDisp()
and StoreBaseIndexedDisp() on all architectures.

Change-Id: I25a9a42d523a68addbc11abe44ddc55a4401df98
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
9e06c8cd4a2e1471754470e09aaab63c0795b4af 06-May-2014 Zheng Xu <zheng.xu@arm.com> AArch64: Add fake arm64 backend, and disable it by method filter.

Just create an ArmCodeGenerator for arm64, but currently no code will
be generated for arm64.

The method filter can:
1. Skip methods with unsupported prototype.
2. Skip methods with unsupported dalvik byte code.
3. Skip methods with invocation to unsupported prototype.

These are temporary codes and should be removed later. But with this
patch, it won't break anything when we merge partly implemented arm64
backend later.

Change-Id: Ib9180d7b8a978f0a5ebaf6b4893e7e3724897113
rontend.cc
99380ed2f0f108a3110a3243e57e9863e74095cb 07-May-2014 Mark Mendell <mark.p.mendell@intel.com> ART: Ensure X86 OpRegCopyWide preserves src

X86Mir2Lir::OpRegCopyWide will clobber r_src if it is assigning a value
in an XMM register to a pair of GPRs. This change introduces a
temporary to preserve the input value.

Change-Id: I02af5174007c9572e597f8efb0da34f21882a3a8
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/int_x86.cc
290fda3acf3d9ce60f7ac3903fabfb01d3521d0f 07-May-2014 Vladimir Marko <vmarko@google.com> Merge "Remove LoadBaseDispWide and StoreBaseDispWide."
91152bc2ab6e60add80dd017e30e57dce40a8ae0 07-May-2014 Vladimir Marko <vmarko@google.com> Merge "ART: ChildBlockIterator Implementation"
455759b5702b9435b91d1b4dada22c4cce7cae3c 06-May-2014 Vladimir Marko <vmarko@google.com> Remove LoadBaseDispWide and StoreBaseDispWide.

Just pass k64 or kDouble to non-wide versions.

Change-Id: I000619c3b78d3a71db42edc747c8a0ba1ee229be
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/arm64/codegen_arm64.h
uick/arm64/int_arm64.cc
uick/arm64/utility_arm64.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
7189fee4268c70d7ed0151e988ff7c7cd85f2a30 07-May-2014 Bill Buzbee <buzbee@android.com> Merge "AArch64: Added arm64 quick backend as an arm clone."
43ec8737d8356dbff0a90bee521fb0e73438da47 31-Mar-2014 Matteo Franchin <matteo.franchin@arm.com> AArch64: Added arm64 quick backend as an arm clone.

Created a new directory arm64 under compiler/dex/quick which contains
a copy of the 32-bit arm backend. In following CLs, this code will
be replaced/modified to support Aarch64.

Change-Id: I06c468db8d588e339eecf4d7d85276d5e334a17a
uick/arm64/arm64_lir.h
uick/arm64/assemble_arm64.cc
uick/arm64/call_arm64.cc
uick/arm64/codegen_arm64.h
uick/arm64/create.sh
uick/arm64/fp_arm64.cc
uick/arm64/int_arm64.cc
uick/arm64/target_arm64.cc
uick/arm64/utility_arm64.cc
72d32629303f8f39362a4099481f48646aed042f 07-May-2014 Ian Rogers <irogers@google.com> Give Compiler a back reference to the driver.

The compiler driver is a single object delegating work to the compiler, rather
than passing it through to every Compiler call make it a member of Compiler so
that it maybe queried. This simplifies the Compiler API and makes the
relationship to CompilerDriver more explicit.
Remove reference arguments that contravene code style.

Change-Id: Iba47f2e3cbda679a7ec7588f26188d77643aa2c6
rontend.cc
uick/codegen_util.cc
47ebd77a6d249403a34d242908749b7446da2a82 07-May-2014 Ian Rogers <irogers@google.com> Merge "ART: Improve fused compare long branch"
80475df914f9dbdbb1f4b42e87e75d375d50a629 06-May-2014 Bill Buzbee <buzbee@android.com> Merge "ART: Ensure use counts updated when adding SSA reg"
1f1d2513a11eaaa59601d7599ac2e80ddfa1bcf5 06-May-2014 Andreas Gampe <agampe@google.com> Merge "ART: Use utils.h::RoundUp instead of explicit bit-fiddling"
b5c9b4008760c9042061490f22aaff990ed04c9a 30-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: BitVector and Optimization changes

- The BitVector has a function SameBitsSet that is a bit upside down
- This patch fixes it.

- Two optimizations are fixed also:
- The null check pass uses now same bits set instead of equal due to a
subsequent change that will make it not always the case that the
compared bitvectors be of the same size.
- The fused optimization supposes a predecessor will have an instruction.

Change-Id: I9ef1c793964b18dc0f47baf9d1f361448bb053a3
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ir_optimization.cc
99b0578036179849aa9fb7b8ef378bd20fabc71e 06-May-2014 Dave Allison <dallison@google.com> Merge "Handle implicit stack overflow without affecting stack walks"
f8c762b8cbd4a223c697d7e7bdb976fb39224cb8 02-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: ChildBlockIterator Implementation

- Added the API to be able to walk through a BasicBlock's children directly.
- When calling Reset(GrowableArray*), there is an assignment to the g_list_
member. This is not possible with the g_list_ being const.

Change-Id: I25d06484fd93848d80ccf96a1324058370b2ee46
Signed-Off-By: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
ir_graph.cc
ir_graph.h
36b65964d128471d917c2efc69c81bc50ef9360b 06-May-2014 Ian Rogers <irogers@google.com> Merge "ART: Update and correct assemble_x86.cc"
2637f2e9bf4fc5591994b7c0158afead88321a7c 30-Apr-2014 Mark Mendell <mark.p.mendell@intel.com> ART: Update and correct assemble_x86.cc

Correct the definition of some X86 instructions in the file.
Add some new instructions and the code to emit them properly.

Added EmitMemCond()

Change-Id: Icf4b70236cf0ca857c85dcb3edb218f26be458eb
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/x86_lir.h
752e205de95ca9d4f4e825173a3cefd831a3b933 01-May-2014 Mark Mendell <mark.p.mendell@intel.com> ART: Improve fused compare long branch

The code generated by a fused compare long with an immediate value is
much longer than comparing to a runtime value. Rewrite the code to
improve it.

The special cases are == or != to 0, and whether the source is a
temporary value or not. Try to handle all of these well. For all
except == and !=, we can use a 'cmp' instruction for the upper word, in
order to set the carry flag properly, rather than a 'sub' into a temp.

Also, we have to handle the <= and > cases properly, in order to get the
correct code generated, in the same manner as
X86Mir2Lir::GenFusedLongCmpBranch().

Change-Id: Ic29bf89ff2c06916d7fc996926997888ea013ba7
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/int_x86.cc
0095e0b8380a8802f40a21928800b9df6e11f1d7 06-May-2014 Vladimir Marko <vmarko@google.com> Merge "ART: Add a last item in the MIROptimizationFlagPositions enumeration"
0add77a86599260aba3ea4b56e9db3da6bb881a8 06-May-2014 Mark Mendell <mark.p.mendell@intel.com> ART: Ensure use counts updated when adding SSA reg

Ensure that matching data structures are updated when adding SSA
registers late in the compile.

Change-Id: I8e664dddf52c1a9095ba5b7a8df84e5a733bbc43
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ir_dataflow.cc
ir_optimization.cc
660188264dee3c8f3510e2e24c11816c6b60f197 06-May-2014 Andreas Gampe <agampe@google.com> ART: Use utils.h::RoundUp instead of explicit bit-fiddling

Change-Id: I249a2cfeb044d3699d02e13d42b8e72518571640
uick/arm/assemble_arm.cc
uick/codegen_util.cc
uick/mips/assemble_mips.cc
uick/x86/assemble_x86.cc
f29a4244bbc278843237f0ae242de077e093b580 05-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Fix frame size calculation for 64-bit

Calculate frame size in the same way as calculated in patch
"64bit changes to the stack walker for the Quick ABI"

Change-Id: I8c2458f5973536a84f3fd6ad56167b5cfafa9ab4
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/codegen_util.cc
0b8027003514c4fa6a850e5087076e991daaf4c3 05-May-2014 Andreas Gampe <agampe@google.com> Merge "x86_64: Fix Array::DataOffset in calls"
37498b6719347190f45472ad44ea21de563585eb 05-May-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> x86_64: Fix Array::DataOffset in calls

Calculates offset using utility function

Change-Id: I19339537f4458dcae931897f4ee282f5c40746d2
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/gen_invoke.cc
5cd33753b96d92c03e3cb10cb802e68fb6ef2f21 16-Apr-2014 Dave Allison <dallison@google.com> Handle implicit stack overflow without affecting stack walks

This changes the way in which implicit stack overflows are handled
to satisfy concerns about changes to the stack walk code.

Instead of creating a gap in the stack and checking for it in
the stack walker, use the ManagedStack infrastructure to concoct
an invisible gap that will never be seen by a stack walk.

Also, this uses madvise to tell the kernel that the main stack's
protected region will probably never be accessed, and instead
of using memset to map the pages in, use memcpy to read from
them. This will save 32K on the main stack.

Also adds a 'signals' verbosity level as per a review request.

Bug: 14066862
Change-Id: I5257305feeaea241d11e6aa6f021d2a81da20b81
uick/arm/call_arm.cc
091cc408e9dc87e60fb64c61e186bea568fc3d3a 31-Mar-2014 buzbee <buzbee@google.com> Quick compiler: allocate doubles as doubles

Significant refactoring of register handling to unify usage across
all targets & 32/64 backends.

Reworked RegStorage encoding to allow expanded use of
x86 xmm registers; removed vector registers as a separate
register type. Reworked RegisterInfo to describe aliased
physical registers. Eliminated quite a bit of target-specific code
and generalized common code.

Use of RegStorage instead of int for registers now propagated down
to the NewLIRx() level. In future CLs, the NewLIRx() routines will
be replaced with versions that are explicit about what kind of
operand they expect (RegStorage, displacement, etc.). The goal
is to eventually use RegStorage all the way to the assembly phase.

TBD: MIPS needs verification.
TBD: Re-enable liveness tracking.

Change-Id: I388c006d5fa9b3ea72db4e37a19ce257f2a15964
ompiler_enums.h
rontend.cc
ir_graph.h
ir_optimization.cc
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mips/README.mips
uick/mips/assemble_mips.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
reg_analysis.cc
29a2648821ea4d0b5d3aecb9f835822fdfe6faa1 03-May-2014 Ian Rogers <irogers@google.com> Move DecodedInstruction into MIR.

Change-Id: I188dc7fef4f4033361c78daf2015b869242191c6
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
cb73fb35e5f7c575ed491c0c8e2d2b1a0a22ea2e 02-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Better SSA Allocation when recreating SSA

The SSA calculation is not allocation friendly. This makes the
SSARepresentation remember how much is allocated and not reallocate
if SSA should be recalculated.

Also added some allocation friendly code for the dominance code.

Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Change-Id: I6418b402434bd850b45771c75b7631b7b84a8f66
ir_dataflow.cc
ir_graph.cc
ir_graph.h
sa_transformation.cc
89fde26f586883e04d295d6e30954cb5a0dc37bf 30-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Add a last item in the MIROptimizationFlagPositions enumeration

- Added a last item in the enumeration in order to be able to notice
when an extended MIR opcode is beyond the last one known to libart, and hence
must be an opcode added by code from a plugin.
- Fixed the naming typo of the enumeration.

Change-Id: I0e021ba54b0e60531338f23ca0ab64755e15229b
Signed-Off-By: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ompiler_enums.h
1dbbbf6090274ebae6809fdb340c166bb34e09c2 02-May-2014 Mathieu Chartier <mathieuc@google.com> Merge "Add finalizer references from the entrypoints."
f6ba35df8609abf0e290a7cda37c63b5ee76ec3c 02-May-2014 Vladimir Marko <vmarko@google.com> Merge "ART: Move oat_data_flow_attributes_ to private and put an API"
cc794c3dc5b45601da23fb0d7bc16f9b4ef04065 02-May-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Move oat_data_flow_attributes_ to private and put an API

The oat_data_flow_attributes had no checking mechanism to ensure bound
correctness.

This fix handles this and also offers two functions to retrieve the
attributes: using the MIR and DecodedInstruction.

Change-Id: Ib4f1f749efb923a803d364a4eea83a174527a644
Signed-Off-By: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ir_optimization_test.cc
ortable/mir_to_gbc.cc
uick/mir_to_lir.cc
uick/x86/utility_x86.cc
reg_analysis.cc
8194963098247be6bca9cc4a54dbfa65c73e8ccc 02-May-2014 Vladimir Marko <vmarko@google.com> Replace CountOneBits and __builtin_popcount with POPCOUNT.

Clean up utils.h, make some functions constexpr.

Change-Id: I2399100280cbce81c3c4f5765f0680c1ddcb5883
uick/codegen_util.cc
42fcd9838a87abaf7a2ef86853a5287f86dbe391 22-Apr-2014 Nicolas Geoffray <ngeoffray@google.com> Revert "Revert "64bit changes to the stack walker for the Quick ABI.""

This reverts commit 8d5ead52a92675c258113d3dfa71bf8fceba5d9f.

Change-Id: I6b4774a9bd180de33551975e106322ba1192e6ab
uick/mir_to_lir.cc
uick/ralloc_util.cc
8668c3cbdcf9471bd97e0da68a240051f2973074 25-Apr-2014 Mathieu Chartier <mathieuc@google.com> Add finalizer references from the entrypoints.

We now have an invariant where we never allocate finalizable
objects with the Initialized or Resolved entrypoints. This speeds up
allocation by only doing the check in the slow path.

Before:
MemAllocTest: 3625, 3707, 3641
EvaluateAndApplyChanges: 3448, 3421, 3413

After:
MemAllocTest: 3164, 3109, 3135
EvaluateAndApplyChanges: 3272, 3299, 3353

Bug: 14078487

Change-Id: I2b0534af3e7c75ea5e5257cf3647744f7abfb74e
uick/gen_common.cc
ff093b31d75658c3404f9b51ee45760f346f06d9 01-May-2014 Ian Rogers <irogers@google.com> Fix a few 64-bit compilation of 32-bit code issues.

Bug: 13423943

Change-Id: I939389413af0a68c0d95b23cd598b7c42afa4383
uick/codegen_util.cc
uick/gen_invoke.cc
3b004ba749beb0fa0f0601fb5cf1929cc46bc1f1 30-Apr-2014 Mingyao Yang <mingyao@google.com> Simplify GenConstString

Now it's the same code for all platforms.

Bug: 13506069
Change-Id: I42c08a9dc99a3079caad01602de84296c9357dd8
uick/gen_common.cc
6ffcfa04ebb2660e238742a6000f5ccebdd5df15 25-Apr-2014 Mingyao Yang <mingyao@google.com> Rewrite suspend test check with LIRSlowPath.

Change-Id: I2dc17d079655586bfc588349c7a04afc2c6879af
uick/arm/call_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/int_x86.cc
becc37249b652ae9fecb6a23ced708cdacb7effd 29-Apr-2014 Vladimir Marko <vmarko@google.com> Merge "ART: Initialization of RegLocation and API for GrowableArray Iterator"
1ceea7eb080a309fc2811db604bceed9e638bc5e 16-Apr-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: Initialization of RegLocation and API for GrowableArray Iterator

Two things:

- Added a default initialization for the RegLocation.
- Added a default constructor and Reset for the GrowableArray's Iterator class.

Change-Id: I74d9c584304c77add42e0d66e4037ac45b890142
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
reg_analysis.cc
7a11ab09f93f54b1c07c0bf38dd65ed322e86bc6 29-Apr-2014 buzbee <buzbee@google.com> Quick compiler: debugging assists

A few minor assists to ease A/B debugging in the Quick
compiler:
1. To save time, the assemblers for some targets only
update the object code offsets on instructions involved with
pc-relative fixups. We add code to fix up all offsets when
doing a verbose codegen listing.
2. Temp registers are normally allocated in a round-robin
fashion. When disabling liveness tracking, we now reset the
round-robin pool to 0 on each instruction boundary. This makes
it easier to spot real codegen differences.
3. Self-register copies were previously emitted, but
marked as nops. Minor change to avoid generating them in the
first place and reduce clutter.

Change-Id: I7954bba3b9f16ee690d663be510eac7034c93723
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/codegen_util.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
fd698e67953e40e804d7c9d1a3e8460e9d67382a 28-Apr-2014 buzbee <buzbee@google.com> Quick compiler: fix DCHECKS

The recent change to introduce k32, k64 and kReference operand
sizes missed updating a few DCHECKS.

Change-Id: I66eb617b07766e781b38962dc862fc5b023c2fbd
uick/arm/utility_arm.cc
uick/mips/utility_mips.cc
e8256e7773a230337c3d137cbf0365f737820405 25-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "Skip BBs without SSA representation in the Constant Propagation phase"
9c3b089519792245ab9f658865f44b8639b8d696 24-Apr-2014 Andreas Gampe <agampe@google.com> Revert "Revert "ART: Extracts an utility function of the duplicated code""

This reverts commit b5a14d2a6c18c1ea3c019c53b10af2e8f5dea234.

Change-Id: Id09a4cc27ac22db940badf3a277848b38b173eae
uick/gen_common.cc
b5a14d2a6c18c1ea3c019c53b10af2e8f5dea234 24-Apr-2014 Andreas Gampe <agampe@google.com> Revert "ART: Extracts an utility function of the duplicated code"

This reverts commit 973cc95da6fb617bab133bd7a693c1cb7eafd393.

Change-Id: I3883c74ba06116e89d89d9cf085f20cff5d15f77
uick/gen_common.cc
973cc95da6fb617bab133bd7a693c1cb7eafd393 18-Apr-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> ART: Extracts an utility function of the duplicated code

This patch introduces an utility function 'DataOffsetOfType' in
'mirror::Array' class that calculates the data offset at given index
in an array of given type.

Change-Id: Idb19558653c70a129245f220f0fbb553f898865b
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
uick/gen_common.cc
125011d70aa84b3fd9052f1c90101401b0851928 24-Apr-2014 Mingyao Yang <mingyao@google.com> Merge "Delete throw launchpads."
0ea4bf7edb20be30f63566bce2d9db23f0b1c87f 22-Apr-2014 buzbee <buzbee@google.com> Merge "Update load/store utilities for 64-bit backends"
695d13a82d6dd801aaa57a22a9d4b3f6db0d0fdb 19-Apr-2014 buzbee <buzbee@google.com> Update load/store utilities for 64-bit backends

This CL replaces the typical use of LoadWord/StoreWord
utilities (which, in practice, were 32-bit load/store) in
favor of a new set that make the size explicit. We now have:

LoadWordDisp/StoreWordDisp:
32 or 64 depending on target. Load or store the natural
word size. Expect this to be used infrequently - generally
when we know we're dealing with a native pointer or flushed
register not holding a Dalvik value (Dalvik values will flush
to home location sizes based on Dalvik, rather than the target).

Load32Disp/Store32Disp:
Load or store 32 bits, regardless of target.

Load64Disp/Store64Disp:
Load or store 64 bits, regardless of target.

LoadRefDisp:
Load a 32-bit compressed reference, and expand it to the
natural word size in the target register.

StoreRefDisp:
Compress a reference held in a register of the natural word
size and store it as a 32-bit compressed reference.

Change-Id: I50fcbc8684476abd9527777ee7c152c61ba41c6f
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/dex_file_method_inliner.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
6123d94cddf34f3fdb8ece55476e414e34662394 22-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "GenArithOpInt should ensure that reg is in core"
3a74d15ccc9a902874473ac9632e568b19b91b1c 22-Apr-2014 Mingyao Yang <mingyao@google.com> Delete throw launchpads.

Bug: 13170824

Change-Id: I9d5834f5a66f5eb00f2ac80774e8c27dea99949e
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
4e0d5ee57ab5f76a761cf0d7ebb50b782e3eacdc 22-Apr-2014 Mingyao Yang <mingyao@google.com> Merge "Revert "Revert "Use LIRSlowPath for throwing ArrayOutOfBoundsException."""
9d894662426e413454935e483d56a8cc33924174 21-Apr-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> Skip BBs without SSA representation in the Constant Propagation phase

In some cases the constant propagation optimization may get the MIR graph
where some of the BBs have no predecessors and do not transformed to the
SSA form. If such BB has operations on constants this may lead to segfault.
This patch adds the condition that will pass the only BBs with SSA.

Change-Id: I816d46b2492c5bd4748f983c3725b4798f9ebd68
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
ir_optimization.cc
42d65c52bbf4a354605389a759190e793787f692 19-Apr-2014 Mingyao Yang <mingyao@google.com> Add an option to specify a list of methods for LIR dumping.

An example would be:
--runtime-arg -verbose-methods:Array.checkRange32,Array.checkRange64
or
"-verbose-methods:void Array.checkRange32,void Array.checkRange64"

Change-Id: I61c1eb3b2eb4b24126a9264261c27889d53cc6bd
rontend.cc
80365d9bb947edef0eae0bfe62b9f7a239416e6b 18-Apr-2014 Mingyao Yang <mingyao@google.com> Revert "Revert "Use LIRSlowPath for throwing ArrayOutOfBoundsException.""

This adds back using LIRSlowPath for ArrayIndexOutOfBoundsException.
And fix the host test crash.

Change-Id: Idbb602f4bb2c5ce59233feb480a0ff1b216e4887
ompiler_enums.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
7fff544c38f0dec3a213236bb785c3ca13d21a0f 18-Apr-2014 Brian Carlstrom <bdc@google.com> Revert "Use LIRSlowPath for throwing ArrayOutOfBoundsException."

This reverts commit 9d46314a309aff327f9913789b5f61200c162609.
ompiler_enums.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
366f8ae038c4f6a3852deed1cff322ba54689808 15-Apr-2014 Serguei Katkov <serguei.i.katkov@intel.com> GenArithOpInt should ensure that reg is in core

GenArithOpInt in two-addr case of add-int where destination is in
register should ensure that it is a core reg.

Change-Id: I5b5ca126773a2bb45f9b23ad892102b034d694b4
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
d15f4e2ef3b1b4c01a490a00b0f6dc744741ce01 18-Apr-2014 Mingyao Yang <mingyao@google.com> Fix a use of OpCondBranch that breaks the MIPS build.

Change-Id: I09e19cb00c1e3f4bc0b0293f58674c9160094f7f
uick/gen_common.cc
uick/mips/int_mips.cc
9d46314a309aff327f9913789b5f61200c162609 18-Apr-2014 Mingyao Yang <mingyao@google.com> Use LIRSlowPath for throwing ArrayOutOfBoundsException.

Get rid of launchpads for throwing ArrayOutOfBoundsException
and use LIRSlowPath instead.

Bug: 13170824
Change-Id: I0e27f7a261a6a7fb5c0645e6113a957e098f699e
ompiler_enums.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
425640d6fac3432a44e236a002e8401a7cd59c5c 17-Apr-2014 Mingyao Yang <mingyao@google.com> Merge "Use LIRSlowPath for throwing NPE."
79f2c53f3cb8649c19aeded82f7b8dcc96015808 17-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "String.IndexOf method handles negative start index value in incorrect way"
a1758d83e298c9ee31848bcae07c2a35f6efd618 16-Apr-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> String.IndexOf method handles negative start index value in incorrect way

The standard implementation of String.IndexOf converts the negative value of
the start index to 0 and searching will start from the beginning of the string.
But current implementation may start searching from the incorrect memory
offset, that can lead to sigsegv or return incorrect result.
This patch adds the handler for cases when fromIndex is negative.

Change-Id: I3ac86290712789559eaf5e46bef0006872395bfa
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/target_x86.cc
b4b06678125131367999135e634055509b77b9e8 16-Apr-2014 Yevgeny Rouban <yevgeny.y.rouban@intel.com> Fix volatile wide put/get to be atomic on x86 arch

Current implementation puts memory barriers for volatile fields.
Volatile semantics needs atomicity, which are not guaranteed by memory barriers.

The patch forces all wide volatile fields to be loaded/stored using
xmm registers.

Change-Id: Ie78e186d13ffa237e6e93747b71d26651fa02866
Signed-off-by: Yevgeny Rouban <yevgeny.y.rouban@intel.com>
uick/gen_common.cc
e643a179cf5585ba6bafdd4fa51730d9f50c06f6 08-Apr-2014 Mingyao Yang <mingyao@google.com> Use LIRSlowPath for throwing NPE.

Get rid of launchpads for throwing NPE and use LIRSlowPath instead.
Also clean up some code of using LIRSlowPath for checking div
by zero.

Bug: 13170824

Change-Id: I0c20a49c39feff3eb1f147755e557d9bc0ff15bb
ompiler_enums.h
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
af13ad9fd18b6f75fe82e7995224c55654594f93 11-Apr-2014 Andreas Gampe <agampe@google.com> Centralize instruction-set pointer-size, alignment, 64b-width code
in instruction_set.h/cc

This allows to clean up some places that currently make explicit
comparisons.

Change-Id: I0dcc924c52fa53306f706aceea93a2d4a655c5df
rontend.cc
d6ed642458c8820e1beca72f3d7b5f0be4a4b64b 10-Apr-2014 Dave Allison <dallison@google.com> Revert "Revert "Revert "Use trampolines for calls to helpers"""

This reverts commit f9487c039efb4112616d438593a2ab02792e0304.

Change-Id: Id48a4aae4ecce73db468587967968a3f7618b700
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
f9487c039efb4112616d438593a2ab02792e0304 09-Apr-2014 Dave Allison <dallison@google.com> Revert "Revert "Use trampolines for calls to helpers""

This reverts commit 081f73e888b3c246cf7635db37b7f1105cf1a2ff.

Change-Id: Ibd777f8ce73cf8ed6c4cb81d50bf6437ac28cb61

Conflicts:
compiler/dex/quick/mir_to_lir.h
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
1512ea155cbe0a4b33776b0320c1ce38583ab09b 08-Apr-2014 buzbee <buzbee@google.com> Merge "Quick compiler: fix CmpLong pair handling"
4289456fa265b833434c2a8eee9e7a16da31c524 07-Apr-2014 Mingyao Yang <mingyao@google.com> Use LIRSlowPath for throwing div by zero exception.

Get rid of launchpads for throwing div by zero exception and
use LIRSlowPath instead. Add a CallRuntimeHelper that takes no
argument for the runtime function.

Bug: 13170824
Change-Id: I7e0563e736c6f92bd63e3fbdfe3a777ad333e338
ompiler_enums.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/int_x86.cc
a1983d4dab10b0cc51e9d1b6bcafa9a723fabcd9 07-Apr-2014 buzbee <buzbee@google.com> Quick compiler: fix CmpLong pair handling

OpCmpLong wasn't properly extracting the low register of a
pair.

Change-Id: I6d6cc3de1f543f4316e561648f371f793502fddb
uick/arm/int_arm.cc
4d3dc8a04da8a80251b381cdb482190363171dc1 07-Apr-2014 Dave Allison <dallison@google.com> Merge "Revert "Use trampolines for calls to helpers""
081f73e888b3c246cf7635db37b7f1105cf1a2ff 07-Apr-2014 Dave Allison <dallison@google.com> Revert "Use trampolines for calls to helpers"

This reverts commit 754ddad084ccb610d0cf486f6131bdc69bae5bc6.

Change-Id: Icd979adee1d8d781b40a5e75daf3719444cb72e8
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
50ca506e9191c2eafcf9564528712020f9531dc4 07-Apr-2014 Vladimir Marko <vmarko@google.com> Merge "Inlining synthetic accessors."
12c0273fd394d72ae93424784b1450daea417472 07-Apr-2014 Dave Allison <dallison@google.com> Merge "Use trampolines for calls to helpers"
c8f60a69a9f2420fc1ecafec612a667be8dcd547 02-Apr-2014 Vladimir Marko <vmarko@google.com> Inlining synthetic accessors.

Bug: 11549140
Change-Id: I0d6a38c51887f55563414c240ac42ee64bdb5426
uick/dex_file_method_inliner.cc
e1fced1d1805caec04b6e97d2b01a4977c6785c6 04-Apr-2014 Vladimir Marko <vmarko@google.com> Inlining setters that return one of their arguments.

Useful for builder classes and synthetic setters. The latter
are not inlined yet since they are static methods, i.e. they
don't use "this" as the object for IPUT.

Change-Id: I3d34156c3629b837a0a95ccc34a8aae3f4a636d5
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.cc
73ed718e7b08d17fd2e4af9bceb5e74ac46db676 05-Apr-2014 Mathieu Chartier <mathieuc@google.com> Revert "Inlining setters that return one of their arguments."

Bug: 13817614

This reverts commit 8e40c3e662d852da87b6bcfe79355f96ab9e91c7.

Change-Id: Ia7ed2d933514781150b2e0b9855244e383c60187
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.cc
389e11db6ef350b806f7a3f0d7b7df23b0ab6e0c 05-Apr-2014 Mathieu Chartier <mathieuc@google.com> Revert "Inlining synthetic accessors."

This reverts commit 505ebb0e7b42e7facc8354515b06333ee8b84b10.
uick/dex_file_method_inliner.cc
53bee42d0f8b454ff4fe5b7e42bdb070c786e3eb 05-Apr-2014 Mathieu Chartier <mathieuc@google.com> Fix using kArm instead of kThumb2.

Change-Id: I0f3bf93b38d910bc57d017693675829b6a39bc18
rontend.cc
754ddad084ccb610d0cf486f6131bdc69bae5bc6 19-Feb-2014 Dave Allison <dallison@google.com> Use trampolines for calls to helpers

This is an ARM specific optimization to the compiler
that uses trampoline islands to make calls to runtime
helper functions. The intention is to reduce the size
of the generated code (by 2 bytes per call) without
affecting performance.

By default this is on when generating an OAT file. It is
off when compiling to memory.

To switch this off in dex2oat, use the command line option:
--no-helper-trampolines

Enhances disassembler to print the trampoline entry on the
BL instruction like this:

0xb6a850c0: f7ffff9e bl -196 (0xb6a85000) ; pTestSuspend

Bug: 12607709
Change-Id: I9202bdb7cf21252ad807bd48701f1f6ce8e3d0fe
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
45157a41b6c0ac9f73aeeb1f064c2270a6a68a60 05-Apr-2014 Ian Rogers <irogers@google.com> Merge "ARM: enable optimisation for easy multiply, add modulus pattern."
09379fd9f20e25ee71687e2c60f6a84c9ede8cd6 04-Apr-2014 Dave Allison <dallison@google.com> Merge "Disable use of R4 as a promotable register"
505ebb0e7b42e7facc8354515b06333ee8b84b10 02-Apr-2014 Vladimir Marko <vmarko@google.com> Inlining synthetic accessors.

Bug: 11549140
Change-Id: Ie0034a6840b1beaa3df92f26bf9d315119c81e34
uick/dex_file_method_inliner.cc
8e40c3e662d852da87b6bcfe79355f96ab9e91c7 04-Apr-2014 Vladimir Marko <vmarko@google.com> Inlining setters that return one of their arguments.

Useful for builder classes and synthetic setters. The latter
are not inlined yet since they are static methods, i.e. they
don't use "this" as the object for IPUT.

Change-Id: I946cf570195be83ecec5fb32851bcaefad45f8a5
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.cc
764c798b57b7baa04885fcdf5eba5708a01b9edc 04-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "Fix LoadValueWide to not call MarkLive for high reg that is equal to low reg"
b3e527b2a9ee28ecaba2045f4415b00c8b395039 04-Apr-2014 Vladimir Marko <vmarko@google.com> Clean up special method inlining.

Mark inlined getter/setter INVOKEs as NOP to allow implicit
null checks (SIGSEGV-based) rather than the explicit checks
in GenInvoke().

Avoid inlining wide setter and returning wide argument if
the wide source is not in consecutive dalvik registers in
INVOKE. This is valid dalvik bytecode and we should treat it
correctly even if we're currently unaware of any tools that
would generate such INVOKEs.

Remove bogus MIR_INLINED checks from LVN.

Change-Id: I7e75a832fcf9bd0550e21b1c8b3813c6166197dd
ocal_value_numbering.cc
uick/dex_file_method_inliner.cc
7efad5d3a806a15166109837439f2e149031feef 04-Apr-2014 Vladimir Marko <vmarko@google.com> Merge "Disassemble Thumb2 shifts and more VFP instructions."
8325296769a77ecf3ab647b5ab516f439f5b3206 04-Apr-2014 Dave Allison <dallison@google.com> Disable use of R4 as a promotable register

When we are using implicit suspend checks we can potentially
use r4 as a register into which variables can be promoted. However
the runtime doesn't save this and thus will corrupt it. Not good.

This disables the promotion of r4 until we can figure out how
to make the runtime save it properly.

Change-Id: Ib95ce93579e1c364de5ecc8e728f2cb7990da77a
uick/arm/target_arm.cc
cbd18b7f4da7677ca48c48c23ed9a7de3a8b0354 04-Apr-2014 Chao-ying Fu <chao-ying.fu@intel.com> Fix LoadValueWide to not call MarkLive for high reg that is equal to low reg

For x86 double FP registers, LoadValueWide should not call MarkLive for
high reg that is equal to low reg.

Change-Id: Ie6a59307c9ff93303bd489c15529432cfdeceaa4
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/gen_loadstore.cc
c777e0de83cdffdb2e240d439c5595a4836553e8 03-Apr-2014 Vladimir Marko <vmarko@google.com> Disassemble Thumb2 shifts and more VFP instructions.

Disassemble Thumb2 instructions LSL, LSR, ASR, ROR and VFP
instructions VABS, VADD, VSUB, VMOV, VMUL, VNMUL, VDIV.

Clean up disassembly of VCMP, VCMPE, VNEG and VSQRT. These
could have been erroneously used for other insns (VSQRT for
VMOV was encountered) and one VSQRT branch was unreachable.

Remove duplicate VMOV opcodes from compiler.

Change-Id: I160a1e3e4b6eabb6a5101ce348ffd49c0573257d
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
3da67a558f1fd3d8a157d8044d521753f3f99ac8 03-Apr-2014 Dave Allison <dallison@google.com> Add OpEndIT() for marking the end of OpIT blocks

In ARM we need to prevent code motion to the inside of an
IT block. This was done using a GenBarrier() to mark the end, but
it wasn't obvious that this is what was happening. This CL adds
an explicit OpEndIT() that takes the LIR of the OpIT for future
checks.

Bug: 13751744
Change-Id: If41d2adea1f43f11ebb3b72906bd308252ce3d01
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
f9719f9abbea060e086fe1304d72be50cbc8808e 02-Apr-2014 Zheng Xu <zheng.xu@arm.com> ARM: enable optimisation for easy multiply, add modulus pattern.

Fix the issue when src/dest registers overlap in easy multiply.

Change-Id: Ie8cc098c29c74fd06c1b67359ef94f2c6b88a71e
uick/arm/int_arm.cc
uick/gen_common.cc
5a4139fd33547d09c94d9650157e3a4e4c9eede4 03-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "art: Handle x86_64 architecture equal to x86"
99f391e48f79421a4d949152aec6bafe1a7b5b82 03-Apr-2014 Vladimir Marko <vmarko@google.com> Fix Unsafe.getLong()/putLong() for x86, add test.

Change-Id: Id6841ae50e1047543c04dcdae30254dd6ce82082
uick/gen_invoke.cc
6a58cb16d803c9a7b3a75ccac8be19dd9d4e520d 02-Apr-2014 Dmitry Petrochenko <dmitry.petrochenko@intel.com> art: Handle x86_64 architecture equal to x86

This patch forces FE/ME to treat x86_64 as x86 exactly.
The x86_64 logic will be revised later when assembly will be ready.

Change-Id: I4a92477a6eeaa9a11fd710d35c602d8d6f88cbb6
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
rontend.cc
ir_optimization.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mir_to_lir.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
8549cf9d83688f7decbbea2a8de761ce29e95f3c 03-Apr-2014 Mathieu Chartier <mathieuc@google.com> Merge "Use temp register in Unsafe Get/Put intrisics for displaced offset."
7c95cefc168ba81b17a9ed2d987ac5bcf0b05781 03-Apr-2014 Mathieu Chartier <mathieuc@google.com> Use temp register in Unsafe Get/Put intrisics for displaced offset.

Previously, the object register would get clobberd by the adding the
offset for wide UnsafeGets and wide UnsafePuts. This resulted in heap
corruption in AtomicLongFieldUpdater.compareAndSet and possibly other
places.

Bug: 13744490
Change-Id: Ic368d930b855c5c57e22060b32b73d0745328ef2
uick/gen_invoke.cc
4a200f56b7075309316b04d550c9cc50f8314edd 01-Apr-2014 Jeff Hao <jeffhao@google.com> Add support for -Xverify:none mode.

This mode skips all verification and compilation.
Public bug: https://code.google.com/p/android/issues/detail?id=67664

Change-Id: Idd00ab8e9e46d129c02988b063c41a507e07bf5b
rontend.cc
ir_analysis.cc
f6b65c123dafad62004a93a43eb82de00ddc8214 02-Apr-2014 Dave Allison <dallison@google.com> Add r4 as promotable register if implicit suspend checks

If we are doing implicit suspend checks we should be able
to use r4 as a target for promotion.

Also bump OAT version

Change-Id: Ia27d14ece3b3259dbb74bcf89feaa9da2cda6db8
uick/arm/target_arm.cc
43a065ce1dda78e963868f9753a6e263721af927 02-Apr-2014 Dave Allison <dallison@google.com> Add GenBarrier() calls to terminate all IT blocks.

This is needed to prevent things like load hoisting from putting
instructions inside the IT block.

Bug: 13749123
Change-Id: I98a010453b163ac20a90f626144f798fc06e65a9
uick/arm/int_arm.cc
uick/gen_common.cc
80fdef4018cde9bee8cdb0159ba660db1c4c4bf7 01-Apr-2014 buzbee <buzbee@google.com> Quick compiler: add comment to Arm encoding

A question from an AOSP contributer demonstrated the need for
explanation of a seemingly odd encoding for vldrd/vldrs. In short,
we add a "def" bit for lr on those instructions to cover the cases
in which we have to materialize a new base pointer at assembly
time using lr as a temp register.

Change-Id: I22c5740218a90e0ff387c6aac2bd20cc98eece85
uick/arm/assemble_arm.cc
d265a8ab12e1b783af42bf07a264edbb86826d2c 01-Apr-2014 buzbee <buzbee@google.com> Merge "Quick compiler, MIPS resource cleanup"
7ea687d886be7b8c106b0e0190dab299d14adcad 01-Apr-2014 Mathieu Chartier <mathieuc@google.com> Merge "Fix stack overflow slow path error."
88e0463fa7e8ea7b427b65a07cd7b28111575174 01-Apr-2014 Ian Rogers <irogers@google.com> Merge "Revert "Revert "Optimize easy multiply and easy div remainder."""
dd7624d2b9e599d57762d12031b10b89defc9807 15-Mar-2014 Ian Rogers <irogers@google.com> Allow mixing of thread offsets between 32 and 64bit architectures.

Begin a more full implementation x86-64 REX prefixes.
Doesn't implement 64bit thread offset support for the JNI compiler.

Change-Id: If9af2f08a1833c21ddb4b4077f9b03add1a05147
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
d0b86c7ec593a552f726a15e532bb48170fbf487 01-Apr-2014 Bill Buzbee <buzbee@android.com> Merge "Use ResetDef to prevent from removing necessary stores for x86 long-to-fp."
f943914730db8ad2ff03d49a2cacd31885d08fd7 27-Mar-2014 Dave Allison <dallison@google.com> Implement implicit stack overflow checks

This also fixes some failing run tests due to missing
null pointer markers.

The implementation of the implicit stack overflow checks introduces
the ability to have a gap in the stack that is skipped during
stack walk backs. This gap is protected against read/write and
is used to trigger a SIGSEGV at function entry if the stack
will overflow.

Change-Id: I0c3e214c8b87dc250cf886472c6d327b5d58653e
uick/arm/call_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
05a48b1f8e62564abb7c2fe674e3234d5861647f 01-Apr-2014 Mathieu Chartier <mathieuc@google.com> Fix stack overflow slow path error.

The frame size without spill was being passed into the slow path
instead of the spill size. This was incorrect since only the spills
will have been pushed at the point of the overflow check.

Also addressed an other comment.

Change-Id: Ic6e455122473a8f796b291d71f945bcf72788662
uick/arm/call_arm.cc
306f017dd883c0bf806d239d97e0bca3194afbd7 07-Jan-2014 Vladimir Marko <vmarko@google.com> Faster AssembleLIR for ARM.

This also reduces sizeof(LIR) by 4 bytes (32-bit builds).

Change-Id: I0cb81f9bf098dfc50050d5bc705c171af26464ce
ompiler_enums.h
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/mir_to_lir.h
6170f5576f46f64eec6cd6c125c3de001afa5bcf 29-Mar-2014 Chao-ying Fu <chao-ying.fu@intel.com> Use ResetDef to prevent from removing necessary stores for x86 long-to-fp.

X86 long-to-fp needs the source operand in the memory.
Later on, NullifyRange may remove the stores and then lead to incorrect
long-to-fp conversions.
To fix this bug, ResetDef is called after flushing source to the memory
for x86 long-to-fp.

Change-Id: I3510739294dc2e5ffb3d76d7651880fae63f2382
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/x86/fp_x86.cc
e2143c0a4af68c08e811885eb2f3ea5bfdb21ab6 28-Mar-2014 Ian Rogers <irogers@google.com> Revert "Revert "Optimize easy multiply and easy div remainder.""

This reverts commit 3654a6f50a948ead89627f398aaf86a2c2db0088.
Remove the part of the change that confused !is_div with being multiply rather
than implying remainder.

Change-Id: I202610069c69351259a320e8852543cbed4c3b3e
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
9da5c1013215176f2a4dbe7a804be899e12d5f68 28-Mar-2014 buzbee <buzbee@google.com> Quick compiler, MIPS resource cleanup

MIPS architecture includes internal registers HI and LO.
Similar to condition codes in other architectures, these internal
resouces must be accounted for during instruction scheduling.

Previously, the Quick backend for MIPS dealt with them by defining
rHI and rLO pseudo registers - treating them as actual registers for
def/use masks. This CL changes the handling of these resources to
be in line with how condition codes are used elsewhere - leaving
register definitions to be used for registers.

Change-Id: Idcd77f3107b0c9b081ad05b1aab663fb9f41492d
ompiler_enums.h
uick/mips/assemble_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mir_to_lir.h
uick/x86/x86_lir.h
4aeec176eaf11fe03f342aadcbb79142230270ed 28-Mar-2014 Mathieu Chartier <mathieuc@google.com> Refactor some GC code.

Reduced amount of code in mark sweep / semi space by moving
common logic to garbage_collector.cc. Cleaned up mod union tables
and deleted an unused implementation.

Change-Id: I4bcc6ba41afd96d230cfbaf4d6636f37c52e37ea
rontend.cc
217fe73a6c2f3ec44dc52c85c8a101313d048f04 27-Mar-2014 Serguei Katkov <serguei.i.katkov@intel.com> Annotate Dalvik VR access as both use and def if we use it in this way

Some 2addr operations use direct access to VR in memory as both def and use but
annotate its only as def. It results in later optimizations like reorder
of LIRs can re-order this operation with other mov.

Change-Id: I04ac40c9f229af6f1e5c5f91f4901b1452509582
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
3654a6f50a948ead89627f398aaf86a2c2db0088 28-Mar-2014 Brian Carlstrom <bdc@google.com> Revert "Optimize easy multiply and easy div remainder."

This reverts commit 08df4b3da75366e5db37e696eaa7e855cba01deb.
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
3d325c6700509c37d85f21a94575d7605812e806 27-Mar-2014 Chao-ying Fu <chao-ying.fu@intel.com> Fix CopyRegInfo to keep live/dirty flags of new registers.

CopyRegInfo should not change live/dirty flags of new registgers.
Otherwise, it will lead to incorrectly clobbering these live registers
that are not live actually, and then allocating them to another usage.

Change-Id: Ia9f055b33a11a6d70c0aca1a9fe8639ecfb09464
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
uick/ralloc_util.cc
262b299abf658c16f61dad2240cfaf3deafe4423 27-Mar-2014 buzbee <buzbee@google.com> Fix x86 master build failure.

Replace bogus DCHECKs with logic matching pre-cleanup code.
Register pairs are considered temp, promoted, dirty or live if
either register of the pair meets criteria.

Change-Id: If2df891fdd1e3351d4cbe72aaf2a2ac5b34b2110
uick/mir_to_lir.h
uick/ralloc_util.cc
08df4b3da75366e5db37e696eaa7e855cba01deb 25-Mar-2014 Zheng Xu <zheng.xu@arm.com> Optimize easy multiply and easy div remainder.

Update OpRegRegShift and OpRegRegRegShift to use RegStorage parameters.
Add special cases for *0 and *1. Add more easy multiply special cases for
Arm.
Reuse easy multiply in SmallLiteralDivRem() to support remainder cases.

Change-Id: Icd76a993d3ac8d4988e9653c19eab4efca14fad0
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
2700f7e1edbcd2518f4978e4cd0e05a4149f91b6 07-Mar-2014 buzbee <buzbee@google.com> Continuing register cleanup

Ready for review.

Continue the process of using RegStorage rather than
ints to hold register value in the top layers of codegen.
Given the huge number of changes in this CL, I've attempted
to minimize the number of actual logic changes. With this
CL, the use of ints for registers has largely been eliminated
except in the lowest utility levels. "Wide" utility routines
have been updated to take a single RegStorage rather than
a pair of ints representing low and high registers.

Upcoming CLs will be smaller and more targeted. My expectations:
o Allocate float double registers as a single double rather than
a pair of float single registers.
o Refactor to push code which assumes long and double Dalvik
values are held in a pair of register to the target dependent
layer.
o Clean-up of the xxx_mir.h files to reduce the amount of #defines
for registers. May also do a register renumbering to bring all
of our targets' register naming more consistent. Possibly
introduce a target-independent float/non-float test at the
RegStorage level.

Change-Id: I646de7392bdec94595dd2c6f76e0f1c4331096ff
ir_graph.h
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
99ad7230ccaace93bf323dea9790f35fe991a4a2 26-Feb-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Relaxed memory barriers for x86

X86 provides stronger memory guarantees and thus the memory barriers can be
optimized. This patch ensures that all memory barriers for x86 are treated
as scheduling barriers. And in cases where a barrier is needed (StoreLoad case),
an mfence is used.

Change-Id: I13d02bf3f152083ba9f358052aedb583b0d48640
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ompiler_enums.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/local_optimizations.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/x86_lir.h
d3a2dfad0e1231b354e4bf77b67a4e179fa0e837 18-Mar-2014 Yevgeny Rouban <yevgeny.y.rouban@intel.com> Reuse promoted register temporarily

AtomicLong (x86) is implemented as an intrinsic, which uses
the cmpxchng8b instruction.
This instruction requires 4 physical registers plus 2 more used for
the memory operand. On x86 we have only 4 temporaries. The code tried
to solve this by using MarkTemp utility, but this was not meant to be
used with promoted registers. The problem is that MarkTemp does not
spill anything and as a result we can lose VR.

If the registers are promoted this patch just reuses the values pushed
on the stack.

Change-Id: Ifec9183e2483cf704d0d1166a1004a9aa07b4f1d
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Yevgeny Rouban <yevgeny.y.rouban@intel.com>
uick/x86/int_x86.cc
ab5545f31aec6ed4b906bd1bb34a02778e7081e9 25-Mar-2014 Serguei Katkov <serguei.i.katkov@intel.com> x86 GenLongRegOrMemOp should be aware about xmm to core reg conversion

GenLongRegOrMemOp function expects arithmetic on core regs but does not
ensure that operand in core reg.

The patch adds the conversion if it is required.

Change-Id: Ibb6928b8cc2c63ede1a20d6ee45d9a64884231b6
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
889d079baea1d9ee488b5915de9aec4e0d02e2a0 25-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "An argument is handled incorrectly for add-int/lit8 during optimization phase"
716426fe40f5de972084de0e5bd6395b2617ec12 25-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "Small update to CFG printing using DOT"
ee40aa4650d7d000335ccfcb2fbb742acfb1f1c3 24-Mar-2014 nikolay serdjuk <nikolay.y.serdjuk@intel.com> An argument is handled incorrectly for add-int/lit8 during optimization phase

Dalvik instruction 'add-int/lit8' stores a constant in the third parameter.
But during optimization phase the compiler reads the constant from the
second parameter. This is incorrect because it leads to wrong decision that
no array bound checks are needed in our test case. As a consequence it
fails with SIGSEGV because of accessing elements which are beyond the bounds.

Change-Id: I653892514934046d31a9e4d206d9d95ebb6267ab
Signed-off-by: nikolay serdjuk <nikolay.y.serdjuk@intel.com>
ocal_value_numbering.cc
5d47447e1d0cd18cf91a189f7a08e65c8d43ea5a 21-Mar-2014 Vladimir Marko <vmarko@google.com> Move saved SSA map to ScopedArenaAllocator to save memory.

Bug: 13564922
Change-Id: I917d451267ca6fceb2f6b2ff33b872ee8c209893
sa_transformation.cc
53b6afc93d91f9a48660682082dafcd81a652d6c 21-Mar-2014 Vladimir Marko <vmarko@google.com> Free Arenas from the ArenaStack before running codegen.

Since the ArenaStack is used only by the MIRGraph and not by
the memory hungry codegen, freeing the ArenaStack's Arenas
just before running the codegen should reduce the compiler's
peak memory usage.

Bug: 13564922
Change-Id: I1cb49d367e4e81d71a03cac89b3739ed61e4f966
rontend.cc
b982331680a9fa329302c68bfdcc9a4d9d403921 20-Mar-2014 Vladimir Marko <vmarko@google.com> Fix and clean up intrinsic Math.abs(long).

On ARM, make sure we don't clobber a register that we still
need for the next insn. On x86, don't free a source register
for temps if it's overlapping a result register as that
would allow the sign_reg temporary to alias with the result.

Change-Id: I785f2f607900ae8ceb2fa0b8f3eefafdf6fab5c7
uick/gen_invoke.cc
25bc279080a56546b0f8a33342a853b2778eed0d 19-Mar-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Small update to CFG printing using DOT

-Ensures to print all non-null basic blocks in MIR graph.
-Prints links from exceptions to catch targets.

Change-Id: I98fe46cd1c39cf59c46e6bccf967612defaa4f3b
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ir_graph.cc
ec31d37f76b0d594ad1499b22b11bbeaad246c23 19-Mar-2014 Vladimir Marko <vmarko@google.com> Clean up intrinsic Math.abs(float/double).

Don't load 0x7fffffff into register.

Change-Id: I0197f9f3ad33db1f6eb09a9b4113299c00f500e3
uick/gen_invoke.cc
63a4c96e71d6c3223842f4eebd69b269cc491897 20-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "Fix GenArithOpInt to work with RA correctly"
ac05eb59b8998b31684b32cc69d2de767d5482cc 20-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "ART: API changes"
66da1364425df90e6a03b032ee0a401375e45c39 14-Mar-2014 Serguei Katkov <serguei.i.katkov@intel.com> Fix GenArithOpInt to work with RA correctly

In a case of mul-int/2addr bytecode when source operand is in
memory implementation should first load value of destination
and then evaluate location for destination. Otherwise load will
be skipped because after evaluation of physical register for
destination load will be ignored due to register allocator
thinks that value is already in register.

Change-Id: Iecee5a07d0fba16b421b8c49d42c5d8623794ad7
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
uick/x86/int_x86.cc
b95a5345ae4217b70ca36f0cced92f68dda7caf5 12-Mar-2014 Stuart Monteith <stuart.monteith@arm.com> AArch64: Add arm64 runtime support.

Adds support for arm64 to ART. Assembler stubs are sufficient for
down calls into interpreter. JNI compiler and generics are not finished.

Basic Generic JNI functionality.

Change-Id: I4a07c79d1e037b9f5746673480e32cf456867b82
rontend.cc
66e4c3e96dccdec7423d673ad6bbf7821a776651 19-Mar-2014 Mathieu Chartier <mathieuc@google.com> Merge "Optimize stack overflow handling."
40bbb39b85c063cd6a9f4ab00ff70372370e08cf 19-Mar-2014 buzbee <buzbee@google.com> Fix Quick compiler "out of registers"

There are a few places in the Arm backend that expect to be
able to survive on a single temp register - in particular
entry code generation and argument passing. However, in the
case of a very large frame and floating point ld/st, the
existing code could end up using 2 temps.

In short, if there is a displacement overflow we try to use
indexed load/store instructions (slightly more efficient).
However, there are none for floating point - so we ended up
burning yet another register to construct a direct pointer.
This CL detects this case and doesn't try to use the indexed
load/store mechanism for floats.

Fix for https://code.google.com/p/android/issues/detail?id=67349

Change-Id: I1ea596ea660e4add89fd4fddb8cbf99a54fbd343
uick/arm/utility_arm.cc
0d507d1e0441e6bd6f3affca3a60774ea920f317 19-Mar-2014 Mathieu Chartier <mathieuc@google.com> Optimize stack overflow handling.

We now subtract the frame size from the stack pointer for methods
which have a frame smaller than a certain size. Also changed code to
use slow paths instead of launchpads.

Delete kStackOverflow launchpad since it is no longer needed.

ARM optimizations:
One less move per stack overflow check (without fault handler for
stack overflows). Use ldr pc instead of ldr r12, b r12.
Code size (boot.oat):
Before: 58405348
After: 57803236

TODO: X86 doesn't have the case for large frames. This could case an
incoming signal to go past the end of the stack (unlikely however).

Change-Id: Ie3a5635cd6fb09de27960e1f8cee45bfae38fb33
ompiler_enums.h
uick/arm/call_arm.cc
uick/gen_common.cc
uick/mips/call_mips.cc
uick/x86/call_x86.cc
0d9c02e661813abdf18b4e7544e204d2da719d20 19-Mar-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Run Java tests with the optimizing compiler."
92cf83e001357329cbf41fa15a6e053fab6f4933 18-Mar-2014 Nicolas Geoffray <ngeoffray@google.com> Run Java tests with the optimizing compiler.

Also fix a vector.reserve -> vector.resize braino, and build
a GC map that dex2oat expects.

Change-Id: I6acf2f90a4c32f90b79bf7709bf2e43931b98757
uick/codegen_util.cc
cdacac4a8196bdc620185079ec9e886329606f3d 13-Mar-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> ART: API changes

- Moved AppendMIR to BasicBlock
- Moved PrependMIR to BasicBlock
- Moved InsertMIRAfter to BasicBlock
- Moved GetNextUnconditionalMir to BasicBlock

Change-Id: Id261434e9f7d5d93f1bce0c87c9276a20077c483
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ir_graph.cc
ir_graph.h
ir_optimization_test.cc
uick/dex_file_method_inliner.cc
uick/mir_to_lir.cc
sa_transformation.cc
60d7a65f7fb60f502160a2e479e86014c7787553 14-Mar-2014 Brian Carlstrom <bdc@google.com> Fix stack overflow for mutual recursion.

There was an error where we would have a pc that was in the method
which generated the stack overflow. This didn't work however
because the stack overflow check was before we stored the method in
the stack. The result was that the stack overflow handler had a PC
which wasnt necessarily in the method at the top of the stack. This
is now fixed by always restoring the link register before branching
to the throw entrypoint.

Slight code size regression on ARM/Mips (unmeasured). Regression on ARM
is 4 bytes of code per stack overflow check. Some of this regression is
mitigated by having one less GC safepoint.

Also adds test case for StackOverflowError issue (from bdc).

Tests passing: ARM, X86, Mips
Phone booting: ARM

Bug: https://code.google.com/p/android/issues/detail?id=66411
Bug: 12967914
Change-Id: I96fe667799458b58d1f86671e051968f7be78d5d

(cherry-picked from c0f96d03a1855fda7d94332331b94860404874dd)
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/mips_lir.h
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
9820b7c1dc70e75ad405b9e6e63578fa9fe94e94 02-Jan-2014 Vladimir Marko <vmarko@google.com> Early inlining of simple methods.

Inlining "special" methods: empty methods, methods returning
constants or their arguments, simple getters and setters.

Bug: 8164439
Change-Id: I8c7fa9c14351fbb2470000b378a22974daaef236
b_optimizations.h
rontend.cc
rontend.h
ocal_value_numbering.cc
ir_dataflow.cc
ir_graph.h
ir_method_info.cc
ir_method_info.h
ir_optimization.cc
ass_driver.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.cc
bfea9c29e809e04bde4a46591fea64c5a7b922fb 17-Jan-2014 Vladimir Marko <vmarko@google.com> Class initialization check elimination.

Also, move null check elimination temporaries to the
ScopedArenaAllocator and reuse the same variables in the
class initialization check elimination.

Change-Id: Ic746f95427065506fa6016d4931e4cb8b34937af
b_optimizations.cc
b_optimizations.h
ompiler_enums.h
rontend.cc
rontend.h
ir_field_info.h
ir_graph.cc
ir_graph.h
ir_method_info.h
ir_optimization.cc
ir_optimization_test.cc
ass_driver.cc
uick/gen_common.cc
sa_transformation.cc
1d45438a031916f2d373c8759c19a6f14fe50255 15-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "Remove duplicated register load in function call to quick entry."
d7f8e02041e9d16160bc81bd1fa19189bffc04b3 13-Mar-2014 Zheng Xu <zheng.xu@arm.com> ARM: Do not allocate temp registers in MulLong if possible.

Just use rl_result if we have enough registers and it is *not* either operand.

Change-Id: I5a6f3ec09653b97e41bbc6dce823aa8534f98a13
uick/arm/int_arm.cc
9a84ad99aab002e8cfeec9381df971a00e28d05f 13-Mar-2014 Zheng Xu <zheng.xu@arm.com> Remove duplicated register load in function call to quick entry.

CallRuntimeHelperRegLocation() will load parameter to registers for native call, but
GenConversionCall() duplicates the work before it call CallRuntimeHelperRegLocation().

Instructions generated before patch:
0xf731007e: f8d9e25c ldr.w lr, [r9, #604] ; pF2l
0xf7310082: ee180a10 vmov.f32 r0, s16
0xf7310086: ee180a10 vmov.f32 r0, s16
0xf731008a: 47f0 blx lr
After:
0xf739707e: f8d9e25c ldr.w lr, [r9, #604] ; pF2l
0xf7397082: ee180a10 vmov.f32 r0, s16
0xf7397086: 47f0 blx lr

Change-Id: I1868aefa4703a0f8133eaac707f5b80f01293cb8
uick/gen_common.cc
uick/gen_invoke.cc
e90501da0222717d75c126ebf89569db3976927e 12-Mar-2014 Serguei Katkov <serguei.i.katkov@intel.com> Add dependency for operations with x86 FPU stack

Load Hoisting optimization can re-order operations with
FPU stack due to no dependency set.

Patch adds resource dependency between these operations.

Change-Id: Iccce98c8f3c565903667c03803884d9de1281ea8
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
ompiler_enums.h
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/target_x86.cc
uick/x86/x86_lir.h
b373e091eac39b1a79c11f2dcbd610af01e9e8a9 21-Feb-2014 Dave Allison <dallison@google.com> Implicit null/suspend checks (oat version bump)

This adds the ability to use SEGV signals
to throw NullPointerException exceptions from Java code rather
than having the compiler generate explicit comparisons and
branches. It does this by using sigaction to trap SIGSEGV and when triggered
makes sure it's in compiled code and if so, sets the return
address to the entry point to throw the exception.

It also uses this signal mechanism to determine whether to check
for thread suspension. Instead of the compiler generating calls
to a function to check for threads being suspended, the compiler
will now load indirect via an address in the TLS area. To trigger
a suspend, the contents of this address are changed from something
valid to 0. A SIGSEGV will occur and the handler will check
for a valid instruction pattern before invoking the thread
suspension check code.

If a user program taps SIGSEGV it will prevent our signal handler
working. This will cause a failure in the runtime.

There are two signal handlers at present. You can control them
individually using the flags -implicit-checks: on the runtime
command line. This takes a string parameter, a comma
separated set of strings. Each can be one of:

none switch off
null null pointer checks
suspend suspend checks
all all checks

So to switch only suspend checks on, pass:
-implicit-checks:suspend

There is also -explicit-checks to provide the reverse once
we change the default.

For dalvikvm, pass --runtime-arg -implicit-checks:foo,bar

The default is -implicit-checks:none

There is also a property 'dalvik.vm.implicit_checks' whose value is the same
string as the command option. The default is 'none'. For example to switch on
null checks using the option:

setprop dalvik.vm.implicit_checks null

It only works for ARM right now.

Bumps OAT version number due to change to Thread offsets.

Bug: 13121132
Change-Id: If743849138162f3c7c44a523247e413785677370
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
9545a446e99b22248099fe66f5f9431530c20851 13-Mar-2014 Jeff Hao <jeffhao@google.com> Merge "Allow patching between dex files in the boot classpath."
3bc8615332b7848dec8c2297a40f7e4d176c0efb 13-Mar-2014 Vladimir Marko <vmarko@google.com> Use LIRSlowPath for intrinsics, improve String.indexOf().

Rewrite intrinsic launchpads to use the LIRSlowPath.
Improve String.indexOf for constant chars by avoiding
the check for code points over 0xFFFF.

Change-Id: I7fd5583214c5b4ab9c38ee36c5d6f003dd6345a8
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/target_x86.cc
9e6a1113381ef7958e36237dfe22752e88272b2b 13-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "ART's intrinsic for String.indexOf use the incorrect register"
0cecf494999cc35e13ff2104145c1d9229bf8776 13-Mar-2014 Vladimir Marko <vmarko@google.com> Merge "Add dex2oat --print-pass-names and --disable-passes= options."
b9d50a9829b795932eac4cc50a99b4ce80b0ecb4 13-Mar-2014 Vladimir Marko <vmarko@google.com> Merge "Move inline method detection to runtime."
b34f69ab43aaf7a6e6045c95f398baf566ef5023 07-Mar-2014 Nicolas Geoffray <ngeoffray@google.com> Add command line support for enabling the optimizing compiler.

Also run tests with the optimizing compiler enabled when
the file art/USE_OPTIMIZING_COMPILER is present.

Change-Id: Ibc33eed62a43547bc3b9fe786d014c0d81b5add8
ompiler_ir.h
rontend.cc
ir_optimization.cc
34fa0d935bed7a0e17bc6df4bd079e3428a179e7 12-Mar-2014 Yevgeny Rouban <yevgeny.y.rouban@intel.com> ART's intrinsic for String.indexOf use the incorrect register

ART's intrinsic for String.indexOf of x86 platform use the incorrect register
to compare start with the string length. It should be fixed.

Change-Id: I22986b4d4b23f62b4bb97baab9fe43152d12145e
Signed-off-by: Vladimir Ivanov <vladimir.a.ivanov@intel.com>
Signed-off-by: Yevgeny Rouban <yevgeny.y.rouban@intel.com>
uick/x86/target_x86.cc
49161cef10a308aedada18e9aa742498d6e6c8c7 12-Mar-2014 Jeff Hao <jeffhao@google.com> Allow patching between dex files in the boot classpath.

Change-Id: I53f219a5382d0fcd580e96e50025fdad4fc399df
uick/codegen_util.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
e3e0260c23d8999b9433715ac7ee5296ee2fd633 12-Mar-2014 Vladimir Marko <vmarko@google.com> Move inline method detection to runtime.

The debugger needs this for selective deoptimization.

Change-Id: I8100000449b56e619288fb05d41ea6f02b53b334
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mir_to_lir.cc
cd8ce66a83af05d5ecb59aa6a8aad89a29e0a844 11-Mar-2014 Chao-ying Fu <chao-ying.fu@intel.com> Add dex2oat --print-pass-names and --disable-passes= options.

Add --print-pass-names to print a list of pass names.
Add --disable-passes= to disable one ore more passes
separated by comma.
Ex: Using --disable-passes=UseCount,BBOptimizations can disable UseCount
and BBOptimizations passes.

Change-Id: I0dffaf10547afdcca78a20d8e0e6b358bfb2ee8c
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
ass_driver.cc
ass_driver.h
2f4c3a4e1b84963e9f4465fc476d1ec804321601 12-Mar-2014 buzbee <buzbee@google.com> Remove spurious duplicate line of code

This CL removes a duplicate line of code which appears to have
been intended for removal during a cleanup, but wasn't. It would
not have affected correctness, rather it uselessly performed the
same store twice.

Bug originally reported by M Mendell.

Change-Id: If4333a29f32b6bdb944b67aa560d856611041ff6
uick/gen_invoke.cc
3d73ba2ce682edfaf41f29521bd6039c6499a1c5 06-Mar-2014 Vladimir Marko <vmarko@google.com> Avoid Cache*LoweringInfo pass when there's no GET/PUT/INVOKE.

Add new data flow flags indicating instance/static field
access. Record merged flags of all insns and use them to skip
the CacheFieldLoweringInfo pass if the method uses no fields
and the CacheMethodLoweringInfo pass if it has no invokes.

Change-Id: I36a36b438ca9b0f104a7baddc0497d736495cc3c
b_optimizations.h
ir_dataflow.cc
ir_graph.cc
ir_graph.h
0f6784737882199197796b67b99e5f1ded383bee 11-Mar-2014 Ian Rogers <irogers@google.com> Unify 64bit int constant definitions.

LL and ULL prefixes are word size dependent, use the INT64_C and UINT64_C
macros instead.

Change-Id: I5b70027651898814fc0b3e9e22a18a1047e76cb9
ir_graph.h
uick/arm/fp_arm.cc
uick/arm/utility_arm.cc
73a471336a9515fa7fdc5859e3c481ec451237a5 10-Mar-2014 Ian Rogers <irogers@google.com> Merge "Fix LIR generation for long arithmetic operation"
3c050399e482f6eaf0617fa82ee47adbc01b82cd 10-Mar-2014 Ian Rogers <irogers@google.com> Merge "LongToFp result storage fixed"
3dfc5c168506b89e345c977355a4eabebfede72a 10-Mar-2014 Ian Rogers <irogers@google.com> Merge "ARM: Inline codegen for long-to-float on ARM."
e19649a91702234f9aa9941d76da447a1e0dcc2a 27-Feb-2014 Zheng Xu <zheng.xu@arm.com> ARM: Remove duplicated instructions; add vcvt, vmla, vmls disassembler.

Remove kThumb2VcvtID in the assembler which was duplicated.
Add vcvt, vmla, vmls in the disassembler.

Change-Id: I14cc39375c922c9917274d8dcfcb515e888fdf26
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/fp_arm.cc
f0e6c9c7b395f4fce4d00d31cabd362302e1d924 10-Mar-2014 Zheng Xu <zheng.xu@arm.com> ARM: Inline codegen for long-to-float on ARM.

long-to-double-to-float using vfp instructions should be faster than the
function provided by toolchain.

Change-Id: I7ff809bca6665f0c1a0d7e6db98d570ce86b7c66
uick/arm/fp_arm.cc
f096aad9203d7c50b2f9cbe1c1215a50c265a059 23-Jan-2014 Vladimir Marko <vmarko@google.com> Cache method lowering info in mir graph.

This should enable easy inlining checks. It should also
improve compilation time of methods that call the same
methods over and over - it is exactly such methods that
tend to exceed our 100ms time limit.

Change-Id: If01cd18e039071a74a1444570283c153429c9cd4
b_optimizations.h
ir_analysis.cc
ir_graph.cc
ir_graph.h
ir_method_info.cc
ir_method_info.h
ass_driver.cc
uick/gen_invoke.cc
a03de6dbabbe857deae5b0f1e388fbd3a2420dc2 09-Mar-2014 Ian Rogers <irogers@google.com> Revert "Revert "Make clang the default compiler on host.""

This reverts commit d54f3a6219bca6ae018f4395fa0f1254bd4459be.

Change-Id: Id96bb52a0d599f8848010d1589bdf0f70fc7124b
rontend.cc
erification_results.cc
erification_results.h
d54f3a6219bca6ae018f4395fa0f1254bd4459be 08-Mar-2014 Ian Rogers <irogers@google.com> Revert "Make clang the default compiler on host."

This reverts commit 87f8b4cf0c1d6aab3eb5d1e99cc4e7cf175ef772.

Change-Id: I91a513042f0f9cf66288a296ad4a3b5da7830c7b
rontend.cc
erification_results.cc
erification_results.h
87f8b4cf0c1d6aab3eb5d1e99cc4e7cf175ef772 07-Mar-2014 Ian Rogers <irogers@google.com> Make clang the default compiler on host.

Motivation, GCC's compiler warnings are inferior to clang's. -Wthread-safety is
not supported by GCC starting with version 4.7. As this change only effects the
host, performance issues are an impact on host building and testing alone.
Fix clang gtest building on host with BUILD_HOST_64bit.
Fix clang build regressions caused by unused fields.
Fix x86-64 regression caused by requirement to fire-up quick compiler even in an
interpret-only environment. Long-term this code doesn't belong in the quick
compiler.

Change-Id: Ifc2b10177f40d0724cbbf8dab9653ac03cdd1cee
rontend.cc
erification_results.cc
erification_results.h
39c3bfbd03d85c63cfbe69f17ce5800ccc7d6c13 29-Jan-2014 Dave Allison <dallison@google.com> Make use of profiling information for dex2oat

If the profile file exists, the compiler driver will read it
and store the data in an internal map. Then, when we want to work
out whether to compile a method or not, the map is consulted and if
the method shows up with a high enough percentage of use we compile it.

The profile file itself is created by installd and is writeable by the
app. The file is in /data/dalvik-cache/profiles and is named by
the package name.

This also modifies the profiler itself to:

1. Only count runnable threads (not suspended threads) in the profile
2. Use system properties to allow tuning of the profile parameters
3. Merge profiles from multiple processes using file locking.

Bug: 12877748
Change-Id: Iab2f3a327a2860db2a80d5724277d6c626227f2b

Conflicts:
compiler/dex/frontend.cc
compiler/dex/mir_analysis.cc
compiler/dex/verification_results.cc
compiler/driver/compiler_driver.cc
dex2oat/dex2oat.cc
runtime/class_linker.cc
runtime/runtime.cc
runtime/runtime.h
rontend.cc
ir_analysis.cc
ir_graph.h
erification_results.cc
aa00fe010eb7b61c2de82611ce3f6fc0918a4f9e 07-Mar-2014 Mathieu Chartier <mathieuc@google.com> Merge "Add more VerifyObject calls."
c645f1ddb7c40bea6a38eda4b3f83f6b6dec405b 07-Mar-2014 Mathieu Chartier <mathieuc@google.com> Add more VerifyObject calls.

Added verify object calls to SirtRef, IndirectReferenceTable,
ReferenceTable.

Removed un-needed verify object in ScopedObjectAccess / DecodeJObject
since object sources are handled.

Bug: 12934910
Change-Id: I55a46a8ea61fed2a77526eda27fd2cce97a9b125
ir_field_info.cc
a24122dc3aaa74b0385bb0ce30959f8a19c4a300 07-Mar-2014 Vladimir Marko <vmarko@google.com> Use ScopedArenaAllocator for CacheFieldLoweringInfo pass.

Change-Id: Idcc2edeb865e29b1bc42b108fc58a1f964295317
ir_analysis.cc
ir_field_info.h
a9d7be62735e3356cef7e8ed797c519134a17061 07-Mar-2014 Vladimir Marko <vmarko@google.com> Merge "Create a scoped arena allocator and use that for LVN."
91b6ffaf38b71ed2fbbbc3e3bd2a6b4112d55751 07-Mar-2014 Yevgeny Rouban <yevgeny.y.rouban@intel.com> Fix LIR generation for long arithmetic operation

X86Mir2Lir::GenLongArith generated wrong LIR if the first argument
of the operation was promoted. It forgot to swap arguments if
the first was not temp, but the second was temp

Change-Id: I389f72f560ce9924859e17385bc8f64793c77b67
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Signed-off-by: Yevgeny Rouban <yevgeny.y.rouban@intel.com>
uick/x86/int_x86.cc
719d1a33f6569864f529e5a3fff59e7bca97aad0 06-Mar-2014 Ian Rogers <irogers@google.com> Enable annotalysis on clang ART builds.

Fix clang build errors aswell as restructure locking/mutex code for correct
thread safety analysis support.
Reorder make dependencies so that host builds build first as they should
provide better compilation errors than target.
Remove host's use of -fno-omit-frame-pointer as it has no value with correct
use of CFI, which we should have.

Change-Id: I72cea8da9a3757b1a0b3acb4081feccb7c6cef90
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
erified_method.h
83cc7ae96d4176533dd0391a1591d321b0a87f4f 12-Feb-2014 Vladimir Marko <vmarko@google.com> Create a scoped arena allocator and use that for LVN.

This saves more than 0.5s of boot.oat compilation time
on Nexus 5.

TODO: Move other stuff to the scoped allocator. This CL
alone increases the peak memory allocation. By reusing
the memory for other parts of the compilation we should
reduce this overhead.

Change-Id: Ifbc00aab4f3afd0000da818dfe68b96713824a08
it_vector_block_iterator.h
ompiler_ir.h
rontend.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
uick/arm/call_arm.cc
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/local_optimizations.cc
uick/mips/call_mips.cc
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/target_x86.cc
sa_transformation.cc
reg_analysis.cc
51a80d72dc436a4a89c636987b9cedabe774fdd6 06-Mar-2014 Maxim Kazantsev <maxim.kazantsev@intel.com> LongToFp result storage fixed

When converting long values to floating-point, the resulting value
was not stored properly. This was the reason of incorrect results
of arithmetic operations where such conversions were used.

Performance measurement in Quadrant Pro KPI benchmark was blocked
by long-to-fp conversion errors.

This patch ensures that result of long-to-fp conversion is stored
properly.

Change-Id: I94beffcf7f0146c0c6d5b8ae33b020c985843db0
Signed-off-by: Maxim Kazantsev <maxim.kazantsev@intel.com>
uick/x86/fp_x86.cc
a44d4f508fa1642294e79d3ebecd790afe75ea60 05-Mar-2014 buzbee <buzbee@google.com> Fix read of uninitialized memory in InlineIndexOf

The are two flavors of IndexOf that we treat as an intrinsic: a
zero-based verion with 2 args and a 3-arg version that also takes
a start position. The same code is used for both, but Valgrind
reminded us that we shouldn't try loading a RegLocation for the
non-extent 3rd arg in the 2 argument version.

We got lucky in that the bug was benign - the generated code would
still be correct.

Change-Id: I0bc7798c8034d35007ffe6d6d62f9ceb91fc44fd
uick/gen_invoke.cc
uick/x86/target_x86.cc
a1a7074eb8256d101f7b5d256cda26d7de6ce6ce 03-Mar-2014 Vladimir Marko <vmarko@google.com> Rewrite kMirOpSelect for all IF_ccZ opcodes.

Also improve special cases for ARM and add tests.

Change-Id: I06f575b9c7b547dbc431dbfadf2b927151fe16b9
ir_graph.h
ir_optimization.cc
uick/arm/int_arm.cc
uick/codegen_util.cc
uick/mir_to_lir.h
uick/x86/int_x86.cc
093aad184b4451639951a7e012d9b55cbf8c8a07 04-Mar-2014 Vladimir Marko <vmarko@google.com> Merge "Remove unreachable catch entries in GenSpecialCase()."
2da882315a61072664f7ce3c212307342e907207 27-Feb-2014 Andreas Gampe <agampe@google.com> Initial changes towards Generic JNI option

Some initial changes that lead to an UNIMPLEMENTED. Works
by not compiling for JNI right now and tracking native methods
which have neither quick nor portable code. Uses new trampoline.

Change-Id: I5448654044eb2717752fd7359f4ef8bd5c17be6e
ompiler_ir.h
rontend.cc
uick/codegen_util.cc
00e1ec6581b5b7b46ca4c314c2854e9caa647dd2 28-Feb-2014 Bill Buzbee <buzbee@android.com> Revert "Revert "Rework Quick compiler's register handling""

This reverts commit 86ec520fc8b696ed6f164d7b756009ecd6e4aace.

Ready. Fixed the original type, plus some mechanical changes
for rebasing.

Still needs additional testing, but the problem with the original
CL appears to have been a typo in the definition of the x86
double return template RegLocation.

Change-Id: I828c721f91d9b2546ef008c6ea81f40756305891
ir_graph.h
ir_optimization.cc
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
reg_analysis.cc
f796ca0715d0cb6f5afe00b3df00e80f99e186f7 03-Mar-2014 Bill Buzbee <buzbee@android.com> Merge "Incorrect result of the "mul-long by 1" operation"
20daf93b38870290e13518ad4db0ccfcd7d9f018 03-Mar-2014 Vladimir Marko <vmarko@google.com> Fix 64-bit build DCHECK failure in mir_fieldinfo.cc .

Change-Id: I6021862b42358d4d1bfb8059470da08117a34336
ir_field_info.cc
be0e546730e532ef0987cd4bde2c6f5a1b14dd2a 26-Feb-2014 Vladimir Marko <vmarko@google.com> Cache field lowering info in mir_graph.

Change-Id: I9f9d76e3ae6c31e88bdf3f59820d31a625da020f
b_optimizations.h
ex_to_dex_compiler.cc
ocal_value_numbering.cc
ocal_value_numbering_test.cc
ir_analysis.cc
ir_field_info.cc
ir_field_info.h
ir_graph.cc
ir_graph.h
ass_driver.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
cc261bfd336eddac18b85d4eb47f6c905d495241 03-Mar-2014 Vladimir Marko <vmarko@google.com> Merge "Remove non-existent ARM insn kThumb2SubsRRI12."
ae9fd93c39a341e2dffe15c61cc7d9e841fa92c4 11-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Tell GDB about Quick ART generated code

This is actually a lot of work. To do this, we need:
.debug_info
.debug_abbrev
.debug_frame
.debug_str

These are generated into the OAT file by OatWriter and ElfWriterQuick.

Since the Quick ART runtime doesn't use dlopen to load the OAT files,
GDB can't find this information. Use the alternate GDB JIT interface,
which can be invoked at runtime. To use this interface, an ELF image
needs to be built in memory. Read the information from the OAT file,
fixup the addresses to point to the real locations, add a symbol table
to hold the .text symbol, and then let GDB know about the information,
which will be read from the runtime address space.

This is quite primitive now, and could be cleaned up considerably. It
probably needs symbol table entries for the methods, and descriptions of
parameters and return types.

Currently only supported for X86.

This defaults to enabled for debug builds. Added dexoat --gen-gdb-info
and --no-gen-gdb-info flags to override.

Change-Id: I4d18b2370f6dfaa00c8cc1925f10717be3bd1a62
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/codegen_util.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
3d504075f7c1204d581923460754bf6d3714b13f 01-Mar-2014 Ian Rogers <irogers@google.com> Make out arguments non-reference types.

Also, tidy some portable related code.

Change-Id: I67c8aa52eef8b556ca117ecda1b1e75465ba06a5
ompiler_ir.h
rontend.cc
b48b9eb6d181a1f52e2e605cf26a21505f1d46ed 01-Mar-2014 Ian Rogers <irogers@google.com> Fix clang to compile and run host tests.

Don't use the computed goto interpreter with clang 3.4 as it causes compilation
to hang.
Avoid inclusion of LLVM_(HOST|DEVICE)_BUILD_MK except for with portable as it
sets clang incompatible cflags.
Most fixes are self-evident, for the quick dex file method inliner the enums
were being used with ostreams, so fix the enums and operator out python script
to allow this.
Note this change effects portable but this is untestable as portable was broken
by ELF file and mc linker changes.

Change-Id: Ia54348f6b1bd3f76d3b71c6e8c5f97626386b903
rontend.h
ass.h
ortable/mir_to_gbc.cc
ortable/mir_to_gbc.h
uick/dex_file_method_inliner.h
dbb8c49d540edd2a39076093163c7218f03aa502 28-Feb-2014 Vladimir Marko <vmarko@google.com> Remove non-existent ARM insn kThumb2SubsRRI12.

For kOpSub/kOpAdd, prefer modified immediate encodings
because they set flags.

Change-Id: I41dcd2d43ba1e62120c99eaf9106edc61c41e157
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
39d95e695e2ef1fbd420eba6ceaa40c688099c30 28-Feb-2014 Vladimir Marko <vmarko@google.com> Remove unreachable catch entries in GenSpecialCase().

Fix debug build CHECK failure when we generate special
method implementation and drop unreachable catch handlers.

Bug: 13164331
Change-Id: I00e9841a2db8acaf1e81e1d9702e155c5b7e72e2
uick/mir_to_lir.cc
b1f1d642093418612c0a27ce4203b421bb6eb767 27-Feb-2014 buzbee <buzbee@google.com> Workaround for range ops spanning vreg gap

The Dalvik runtime model includes two stacks: an interpreted stack
holding the Dalvik virtual registers, and a native stack used by
the runtime system itself. The interpreted stack closely follows
the Dalvik byte-code frame layout and invoke model, in which a
callee's incoming argument are physically located in the out region
of the caller's frame. Further, the non-argument vregs of a method
are contiguous with its in argument region.

The Art runtime model retains the notion of a callee's incoming
arguments being physically located in the out region of a caller's
frame. However, because Art uses a single-stack model, a method's
incoming argument region is not contiguous with its non-argument
virtual register storage. There is a gap between them that is used
to store the native return PC of the caller, as well as the callee
save register spill region.

The Dalvik's bytecode instruction set includes several "range"
format instructions (invoke-static-range, fill-array-data-range,
etc.). These instructions define a contiguous range of virtual
registers as arguments. Given the current Dalvik bytecode definition,
there is no rule preventing an operand range from spanning the
incoming argument and normal vregs. In Dalvik, this would not have
been an issue. In Art, it adds complexity to correctly copy a
range of arguments with a potential gap somewhere in the middle.

We don't believe this is a common situation. This workaround CL
ensures correct behavior by detecting the spanning case and falling
back to the interpreter.

If it turns out this is a more common case than expected, compiler
support can be added. More likely, though, is that we will disallow
spanning ranges in a future revision of the bytecode (going forward,
existing range-spanning bytecode will continue to be supported).

Fix for internal tracking bug 13216301
Fix for external bug https://code.google.com/p/android/issues/detail?id=66371

Change-Id: I9562aa5ab0aae8ebf333c8b72caac8a1be33ab3c
ir_analysis.cc
ir_graph.cc
ir_graph.h
b565506a63e75dac4a8bb9dd54dabf5259e5b95f 27-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Move arena_bit_vector.h/cc to compiler/utils."
a1ce1fef2d49d1d537776a5308ace7102a815fe5 25-Feb-2014 Brian Carlstrom <bdc@google.com> Split up CommonTest into CommonRuntimeTest and CommonCompilerTest

Change-Id: I8dcf6b29a5aecd445f1a3ddb06386cf81dbc9c70
uick/mir_to_lir.h
86ec520fc8b696ed6f164d7b756009ecd6e4aace 26-Feb-2014 Bill Buzbee <buzbee@android.com> Revert "Rework Quick compiler's register handling"

This reverts commit 2c1ed456dcdb027d097825dd98dbe48c71599b6c.

Change-Id: If88d69ba88e0af0b407ff2240566d7e4545d8a99
ir_graph.h
ir_optimization.cc
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
reg_analysis.cc
0e33643519b68a343a7466dcaba12b8567777cc3 26-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Move arena_bit_vector.h/cc to compiler/utils.

Also move MIR's BasicBlock related code from arena_bit_vector.h to
bit_vector_block_iterator.cc.

Change-Id: I85c224b387d31cf57a1ef1f1a36eaadf22f1c85d
rena_bit_vector.cc
rena_bit_vector.h
it_vector_block_iterator.cc
it_vector_block_iterator.h
ompiler_enums.h
ir_graph.h
sa_transformation.cc
2c1ed456dcdb027d097825dd98dbe48c71599b6c 20-Feb-2014 buzbee <buzbee@google.com> Rework Quick compiler's register handling

For historical reasons, the Quick backend found it convenient
to consider all 64-bit Dalvik values held in registers
to be contained in a pair of 32-bit registers. Though this
worked well for ARM (with double-precision registers also
treated as a pair of 32-bit single-precision registers) it doesn't
play well with other targets. And, it is somewhat problematic
for 64-bit architectures.

This is the first of several CLs that will rework the way the
Quick backend deals with physical registers. The goal is to
eliminate the "64-bit value backed with 32-bit register pair"
requirement from the target-indendent portions of the backend
and support 64-bit registers throughout.

The key RegLocation struct, which describes the location of
Dalvik virtual register & register pairs, previously contained
fields for high and low physical registers. The low_reg and
high_reg fields are being replaced with a new type: RegStorage.
There will be a single instance of RegStorage for each RegLocation.
Note that RegStorage does not increase the space used. It is
16 bits wide, the same as the sum of the 8-bit low_reg and
high_reg fields.

At a target-independent level, it will describe whether the physical
register storage associated with the Dalvik value is a single 32
bit, single 64 bit, pair of 32 bit or vector. The actual register
number encoding is left to the target-dependent code layer.

Because physical register handling is pervasive throughout the
backend, this restructuring necessarily involves large CLs with
lots of changes. I'm going to roll these out in stages, and
attempt to segregate the CLs with largely mechanical changes from
those which restructure or rework the logic.

This CL is of the mechanical change variety - it replaces low_reg
and high_reg from RegLocation and introduces RegStorage. It also
includes a lot of new code (such as many calls to GetReg())
that should go away in upcoming CLs.

The tentative plan for the subsequent CLs is:

o Rework standard register utilities such as AllocReg() and
FreeReg() to use RegStorage instead of ints.
o Rework the target-independent GenXXX, OpXXX, LoadValue,
StoreValue, etc. routines to take RegStorage rather than
int register encodings.
o Take advantage of the vector representation and eliminate
the current vector field in RegLocation.
o Replace the "wide" variants of codegen utilities that take
low_reg/high_reg pairs with versions that use RegStorage.
o Add 64-bit register target independent codegen utilities
where possible, and where not virtualize with 32-bit general
register and 64-bit general register variants in the target
dependent layer.
o Expand/rework the LIR def/use flags to allow for more registers
(currently, we lose out on 16 MIPS floating point regs as
well as ARM's D16..D31 for lack of space in the masks).
o [Possibly] move the float/non-float determination of a register
from the target-dependent encoding to RegStorage. In other
words, replace IsFpReg(register_encoding_bits).

At the end of the day, all code in the target independent layer
should be using RegStorage, as should much of the target dependent
layer. Ideally, we won't be using the physical register number
encoding extracted from RegStorage (i.e. GetReg()) until the
NewLIRx() layer.

Change-Id: Idc5c741478f720bdd1d7123b94e4288be5ce52cb
ir_graph.h
ir_optimization.cc
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
eg_storage.h
reg_analysis.cc
c17ebe866beb50eb6da1e6a47555cb4731467f3b 26-Feb-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> Incorrect result of the "mul-long by 1" operation

ART handles "mul-long by 1" as a special case and try to alloc a new pair
of regs through the EvalLocWide method and then put there the multiplicand
through the StoreValueWide method. But in case when both multiplicand and
multiplier are constants, it will not place correct values in a new reg pair
and result of calculations will be incorrect. The new solution uses the
only StoreValueWide method.

Change-Id: I3d6947737c92c5a12f2840003b17a427e31d288f
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/gen_loadstore.cc
uick/x86/int_x86.cc
b55c898c6e3a1569a03cedbfc6dbf93d8d8ff3dd 25-Feb-2014 Bill Buzbee <buzbee@android.com> Merge "Implements a BasicBlock iterator using the ArenaBitVector."
f7a82b422fa0428fb5678d91804610d56398b478 11-Feb-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> Implements a BasicBlock iterator using the ArenaBitVector.

Added the implementation of a BasicBlock iterator using the ArenaBitVector.
This patch only adds the implementation of the iterator and does not yet use
it everywhere it could be.

Added one example in ssa_transformation.cc of its use.

Change-Id: Ia85d58320c80c48a43609265ea5318a416c71f18
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
rena_bit_vector.cc
rena_bit_vector.h
sa_transformation.cc
a028595f52b61e855d6dcf75f6bdf129d5568895 25-Feb-2014 Hiroshi Yamauchi <yamauchi@google.com> Merge "Fix hardcoded offsets in x86 String.indexOf."
2e589aa58a1372909f95e731fd6b8895f6359c3a 25-Feb-2014 Vladimir Marko <vmarko@google.com> Encode VmapTable entries offset by 2 to reduce size.

We're using special values 0xffff and 0xfffe for an
fp register marker and for method pointer, respectively.
These values were being encoded as 3 bytes each and
this changes their encoding to 1 byte.

Bug: 9437697
Change-Id: Ic1720e898b131a5d3f6ca87d8e1ecdf76fb4160a
uick/codegen_util.cc
e19c91fdb88ff6fd4e88bc5984772dcfb1e86f80 25-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Fix hardcoded offsets in x86 String.indexOf.

Use runtime code that will work for 32 and 64 bit too. The old code
copied constants from the runtime .S file and is correct for 32 bit code
only.

Change-Id: I668e1d7f2db8186518c358bde0759633be0d7c40
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/target_x86.cc
67f8f404a242752651771ab34df18f8eab910cb3 25-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Fix typo from previous commit that lead to performance regression."
a36aeb30e806e0c899592bbaeee2b94bac4ab585 25-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Fix typo from previous commit that lead to performance regression.

Change-Id: I851654ae28522dd0358137578593d030e7eb9256
ir_optimization.cc
6449c62e40ef3a9bb75f664f922555affb532ee4 11-Feb-2014 Brian Carlstrom <bdc@google.com> Create CompilerOptions

Package up most compiler related options in CompilerOptions. Details include:
- Includes compiler filter, method thresholds, SEA IR mode.
- Excludes those needed during Runtime::Init such as CompilerCallbacks and VerificationResults.
- Pass CompilerOptions to CompilerDriver.
- Remove CompilerOptions from Runtime.
- Add ability to pass options for app and image dex2oat to runtime via
-Xcompiler-option and -Ximage-compiler-option respectively.

Other
- Replace 2x CompilerCallbacks implementations with one.
- Factor out execv code for use by both image and oat generation.
- More OatFile error_msg reporting.
- DCHECK for SuspendAll found trying to run valgrind.

Change-Id: Iecb57da907be0c856d00c3cd634b5042a229e620
rontend.cc
ir_analysis.cc
ir_graph.h
erification_results.cc
erification_results.h
9a509efcd68644616817f59ed7d442ed6f024ff9 21-Feb-2014 Brian Carlstrom <bdc@google.com> Merge "Convert some LOG(DEBUG) messages into more approriate levels"
9c86a0279aaf953377aa9e2277592e68bf814989 21-Feb-2014 Ian Rogers <irogers@google.com> Revert "Annotate used fields."

This reverts commit 7f6cf56942c8469958b273ea968db253051c5b05.

Change-Id: Ic389a194c3404ecb5bb563a405bf4a0d6336ea0d
b_optimizations.h
ocal_value_numbering.cc
ocal_value_numbering_test.cc
ir_analysis.cc
ir_annotations.cc
ir_annotations.h
ir_graph.cc
ir_graph.h
ass_driver.cc
uick/gen_common.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
f59f18b2bd5432bb083205680c69fe64aaf60f39 17-Feb-2014 Vladimir Marko <vmarko@google.com> Fix and rewrite local value numbering.

Fix memory versioning to take aliasing and method calls
into account. Use more instructions for the null check
elimination. Return the local value name of the register
defined by the instruction if applicable.

Change-Id: I4560bc680ae1ad553a7a00fa092c937e3da9fbbe
ocal_value_numbering.cc
ocal_value_numbering.h
ocal_value_numbering_test.cc
ir_annotations.h
ir_graph.h
4dc23380cd99967d65c4f3b3f540cb0c78e9f546 21-Feb-2014 Vladimir Marko <vmarko@google.com> Merge "Annotate used fields."
b3558e1bfe96398fc3d9bfddda2821b768a3f9a7 21-Feb-2014 Brian Carlstrom <bdc@google.com> Convert some LOG(DEBUG) messages into more approriate levels

Change-Id: Iace4b1e38e5bb116af78f665dad2bb6cd25c8ec7
ass_driver.cc
4028a6c83a339036864999fdfd2855b012a9f1a7 20-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Inline x86 String.indexOf

Take advantage of the presence of a constant search char or start index
to tune the generated code.

Change-Id: I0adcf184fb91b899a95aa4d8ef044a14deb51d88
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/x86_lir.h
7f6cf56942c8469958b273ea968db253051c5b05 29-Jan-2014 Vladimir Marko <vmarko@google.com> Annotate used fields.

Annotate all fields used by a method early during the
compilation, check acces rights and record field offset,
volatility, etc. Use these annotations when generating code
for IGET/IPUT/SGET/SPUT instructions.

Change-Id: I4bbf5cca4fecf53c9bf9c93ac1793e2f40c16b5f
b_optimizations.h
ir_analysis.cc
ir_annotations.cc
ir_annotations.h
ir_graph.cc
ir_graph.h
ass_driver.cc
uick/gen_common.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
f3e2cc4a38389aa75eb8ee3973a535254bf1c8d2 18-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Code cleanup to avoid LLVM dependency when building with quick only.

Change-Id: I0985c227d775c72fd23975d4c9bf673ba32615c2
ompiler_ir.h
ir_graph.cc
uick/x86/target_x86.cc
818f2107e6d2d9e80faac8ae8c92faffa83cbd11 18-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Re-apply: Initial check-in of an optimizing compiler.

The classes and the names are very much inspired by V8/Dart.
It currently only supports the RETURN_VOID dex instruction,
and there is a pretty printer to check if the building of the
graph is correct.

Change-Id: I28e125dfee86ae6ec9b3fec6aa1859523b92a893
rena_allocator.cc
rena_allocator.h
rena_allocator_test.cc
rena_bit_vector.h
ackend.h
ompiler_ir.h
rowable_array.h
ir_graph.h
uick/mir_to_lir.h
1af0c0b88a956813eb0ad282664cedc391e2938f 19-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Revert "Initial check-in of an optimizing compiler."

g++ warnings turned into errors.

This reverts commit 68a5fefa90f03fdf5a238ac85c9439c6b03eae96.

Change-Id: I09bb95d9cc13764ca8a266c41af04801a34b9fd0
rena_allocator.cc
rena_allocator.h
rena_allocator_test.cc
rena_bit_vector.h
ackend.h
ompiler_ir.h
rowable_array.h
ir_graph.h
uick/mir_to_lir.h
68a5fefa90f03fdf5a238ac85c9439c6b03eae96 18-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Initial check-in of an optimizing compiler.

The classes and the names are very much inspired by V8/Dart.
It currently only supports the RETURN_VOID dex instruction,
and there is a pretty printer to check if the building of the
graph is correct.

Change-Id: Id5ef1b317ab997010d4e3888e456c26bef1ab9c0
rena_allocator.cc
rena_allocator.h
rena_allocator_test.cc
rena_bit_vector.h
ackend.h
ompiler_ir.h
rowable_array.h
ir_graph.h
uick/mir_to_lir.h
2befd09cf4fe89a18a655f3e1dd310831bfa769f 18-Feb-2014 Vladimir Marko <vmarko@google.com> Merge "Expose inline method identification for debugger."
46861fccd9b5efb3226e2003310f01e748aec0a1 18-Feb-2014 Vladimir Marko <vmarko@google.com> Merge "GenSpecialCase support for x86"
84c072c348006d87a370ad6e746e2d976cbe62f2 17-Feb-2014 Vladimir Marko <vmarko@google.com> Expose inline method identification for debugger.

Also, record only those getter/setter functions which
we really intend to inline in the short term (and which
actually have a special implementation emitted).

Change-Id: Icb8d71707a65cb6fabae5bc9118e5f3eaf7b63dd
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
df8d416733642347c92ae2b4175b8fd0af401f31 18-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Rewrite the compiler interface for CompilerDriver."
f5df8974173124faddb8e2b6a331959afdb94fdf 14-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Rewrite the compiler interface for CompilerDriver.

Change-Id: I15fa9afe7ffb7283ebda8d788a1e02793e3f75a6
ompiler_ir.h
rontend.cc
ir_optimization.cc
ortable/mir_to_gbc.cc
b52b2195c21ce53ef71e576d674dc549dd4b4949 18-Feb-2014 Ian Rogers <irogers@google.com> Merge "Optimize x86 long V*V by skipping imul"
89925e948c49616689eb4959aaf0e4ff1de18161 15-Feb-2014 Ian Rogers <irogers@google.com> Merge "Fixed result storage of instruction with long constant operand"
de99bba92b4beac4c347772177f47bdd61e8f376 14-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Optimize x86 long V*V by skipping imul

The algorithm for long multiplication can take advantage of the fact
that we are multiplying a value by itself by converting 1L*2H + 2L*1H
into (2H*1L)+(2H*1L), thus converting a multiply into an addition.

Change-Id: I259a25699a8787badd943318e99bafdd06587ec6
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/int_x86.cc
79aa423fce400db3f551a3874e69e7cc4fb4f68f 13-Feb-2014 Alexei Zavjalov <alexei.zavjalov@intel.com> x86 compiler should handle the "div/rem by 1" case

The current implementation of the (div/rem)/imm algorithm in
ART's x86 compiler (X86Mir2Lir::GenDivRemLit) handles the only
case when imm == -1, imm >= 2 and imm <= -2, but in the case
when imm == 1, the result of calculation is incorrect.

This patch adds handler of the "div/rem by 1" case.

Change-Id: I4bcdcd9c17f5ccb6c60e7c359c00e04cd07f5bee
Signed-off-by: Alexei Zavjalov <alexei.zavjalov@intel.com>
uick/x86/int_x86.cc
3bc01748ef1c3e43361bdf520947a9d656658bf8 06-Feb-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> GenSpecialCase support for x86

Moved GenSpecialCase from being ARM specific to common code to allow
it to be used by x86 quick as well.

Change-Id: I728733e8f4c4da99af6091ef77e5c76ae0fee850
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ir_graph.cc
ir_graph.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
653f2bf126ee55f0a8033d840040bb00d74ea593 13-Feb-2014 Maxim Kazantsev <maxim.kazantsev@intel.com> Fixed result storage of instruction with long constant operand

When generating native code from .dex file, ART needs to store
operation results correctly. There were incorrect results in
computations with long constant arguments. The cause is
inappropriate usage of registers storing result of such
operation which is not yet spilled into memory and is still
required for following instructions. There were mov-s into
these registers.

This patch ensures that the result of long operation with constant
operand will be stored properly.

Change-Id: Id65801eb76f0efb67515b73b8d01423205da1892
Signed-off-by: Maxim Kazantsev <maxim.kazantsev@intel.com>
uick/x86/int_x86.cc
ed8081ab1e7fd5dc1d3429fc116ee02e450bbc0f 12-Feb-2014 Ian Rogers <irogers@google.com> Merge "Support to generate inline long to FP bytecodes for x86"
7655968112fa08844f3a810bd6203fdde4d5f58f 12-Feb-2014 Vladimir Marko <vmarko@google.com> Merge "Generate ARM special methods from InlineMethod data."
614c2b4e219631e8c190fd9fd5d4d9cd343434e1 29-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Support to generate inline long to FP bytecodes for x86

long-to-float and long-to-double are now generated inline instead of calling
a helper routine. The conversion is done by using x87.

Change-Id: I196e526afec1be212898baceca8527549c3655b6
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
uick/mir_to_lir-inl.h
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/x86_lir.h
0177e53ea521ad58b70c305700dab32f1ac773b7 12-Feb-2014 Ian Rogers <irogers@google.com> Work in the direction of hard float quick ABIs.

Pass a shorty to ArtMethod::Invoke so that register setup can use it.
Document x86-64 ABI.
Add extra debug output for one JNI native method registration fails, namely a
dump of the Class and its dex file's location.
Add hack to get testing of OatMethod's without GC maps working in 64bit.

Change-Id: Ic06b68e18eac33637df2caf5e7e775ff95ae70f3
uick/x86/x86_lir.h
abaf927f29f6feceb3df3e6ced7d01970ba0dbe9 11-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Re-apply: Implement cumulative timings for CompilerDriver."
ea3fa0b4ba13d7bd7f7c1cd85202ccbe141a35ae 10-Feb-2014 Nicolas Geoffray <ngeoffray@google.com> Re-apply: Implement cumulative timings for CompilerDriver.

The bug was due to how the test infrastructure works:
a compiler driver surives the stack where it is allocated.

Change-Id: I345fe0e4afb2bd15937233db8afb350f09429558
rontend.cc
b1e61ad59958f70fe4db6e134b9c8dfc47733a30 11-Feb-2014 Ian Rogers <irogers@google.com> Merge "Tweak Mir2Lir::GenInstanceofCallingHelper for X86"
6607d97166984ce578817269f9775c15b9044190 10-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Tweak Mir2Lir::GenInstanceofCallingHelper for X86

Make this virtual, and split out the X86 logic. Take advantage of SETcc
instruction for X86.

I don't think I can do much more due to need to preserve arguments for
the calls.

Change-Id: I10e3eaa61b61ceac384267e3078bb6f75c37cee4
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_common.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
41ccc3b70dee0b43b3de6421c0643905720f40e3 11-Feb-2014 Ian Rogers <irogers@google.com> Merge "Added inlined abs method with float and double type"
35d7e414134bd9f3d39e018a756617b21d49c877 10-Feb-2014 Ian Rogers <irogers@google.com> Merge "Support Direct Method/Type access for X86"
6c92e7d619986ecb02a379068bd6623cd5852cea 10-Feb-2014 Ian Rogers <irogers@google.com> Merge "Rewrite GenInlinedCharAt for x86"
55d0eac918321e0525f6e6491f36a80977e0d416 06-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Support Direct Method/Type access for X86

Thumb generates code to optimize calls to methods within core.oat.
Implement this for X86 as well, but take advantage of mov with 32 bit
immediate and call relative with 32 bit immediate.

Fix some incorrect return locations for long inlines.

Change-Id: I1907bdfc7574f3d0aa76c7fad13dc537acdf1ed3
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
502c2a84888b7da075049dcaaeb0156602304f65 06-Feb-2014 Vladimir Marko <vmarko@google.com> Generate ARM special methods from InlineMethod data.

Change-Id: I204b01660a1e515879524018d1371e31f41da59b
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
c9bf407643329fee7eb2603fdace46eebf618cc6 10-Feb-2014 Vladimir Marko <vmarko@google.com> Fix special getter/setter generation.

Change-Id: I381618bdcc46c51b50e94042f332db99c3a71a38
uick/arm/call_arm.cc
2bc47809febcf36369dd40877b8226318642b428 10-Feb-2014 Vladimir Marko <vmarko@google.com> Revert "Revert "Check FastInstance() early for special getters and setters.""

This reverts commit 632e458dc267fadfb8120be3ab02701e09e64875.

Change-Id: I5098c41ee84fbbb39397133a7ecfd367fecebe42
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
632e458dc267fadfb8120be3ab02701e09e64875 08-Feb-2014 Ian Rogers <irogers@google.com> Revert "Check FastInstance() early for special getters and setters."

This reverts commit 5dc5727261e87ba8a418e2d0e970c75f67e4ab79.

Change-Id: I3299c8ca5c3ce3f2de994bab61ea16a734f1de33
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
dbb17e378b538133750e56375bbdbb217db7b248 07-Feb-2014 Yixin Shou <yixin.shou@intel.com> Added inlined abs method with float and double type

This patch added the implementation for inlining java.lang.Math.abs()
method with float and double type.

Change-Id: Ic99471b4ab4176e4a0153bef383bb49944fb636f
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mir_to_lir.h
5dc5727261e87ba8a418e2d0e970c75f67e4ab79 05-Feb-2014 Vladimir Marko <vmarko@google.com> Check FastInstance() early for special getters and setters.

Perform the FastInstance() check for getters and setters
when they are detected by the inliner. This will help avoid
the FastInstance() check for inlining.

We also record the field offset and whether the field is
volatile and whether the method is static for use when
inlining or generating the special accessors.

Change-Id: I3f832fc9ae263883b8a984be89a3b7793398b55a
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
ef7d42fca18c16fbaf103822ad16f23246e2905d 06-Jan-2014 Ian Rogers <irogers@google.com> Object model changes to support 64bit.

Modify mirror objects so that references between them use an ObjectReference
value type rather than an Object* so that functionality to compress larger
references can be captured in the ObjectRefererence implementation.
ObjectReferences are 32bit and all other aspects of object layout remain as
they are currently.

Expand fields in objects holding pointers so they can hold 64bit pointers. Its
expected the size of these will come down by improving where we hold compiler
meta-data.
Stub out x86_64 architecture specific runtime implementation.
Modify OutputStream so that reads and writes are of unsigned quantities.
Make the use of portable or quick code more explicit.
Templatize AtomicInteger to support more than just int32_t as a type.
Add missing, and fix issues relating to, missing annotalysis information on the
mutator lock.
Refactor and share implementations for array copy between System and uses
elsewhere in the runtime.
Fix numerous 64bit build issues.

Change-Id: I1a5694c251a42c9eff71084dfdd4b51fff716822
rena_allocator.cc
uick/gen_invoke.cc
2b724cbb4cb096d3e061c3ab720954608016ee0c 06-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Rewrite GenInlinedCharAt for x86

Take advantage of memory addressing modes and use constant index values
directly for x86.

Change-Id: I4476862f415908ebc38ba2bc59ec4d23785f6173
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_invoke.cc
2c498d1f28e62e81fbdb477ff93ca7454e7493d7 30-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Specializing x86 range argument copying

The ARM implementation of range argument copying was specialized in some cases.
For all other architectures, it would fall back to generating memcpy. This patch
updates the x86 implementation so it does not call memcpy and instead generates
loads and stores, favoring movement of 128-bit chunks.

Change-Id: Ic891e5609a4b0e81a47c29cc5a9b301bd10a1933
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ompiler_enums.h
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
67c39c4aefca23cb136157b889c09ee200b3dec6 01-Feb-2014 Mark Mendell <mark.p.mendell@intel.com> Support Literal pools for x86

They are being used to store double constants, which are very
expensive to generate into XMM registers. Uses the 'Compiler
Temporary' support just added. The MIR instructions are scanned for
a reference to a double constant, a packed switch or a FillArray.
These all need the address of the start of the method, since 32
bit x86 doesn't have a PC-relative addressing mode.

If needed, a compiler temporary is allocated, and the address of
the base of the method is calculated, and stored. Later uses can
just refer to the saved value.

Trickiness comes when generating the load from the literal area,
as the offset is unknown before final assembler. Assume a 32 bit
displacement is needed, and fix this if it wasn't necessary.

Use LoadValue to load the 'base of method' pointer. Fix an incorrect
test in GetRegLocation.

Change-Id: I53ffaa725dabc370e9820c4e0e78664ede3563e6
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ir_graph.h
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
6a5ed25e8e692b1a70bfe6385329a3d5f90959ca 06-Feb-2014 Ian Rogers <irogers@google.com> Merge "Redo x86 int arithmetic"
bcec6fba95ee7974d3f7b81c3c02e7eb3ca3df00 17-Jan-2014 Dave Allison <dallison@google.com> Make slow paths easier to write

This adds a class LIRSlowPath that allows for deferred compilation
of slow paths. Using this object you can add code that will be
invoked out of line using a forward branch. The intention is to
move the slow paths out of the main flow and avoid branch-over
constructs that will almost always trigger. The forward branch
to the slow path code will be predicted false and this will
be correct most of the time. The slow path code returns to the
instruction after the original branch using an unconditional branch.

This is used in the following opcodes: sput, sget, const-string,
check-cast, const-class.

Others will follow.

Bug: 10864890
Change-Id: I17130c5dc20d369bc6bbf50b8cf04343263e888e
rowable_array.h
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
d69835d841cb7663faaa2f1996e73e8c0b3f6d76 03-Feb-2014 buzbee <buzbee@google.com> Art Compiler: fix compiler temps

AOSP CL 78835 "Enable compiler temporaries" built on some earlier
work to enable the compiler to add temps in the style of Dalvik's
vRegs during MIR optimizations. However, it missed an existing
fixed-size array whose size depended on the number of temps allocated.
The allocation of this array must be delayed until after the
number of compiler temps is known.

The result was array overrun, and strange failures.

Change-Id: I986a3b557e2323e00ba852584de03a02931b3c78
uick/codegen_util.cc
uick/ralloc_util.cc
feb2b4e2d1c6538777bb80b60f3a247537b6221d 28-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Redo x86 int arithmetic

Make Mir2Lir::GenArithOpInt virtual, and implement an x86 version of it
to allow use of memory operands and knowledge of the fact that x86 has
(mostly) two operand instructions. Remove x86 specific code from the
generic version.

Add StoreFinalValue (matches StoreFinalValueWide) to handle the non-wide
cases. Add some x86 helper routines to simplify generation.

Change-Id: I6c13689c6da981f2570ab5af7a97f9816108b7ae
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_common.cc
uick/gen_loadstore.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
316116b8f11998fa07e532366482ae9493c1a1c6 01-Feb-2014 Ian Rogers <irogers@google.com> Merge "Remove redundant compare for x86 OpDecAndBranch"
616ffafa3130d0ef9cdd18c7adbf4e688026a724 31-Jan-2014 Ian Rogers <irogers@google.com> Merge "Enable compiler temporaries"
da7a69b3fa7bb22d087567364b7eb5a75824efd8 09-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Enable compiler temporaries

Compiler temporaries are a facility for having virtual register sized space
for dealing with intermediate values during MIR transformations. They receive
explicit space in managed frames so they can have a home location in case they
need to be spilled. The facility also supports "special" temporaries which
have specific semantic purpose and their location in frame must be tracked.

The compiler temporaries are treated in the same way as virtual registers
so that the MIR level transformations do not need to have special logic. However,
generated code needs to know stack layout so that it can distinguish between
home locations.

MIRGraph has received an interface for dealing with compiler temporaries. This
interface allows allocation of wide and non-wide virtual register temporaries.

The information about how temporaries are kept on stack has been moved to
stack.h. This is was necessary because stack layout is dependent on where the
temporaries are placed.

Change-Id: Iba5cf095b32feb00d3f648db112a00209c8e5f55
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
b_optimizations.cc
ompiler_ir.h
rontend.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/codegen_util.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
reg_analysis.cc
f0c3718cf42e2c45859f136e05bceb224871eae6 31-Jan-2014 Ian Rogers <irogers@google.com> Merge "Address another opportunity for reducing x86 sequence for GP pair to XMM"
39a548933c7d083647ccb1d508240198ffff5a5c 31-Jan-2014 Ian Rogers <irogers@google.com> Merge "Improve GenConstString, GenS{get,put} for x86"
95e3eebaace21eb7d7169c8af8c5b04d65557a69 31-Jan-2014 Ian Rogers <irogers@google.com> Merge "x86 updates GenInlinedUnsafePut/GenInstanceofFinal"
75ba13f244098f42584637b8fd3f6d74d2fc291a 28-Jan-2014 Vladimir Marko <vmarko@google.com> Reduce PassDriver overhead, clean up Pass and PassDriver.

Remove name lookup map and use vector for the pass list.
Add traversal mode kNoNodes to skip BasicBlock traversal.
Replace the warn_override parameter with a DCHECK.
Move iterators from arena to the stack. Style cleanup.

Change-Id: I4bf10e28caa65efb98ce82a4d7486d803ceca535
b_optimizations.cc
b_optimizations.h
ataflow_iterator-inl.h
ataflow_iterator.h
rowable_array.h
ass.h
ass_driver.cc
ass_driver.h
f7a0c5e644615fc9667eb578f1de5d05ce818435 28-Jan-2014 Hiroshi Yamauchi <yamauchi@google.com> Merge "Embed array class pointers at array allocation sites."
f43adf68df93993e8dbf23d06da8d4fcf81e72b5 28-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Address another opportunity for reducing x86 sequence for GP pair to XMM

Making use of punpckldq to interleave two 32-bit values in xmm registers
in OpRegCopyWide.

Change-Id: Ibe3b9de88d69a081f08b79fee834837d0157a4a3
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
uick/x86/int_x86.cc
df8ee2ea9908db3dde463fed68391b0040517653 28-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> x86 updates GenInlinedUnsafePut/GenInstanceofFinal

Allow x86 to inline GenInlinedUnsafePut by freeing up a temporary
register early. Make an x86 specific version of GenInstanceofFinal that
uses compare to memory and a setCC instruction.

Change-Id: I67788d7ae83776b0b9069fe4b379452190774992
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
2730db03beee4d6687ddfb5000c33c0370fbc6eb 27-Jan-2014 Vladimir Marko <vmarko@google.com> Add VerfiedMethod to DexCompilationUnit.

Avoid some mutex locking and map lookups.

Change-Id: I8e0486af77e38dcd065569572a6b985eb57f4f63
ex_to_dex_compiler.cc
ir_graph.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.cc
erification_results.cc
erification_results.h
c7f832061fea59fd6abd125f26c8ca1faec695a5 24-Jan-2014 Vladimir Marko <vmarko@google.com> Refactor verification results.

Rename VerificationMethodsData to VerificationResults.
Create new class VerifiedMethod to hold all the data for
a given method.

Change-Id: Ife1ac67cede20f3a2f9c7f5345f08a851cf1ed20
uick/codegen_util.cc
erification_results.cc
erification_results.h
erified_method.cc
erified_method.h
erified_methods_data.cc
erified_methods_data.h
766e9295d2c34cd1846d81610c9045b5d5093ddd 27-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Improve GenConstString, GenS{get,put} for x86

Rewrite GenConstString for x86 to skip calling ResolveString when the
string is already resolved. Also try to avoid a register copy if the
Method* is in a promoted register.

Implement the TODO for GenS{get,put} to use compare to memory for x86 by
adding a new codegen function to compare directly to memory. Implement
a default implementation that uses a temporary register for RISC
architectures.

Change-Id: Ie163cca3d3d841aa10c50dc6592ec30af7a7cbc9
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/utility_x86.cc
bb8f0ab736b61db8f543e433859272e83f96ee9b 28-Jan-2014 Hiroshi Yamauchi <yamauchi@google.com> Embed array class pointers at array allocation sites.

Following https://android-review.googlesource.com/#/c/79302, embed
array class pointers at array allocation sites in the compiled code.

Change-Id: I67a1292466dfbb7f48e746e5060e992dd93525c5
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
7ea5dafc81b2bba7cabad26130bb75dc8f709803 28-Jan-2014 Ian Rogers <irogers@google.com> Merge "Improve x86 long multiply and shifts"
6e65720d99bd3387b72d528a46291f1ed8184ede 27-Jan-2014 Vladimir Marko <vmarko@google.com> Merge "Remove the link from dalvik instruction back to kMirOpCheck."
4376c87eb45b287fad77a16738e76ba28956ab7d 23-Jan-2014 Vladimir Marko <vmarko@google.com> Remove the link from dalvik instruction back to kMirOpCheck.

Free the MIR::meta for another use on PUT/GET instructions.

Change-Id: Ic5a5cc5026e2076031d7b8ce7f2b36c185bfc93a
ocal_value_numbering.cc
ir_graph.cc
ir_graph.h
uick/mir_to_lir.cc
b429d1dc99b39eadd11f228e520e08b34ba3caf9 27-Jan-2014 Vladimir Marko <vmarko@google.com> Merge "Support GenSelect for x86"
e27b3bf2c1044bfbfbe874affd3758a73009c6c6 23-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Support GenSelect for x86

kMirOpSelect is an extended MIR that has been generated in order
to remove trivial diamond shapes where the conditional is an
if-eqz or if-nez and on each of the paths there is a move or
const bytecode with same destination register.

This patch enables x86 to generate code for this extended MIR.

A) Handling the constant specialization of kMirOpSelect:
1) When the true case is zero and result_reg is not same as src_reg:
xor result_reg, result_reg
cmp $0, src_reg
mov t1, $false_case
cmovnz result_reg, t1
2) When the false case is zero and result_reg is not same as src_reg:
xor result_reg, result_reg
cmp $0, src_reg
mov t1, $true_case
cmovz result_reg, t1
3) All other cases (we do compare first to set eflags):
cmp $0, src_reg
mov result_reg, $true_case
mov t1, $false_case
cmovnz result_reg, t1
B) Handling the move specialization of kMirOpSelect:
1) When true case is already in place:
cmp $0, src_reg
cmovnz result_reg, false_reg
2) When false case is already in place:
cmp $0, src_reg
cmovz result_reg, true_reg
3) When neither cases are in place:
cmp $0, src_reg
mov result_reg, true_reg
cmovnz result_reg, false_reg

Change-Id: Ic7c50823208fe82019916476a0a77c6a271679fe
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ir_optimization.cc
uick/mir_to_lir.h
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
d3266bcc340d653e178e3ab9d74512c8db122eee 24-Jan-2014 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Reduce x86 sequence for GP pair to XMM

Added support for punpckldq which is useful for interleaving
32-bit values from two xmm registers.

This new instruction is now used for transfers from GP pairs
to XMM in order to reduce path length.

Change-Id: I70d9b69449dfcfb9a94a628deb74a7cffe96bac7
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
uick/x86/assemble_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
787bbf8d181284afb564dd36fea8a6453337b888 24-Jan-2014 Ian Rogers <irogers@google.com> Merge "64bit printf flag clean-up for MIR graph."
e4a8d914d4e6a2fc8015609a91cf2f6e5ea7d2ec 24-Jan-2014 Ian Rogers <irogers@google.com> Merge "Revert "Remove the link from dalvik instruction back to kMirOpCheck.""
c6dbf900f797aa7461d50dc4e6a996f067b97203 24-Jan-2014 Ian Rogers <irogers@google.com> Revert "Remove the link from dalvik instruction back to kMirOpCheck."

This reverts commit 8a3e7e769de02b5b412163cf70da9b9fbaf3b848.

Change-Id: I03a0d6180c350569b39cee2ea194903dbdfca963
ocal_value_numbering.cc
ir_graph.cc
ir_graph.h
uick/mir_to_lir.cc
4708dcd68eebf1173aef1097dad8ab13466059aa 22-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Improve x86 long multiply and shifts

Generate inline code for long shifts by constants and do long
multiplication inline. Convert multiplication by a constant to a
shift when we can. Fix some x86 assembler problems and add the new
instructions that were needed (64 bit shifts).

Change-Id: I6237a31c36159096e399d40d01eb6bfa22ac2772
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/x86_lir.h
23b03b5b5fdaa517eda3b8b358752672cf6046b1 24-Jan-2014 Ian Rogers <irogers@google.com> 64bit printf flag clean-up for MIR graph.

Change-Id: Ib956e48ce4061e05a5d39cfacb0d58388f5c1a25
ir_graph.cc
a278ac31a1beeebd093ec64026d27a02fdc28807 24-Jan-2014 Ian Rogers <irogers@google.com> Merge "Improve x86 long divide"
57103556271b1cab119a1f0470f113c8b32cd375 24-Jan-2014 Ian Rogers <irogers@google.com> Merge "Fix X86Mir2Lir::LoadBaseIndexedDisp causing SEGV"
67122a03a4c66e01c4b64364a3701fe6ec3c5a18 24-Jan-2014 Ian Rogers <irogers@google.com> Merge "64bit friendly printf modifiers in LIR dumping."
2bf31e67694da24a19fc1f328285cebb1a4b9964 23-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Improve x86 long divide

Implement inline division for literal and variable divisors. Use the
general case for dividing by a literal by using a double length multiply
by the appropriate constant with fixups. This is the Hacker's Delight
algorithm.

Change-Id: I563c250f99d89fca5ff8bcbf13de74de13815cfe
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/x86_lir.h
ae427c3ba8d05599919c16f0c7c8983919cf7da3 24-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Fix X86Mir2Lir::LoadBaseIndexedDisp causing SEGV

If you are loading an 'array' long/double value, the generated code
could cause a SEGV, because the destination for the first load is the
same as the index register. The case for the base register being the
same as the destination was handled, but not the index register.

With this change, Calculator properly runs on the emulator.

Change-Id: Ib7e652938cdc9e127fb80ee2f541a4225a5e9ab7
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/utility_x86.cc
3f5b42f1d31c877abca2571a51dd0a5055a9b94c 24-Jan-2014 Vladimir Marko <vmarko@google.com> Merge "Optimize x86 long arithmetic"
8a3e7e769de02b5b412163cf70da9b9fbaf3b848 23-Jan-2014 Vladimir Marko <vmarko@google.com> Remove the link from dalvik instruction back to kMirOpCheck.

Free the MIR::meta for another use on PUT/GET instructions.

Change-Id: I39ee5122227f449212cf6960e11b9561b8a6de7b
ocal_value_numbering.cc
ir_graph.cc
ir_graph.h
uick/mir_to_lir.cc
e1cf6d895d0093dd5d1c81f6083bb4db63325a8e 24-Jan-2014 Vladimir Marko <vmarko@google.com> Merge "Move fused cmp branch ccode to MIR::meta."
107c31e598b649a8bb8d959d6a0377937e63e624 24-Jan-2014 Ian Rogers <irogers@google.com> 64bit friendly printf modifiers in LIR dumping.

Also correct header file inclusion ordering.

Change-Id: I8fb99e80cf1487e8b2278d4c1d110d14ed18c086
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/mips/target_mips.cc
uick/x86/target_x86.cc
be1ca55db3362f5b100c4c65da5342fd299520bb 15-Jan-2014 Hiroshi Yamauchi <yamauchi@google.com> Use direct class pointers at allocation sites in the compiled code.

- Rather than looking up a class from its type ID (and checking if
it's resolved/initialized, resolving/initializing if not), use
direct class pointers, if possible (boot-code-to-boot-class pointers
and app-code-to-boot-class pointers.)
- This results in a 1-2% speedup in Ritz MemAllocTest on Nexus 4.
- Embedding the object size (along with class pointers) caused a 1-2%
slowdown in MemAllocTest and isn't implemented in this change.
- TODO: do the same for array allocations.
- TODO: when/if an application gets its own image, implement
app-code-to-app-class pointers.
- Fix a -XX:gc bug.
cf. https://android-review.googlesource.com/79460/
- Add /tmp/android-data/dalvik-cache to the list of locations to
remove oat files in clean-oat-host.
cf. https://android-review.googlesource.com/79550
- Add back a dropped UNLIKELY in FindMethodFromCode().
cf. https://android-review.googlesource.com/74205

Bug: 9986565
Change-Id: I590b96bd21f7a7472f88e36752e675547559a5b1
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
e02d48fb24747f90fd893e1c3572bb3c500afced 15-Jan-2014 Mark Mendell <mark.p.mendell@intel.com> Optimize x86 long arithmetic

Be smarter about taking advantage of a constant operand for x86 long
add/sub/and/or/xor. Using instructions with immediates and generating
results directly into memory reduces the number of temporary registers
and avoids hardcoded register usage.

Also rewrite the existing non-const x86 arithmetic to avoid fixed
register use, and use the fact that x86 instructions are two operand.
Pass the opcode to the XXXLong() routines to easily detect two operand
DEX opcodes.

Add a new StoreFinalValueWide() routine, which is similar to StoreValueWide,
but doesn't do an EvalLoc to allocate registers. The src operand must
already be in registers, and it just updates the dest location, and
calls the right live/dirty routines to get the src into the dest
properly.

Change-Id: Iefc16e7bc2236a73dc780d3d5137ae8343171f62
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_loadstore.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
a894607bca7eb623bc957363e4b36f44cfeea1b6 22-Jan-2014 Vladimir Marko <vmarko@google.com> Move fused cmp branch ccode to MIR::meta.

This a small refactoring towards removing the large
DecodedInstruction from the MIR class.

Change-Id: I10f9ed5eaac42511d864c71d20a8ff6360292cec
ir_graph.h
ir_optimization.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
a0dac3e82231654be01be1e31a62dd40ea4a03a6 23-Jan-2014 Yixin Shou <yixin.shou@intel.com> Remove redundant compare for x86 OpDecAndBranch

For x86 OpDecAndBranch, use the flag set by the subtract to remove
the redundant compare when generating the branch to target.

Change-Id: I11e52f6d46df74cfaeeadac524dace94e2c60703
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
uick/x86/int_x86.cc
05bded260758869a5e0cf6ab55f082a586c1fb47 21-Jan-2014 Vladimir Marko <vmarko@google.com> Clean up frontend.h includes and forward declarations.

Remove unused and add needed includes and forward
declarations. Explicitly include "invoke_type.h" instead
of relying on indirect inclusion via "dex_file.h".

Change-Id: Ic7a2e0e9a1f29f10008ca42a1183e357d132fd88
rontend.h
650be76eb3c38ff905ec1d9675d73e5cb9a82dac 20-Jan-2014 Brian Carlstrom <bdc@google.com> Revert "Implement cumulative timings for CompilerDriver."

This reverts commit df013175d1aa04641e5c6175f8c786e547d31654.
rontend.cc
f3f139f1cd4a9231c2f7ed8e799aa8adeb77f4d4 17-Jan-2014 Nicolas Geoffray <ngeoffray@google.com> Merge "Implement cumulative timings for CompilerDriver."
775c47204e273c5e8f4323e42ed34f9579aa05dd 16-Jan-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> Pass Framework Cleanup

Fixed an end-of-program memory leak and added const as qualifiers
for various parameters.

The memory leak involves the pass array holder that would not be freed.
The solution now uses a template getter that holds the unique instance.

Change-Id: Ie8f5b0e5f4249f92851e8ba14e4238952edffee6
ass_driver.cc
ass_driver.h
df013175d1aa04641e5c6175f8c786e547d31654 13-Jan-2014 Nicolas Geoffray <ngeoffray@google.com> Implement cumulative timings for CompilerDriver.

Change-Id: I3b04de7f2717273f356b8120f68d69e2379bab2f
rontend.cc
a3058e7761c8fbe185f329f473c6ef9e01d681d7 15-Jan-2014 Nicolas Geoffray <ngeoffray@google.com> Fix memory error when dumping timings.

Use the pass name instead of a stack allocated std::string.

Change-Id: Ic87cf9cb7cc3c7bd847cc69c9aa1203d07136062
ass_driver.cc
4e97c539408f47145526f0062c1c06df99146a73 07-Jan-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> Added pass framework

The patch adds a Middle-End pass system and normalizes the current
passes into the pass framework.

Passes have:
- A start, work, and end functions.
- A gate to determine to apply the pass.
- Can provide a CFG dump folder.

mir_dataflow.cc, mir_graph.cc, mir_optimization.cc, ssa_transformation.cc:
- Changed due to moving code into bb_optimizations.cc.
- Moved certain functions from private to public due to needed from the passes.

pass.cc, pass.h:
- Pass base class

pass_driver.cc, pass_driver.h:
- The pass driver implementation.

frontend.cc:
- Replace the function calls to the passes with the pass driver.

Change-Id: I88cd82efbf6499df9e6c7f135d7e294dd724a079
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
b_optimizations.cc
b_optimizations.h
ataflow_iterator.h
rontend.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ass.h
ass_driver.cc
ass_driver.h
sa_transformation.cc
d61ba4ba6fcde666adb5d5c81b1c32f0534fb2c8 13-Jan-2014 Bill Buzbee <buzbee@android.com> Revert "Revert "Better support for x86 XMM registers""

This reverts commit 8ff67e3338952c70ccf3b609559bf8cc0f379cfd.

Fix applied to loc.fp usage.

Change-Id: I1eb3005392544fcf30c595923ed25bcee2dc4859
ompiler_enums.h
ir_graph.h
uick/arm/arm_lir.h
uick/gen_common.cc
uick/gen_loadstore.cc
uick/mips/mips_lir.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
reg_analysis.cc
d0a515562772d7c637160e8779c4f253ee169c3a 10-Jan-2014 Jean Christophe Beyler <jean.christophe.beyler@intel.com> Add suffix parameter to DumpCFG

In a lot of cases it is practical to dump CFGs. However the current dumper
has a unique naming convention. By adding an optional suffix, we can dump
the same CompilationUnit before and after an optimization by using a different
suffix.

Also, by making it optional, the change is minimal.

Change-Id: Ibd7f217ed59c093580cad9c177f9fc174a0afc11
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ir_graph.cc
ir_graph.h
0adc680c388913a63666797e907f87c4c6b0b4ea 08-Jan-2014 Ian Rogers <irogers@google.com> Merge "Add conditional move support to x86 and allow GenMinMax to use it"
ef6a776af2b4b8607d5f91add0ed0e8497100e31 20-Dec-2013 Ian Rogers <irogers@google.com> Inline codegen for long-to-double on ARM.

Change-Id: I4fc443c1b942a2231d680fc2c7a1530c86104584
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/fp_arm.cc
988e6ea9ac66edf1e205851df9bb53de3f3763f3 08-Jan-2014 Ian Rogers <irogers@google.com> Fix -O0 builds.

Use snprintf rather than sprintf to avoid Werror failures.
Work around an annotalysis bug when compiling -O0.

Change-Id: Ie7e0a70dbceea5fa85f98262b91bcdbd74fdef1c
uick/arm/target_arm.cc
uick/dex_file_to_method_inliner_map.h
uick/mips/target_mips.cc
uick/x86/target_x86.cc
bd288c2c1206bc99fafebfb9120a83f13cf9723b 21-Dec-2013 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Add conditional move support to x86 and allow GenMinMax to use it

X86 supports conditional moves which is useful for reducing branchiness.
This patch adds support to the x86 backend to generate conditional reg
to reg operations. Both encoder and decoder support was added for cmov.

The x86 version of GenMinMax used for generating inlined version Math.min/max
has been updated to make use of the conditional move support.

Change-Id: I92c5428e40aa8ff88bd3071619957ac3130efae7
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
ompiler_enums.h
uick/arm/codegen_arm.h
uick/arm/utility_arm.cc
uick/mips/codegen_mips.h
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
5ddb4104ac605d66693b55b79f26f8b8a5505e63 07-Jan-2014 Ian Rogers <irogers@google.com> Remove intialized static storage from dex cache.

The initialized static storage array is used by compiled code to determine if
for a sget/sput class initialization is necessary. The compiled code typically
doesn't require this test as the class is pre-initialized or the class being
accessed is the same as the current method.

Change-Id: Icbc45e692b3d0ac61e559e69edb6c9b29439e571
uick/gen_common.cc
53ee14a160fba2c71b811c97268400c50eb08249 03-Jan-2014 Ian Rogers <irogers@google.com> Merge "Avoid inliner spam wrt String.length."
dce164adfbf679d7ec9c9dc778fa3fb596011740 03-Jan-2014 Ian Rogers <irogers@google.com> Avoid inliner spam wrt String.length.

Also, remove a use of std::map for our preferred SafeMap and be more explicit
with types.

Change-Id: I7b9a4bb1f73c22490fe416503e050671e7c99fe0
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
5115473c81ec855a5646a5f755afb26aa7f2b1e9 02-Jan-2014 Vladimir Marko <vmarko@google.com> Fix oatdump "compilercallbacks" option for runtime.

The "compilercallbacks" runtime option replaced "compiler"
in I708ca13227c809e07917ff3879a89722017e83a9 .

Fix a comment in codegen_util.cc .

Change-Id: I2c5ebd56dd96f0ee8e62b602bfe45357565471ff
uick/codegen_util.cc
6e3cb66b3885c5b9ed31bf55e2d2f8594c4f840d 21-Dec-2013 Jean Christophe Beyler <jean.christophe.beyler@intel.com> DataflowIterator normalization

The patch normalizes the data flow iterators. The reasoning behind it is
to allow passing the base class around without knowing what underlying iterator
is used. This will thus allow called functions to call the
specified Next function. This feature will be required for future patches.

- Made DataflowIterator a base class with an abstract Next function
- Updated each derived class to use the same Next function signature
- Added comments and doxygen comments

Change-Id: I3b9bce6326675575172f0ebd3681369d40d55661
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
ataflow_iterator-inl.h
ataflow_iterator.h
090dd4489eeffb5f10051a5d9c1ed71b0a6bc4b9 20-Dec-2013 Razvan A Lupusoru <razvan.a.lupusoru@intel.com> Eliminate redundant x86 compare for GenDivZeroCheck

For x86, the ALU operations on general purpose registers update the flags.
Thus, when generating the zero check for divide/remainder operations, the
compare is not needed.

Change-Id: I07bfdf7d5491d3e3e9d98a932472d7f18d5b46d3
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
uick/mir_to_lir.h
uick/x86/int_x86.cc
dac68ba16604085a8b7986c16956ad76caafe17e 20-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Fix build: style issue."
459f4dfae3c8732fd4303a6e4df2e351d7d54f14 20-Dec-2013 Vladimir Marko <vmarko@google.com> Fix build: style issue.

Change-Id: I3407b9073776b2b40638491d9316111fa793e4ab
ompiler_enums.h
47d79fd31295b29e4abeb6d3fc318e6a6dd1e97c 20-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Clean up usage of carry flag condition codes."
58af1f9385742f70aca4fcb5e13aba53b8be2ef4 19-Dec-2013 Vladimir Marko <vmarko@google.com> Clean up usage of carry flag condition codes.

On X86, kCondUlt and kCondUge are bound to CS and CC,
respectively, while on ARM it's the other way around. The
explicit binding in ConditionCode was wrong and misleading
and could lead to subtle bugs. Therefore, we detach those
constants and clean up usage. The CS and CC conditions are
now effectively unused but we keep them around as they may
eventually be useful.

And some minor cleanup and comments.

Change-Id: Ic5ed81d86b6c7f9392dd8fe9474b3ff718fee595
ompiler_enums.h
uick/arm/call_arm.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/int_mips.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
b122a4bbed34ab22b4c1541ee25e5cf22f12a926 20-Nov-2013 Ian Rogers <irogers@google.com> Tidy up memory barriers.

Change-Id: I937ea93e6df1835ecfe2d4bb7d84c24fe7fc097b
uick/arm/int_arm.cc
e40687d053b89c495b6fbeb7a766b01c9c7e039c 19-Dec-2013 Narayan Kamath <narayan@google.com> Merge "Fix SEGV when dumping MIR CFG"
412d4f833d8c6b43ef9725cda15bc97012d9ecdf 18-Dec-2013 Mark Mendell <mark.p.mendell@intel.com> Improve x86 Fused long compare to literal

Generate better x86 code for the fused long comparison/branch
if one of the arguments is a literal. Use the algorithm from ARM,
tweaked for x86.

Change-Id: I872ba5dfaeeaaba6beff756d2eb6f9c6d018ce3e
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
e47ee2489a5947fc77351538d186302529b94798 18-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Enhance GenArrayGet, GenArrayPut for x86"
343adb52d3f031b6b5e005ff51f9cb04df219b21 18-Dec-2013 Mark Mendell <mark.p.mendell@intel.com> Enhance GenArrayGet, GenArrayPut for x86

As pointed out by Ian Rogers, the x86 versions didn't optimize
handling of constant index expressions. Added that support,
simplified checking of constant indices, and removed the use of
a temporary register for the 'wide' cases by using x86 scaled
addressing mode.

Change-Id: I82174e4e3674752d00d7c4730496f59d69f5f173
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
1d6df5bc3b21ccd8173c8b26c8a41b3480d14d86 18-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Change safecast data from set to an ordered vector."
5dce0c9721af5f9024765c16958ad2f77389aa15 18-Dec-2013 Sebastien Hertz <shertz@google.com> Generate devirtualization map only for native compilation.

Since devirtualization is only supported by the quick compiler, we do not need
to generate devirtualization map for non-compiled method.

Bug: 12171022
Change-Id: Ic7d6882396a05b70c4b8067bd14b7a339e0a93ab
erified_methods_data.cc
a9faa706acb5a2e571ebfbc7d20f95504b3d8cdc 17-Dec-2013 Vladimir Marko <vmarko@google.com> Change safecast data from set to an ordered vector.

This saves memory and improves performance.

Bug: 12167380
Change-Id: Ica8d9291cdd515e8eab03814fb75a85d424eb629
erified_methods_data.cc
erified_methods_data.h
778127aed722b9702a382f1276c0f05447c654be 18-Dec-2013 Vladimir Marko <vmarko@google.com> Fix build - style issues.

Change-Id: I40540dac2a51ef326e642116b5c64fb581c849f2
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
5bb149e1e33e89216af87a4c3809e02413277772 17-Dec-2013 Mark Mendell <mark.p.mendell@intel.com> Fix SEGV when dumping MIR CFG

I turned on kDebugDumpCFG to try to dump the CFGs, and I found
that they caused a segmentation violation. The problem was that
the orig_sreg was -1, and IsConst then blew up.

Change-Id: Ib9acda0b11ce486e878ef2ccfae3b1bc1f82fdfb
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
ir_graph.h
5816ed48bc339c983b40dc493e96b97821ce7966 27-Nov-2013 Vladimir Marko <vmarko@google.com> Detect special methods at the end of verification.

This moves special method handling to method inliner
and prepares for eventual inlining of these methods.

Change-Id: I51c51b940fb7bc714e33135cd61be69467861352
ompiler_enums.h
rontend.cc
rontend.h
ir_analysis.cc
ir_graph.cc
ir_graph.h
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/codegen_util.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
2b5eaa2b49f7489bafdadc4b4463ae27e4261817 13-Dec-2013 Vladimir Marko <vmarko@google.com> Move compiler code out of method verifier.

We want to detect small methods for inlining at the end of
the method verification. Instead of adding more compiler
code to the runtime, we create a callback from the runtime
into the compiler, so that we can keep the code there.
Additionally, we move the compiler-related code that was
already in the method verifier to the compiler since it
doesn't really belong to the runtime in the first place.

Change-Id: I708ca13227c809e07917ff3879a89722017e83a9
uick/codegen_util.cc
erified_methods_data.cc
erified_methods_data.h
0bf1f266869776c2dd21b3242599d74ac80855f0 17-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Fix 64-bit CAS for x86."
07dc96d370c4844c7a279c01cedf24a272b9f4f3 16-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Per-DexFile locking for inliner initialization."
12f96283471dea664d26c185b2185445cdc49a46 16-Dec-2013 Vladimir Marko <vmarko@google.com> Fix minor style issues

Follow-up to I082aa20041c933ae5fc78f12ddf491d1c775c683.

Change-Id: Ia334b192bdba231b0b9a2b2f2d7d18fcff2ca836
uick/x86/assemble_x86.cc
uick/x86/x86_lir.h
bff1ef0746048978b877c0664f758d2d6006f27d 13-Dec-2013 Mark Mendell <mark.p.mendell@intel.com> Implement GenInlinedSqrt for x86

Implemented this using the hardware instruction, which handles
NaN properly.

Tested manually using host mode.

Change-Id: I082aa20041c933ae5fc78f12ddf491d1c775c683
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
uick/x86/assemble_x86.cc
uick/x86/fp_x86.cc
uick/x86/x86_lir.h
e13717e796d338b08ea66f6a7e3470ca44de707f 20-Nov-2013 Vladimir Marko <vmarko@google.com> Per-DexFile locking for inliner initialization.

And clean up lock and compiler driver naming.

Change-Id: I1562c7f55c4b0174a36007ba6199360da06169ff
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/dex_file_to_method_inliner_map.cc
uick/dex_file_to_method_inliner_map.h
uick/gen_invoke.cc
uick/mir_to_lir.h
a6fd8ba27bc84dfb942a8fa4ea987bcb39f0f3f1 13-Dec-2013 Vladimir Marko <vmarko@google.com> Fix 64-bit CAS for x86.

Bug: 12117970
Change-Id: I9fbba2291124a2594161782c89dc62201cf01c08
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
8ff6e5967f93ec1188e34834c1f1240b516e32dc 12-Dec-2013 Mathieu Chartier <mathieuc@google.com> Merge "Don't rely on gcc extensions"
460536209b741bc469f1b0857775449abb2102fb 12-Dec-2013 Bernhard Rosenkränzer <Bernhard.Rosenkranzer@linaro.org> Don't rely on gcc extensions

Make the code more compatible with different compilers.
clang doesn't allow extra static qualifiers on template
specializations, const qualifiers on function types,
or inline attributes on lambda functions, and is more
picky about casting away constness with reinterpret_cast.

These modifications are compatible with both gcc and
clang.

Change-Id: I739b10df2780bec537827a13679fd2bcc2cc7188
Signed-off-by: Bernhard Rosenkränzer <Bernhard.Rosenkranzer@linaro.org>
ortable/mir_to_gbc.cc
ff8d298c9a937822492e85b264bc0c4a3b3642a9 12-Dec-2013 Sebastien Hertz <shertz@google.com> Merge "Remove unused method in DEX-to-DEX."
45c1165558eb8f9c81843b63ed362079a60c8387 11-Dec-2013 Mark Mendell <mark.p.mendell@intel.com> Define missing static constexpr variables

This will prevent link errors when undefined symbols when compiling at
-O0. Normally, this isn't a problem, but causes failure when compiling
at -O0 to maximize debugability

Change-Id: Iafe187b6b9344fead1bbc73004e376fad821756b
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
rena_allocator.cc
uick/dex_file_method_inliner.cc
1ebe2173d9c6144da16fd6c8790d14bcc9b38fa0 11-Dec-2013 Sebastien Hertz <shertz@google.com> Remove unused method in DEX-to-DEX.

Change-Id: Ice5f91b45a0ad85576475a613193f143fd76ad9f
ex_to_dex_compiler.cc
cdcfdfcb704416882beec98f5a790a65c9b798ae 11-Dec-2013 buzbee <buzbee@google.com> Art: fix basic block optimization pass

A bracket mismatch in Change 70885 inadvertently prevented the basic
block optimization pass from running in most cases. Fixed here.

Change-Id: I33f2687904cc05c90f74fb3bdc8f312d009cc0ac
ir_optimization.cc
8d4122f24d1d964e91444300045936b42986e00e 10-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Get rid of platform-specific method inliners."
b8a0c235fdfefc79477d963bb1f2fe5728f9f1c2 10-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Unsafe.compareAndSwapLong() intrinsic for x86."
dce88522902a7f9771af87b364bbd07e656e0d1c 10-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Add support for emitting x86 kArray instructions."
867a2b35e67ddcbec089964e8f3cd9a827186e48 10-Dec-2013 Vladimir Marko <vmarko@google.com> Get rid of platform-specific method inliners.

The DexFileToMethodInlinerMap dependency on CompilerDriver
and its instruction set makes it impossible to implement
verification-time checking for methods we want to inline.
Therefore, we get rid of the platform-specific method
inliners and rely on the backend's existing ability to
recognize when it can actually emit an intrinsic function.

Change-Id: I57947db93f13a26c1c794cb3584130321106306f
rontend.cc
rontend.h
uick/arm/arm_dex_file_method_inliner.cc
uick/arm/arm_dex_file_method_inliner.h
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/dex_file_to_method_inliner_map.cc
uick/dex_file_to_method_inliner_map.h
uick/mips/mips_dex_file_method_inliner.cc
uick/mips/mips_dex_file_method_inliner.h
uick/x86/x86_dex_file_method_inliner.cc
uick/x86/x86_dex_file_method_inliner.h
8171fc34bf74ed0df02385787d916bc13eb7f160 26-Nov-2013 Vladimir Marko <vmarko@google.com> Don't prefix GC map by length.

Bug: 11767815
Change-Id: I063917aefdf7674ee1a77736db059c9ee95ea075
uick/codegen_util.cc
400455c23d6a9a849d090b9e60ff53c4422e461b 09-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Rename ClobberCalleeSave to *Caller*, fix it for x86."
31c2aac7137b69d5622eea09597500731fbee2ef 09-Dec-2013 Vladimir Marko <vmarko@google.com> Rename ClobberCalleeSave to *Caller*, fix it for x86.

Change-Id: I6a72703a11985e2753fa9b4520c375a164301433
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/target_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
73e08b37512a2d38cdbaf9a3869dbd7554e6e1b1 21-Nov-2013 Vladimir Marko <vmarko@google.com> Fix Mir2Lir::AllocFreeTemp() to return -1 on failure.

Change-Id: I190de54de347fe3f4c9bcd07b2117ad91ea5c9a3
uick/mips/utility_mips.cc
uick/ralloc_util.cc
06606b9c4a1c00154ed15f719ad8ea994e54ee8e 02-Dec-2013 Vladimir Marko <vmarko@google.com> Performance improvement for mapping table creation.

Avoid the raw mapping tables altogether.

Change-Id: I6d1c786325d369e899a75f15701edbafdd14363f
uick/codegen_util.cc
uick/mir_to_lir.h
70b797d998f2a28e39f7d6ffc8a07c9cbc47da14 03-Dec-2013 Vladimir Marko <vmarko@google.com> Unsafe.compareAndSwapLong() intrinsic for x86.

Change-Id: Idbc5371a62dfdd84485a657d4548990519200205
ompiler_enums.h
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/x86_dex_file_method_inliner.cc
uick/x86/x86_lir.h
057c74a3a2d50d1247d4e6472763ca6f59060762 03-Dec-2013 Vladimir Marko <vmarko@google.com> Add support for emitting x86 kArray instructions.

And factor out a lot of common code.

Change-Id: Ib1f135e341404f8a6f92fcef0047ec04577d32cd
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
7ceee468756c8ba05fd8b6e82e98856a6d74bf51 02-Dec-2013 Vladimir Marko <vmarko@google.com> Merge "Unsafe.compareAndSwapInt()/Object() intrinsics for x86."
c29bb614c60e0eb9a2bacf90f6dfce796344021e 27-Nov-2013 Vladimir Marko <vmarko@google.com> Unsafe.compareAndSwapInt()/Object() intrinsics for x86.

Bug: 11391018
Change-Id: I0a97375103917b0e9e20f199304c17a7f849c361
uick/x86/assemble_x86.cc
uick/x86/int_x86.cc
uick/x86/x86_dex_file_method_inliner.cc
uick/x86/x86_lir.h
1e6cb63d77090ddc6aa19c755d7066f66e9ff87e 28-Nov-2013 Vladimir Marko <vmarko@google.com> Delta-encoding of mapping tables.

Both PC offsets and dalvik offsets are delta-encoded. Since
PC offsets are increasing, the deltas are then compressed as
unsigned LEB128. Dalvik offsets are not monotonic, so their
deltas are compressed as signed LEB128.

This reduces the size of the mapping tables by about 30%
on average, 25% from the PC offset and 5% from the dalvik
offset delta encoding.

Bug: 9437697
Change-Id: I600ab9c22dec178088d4947a811cca3bc8bd4cf4
uick/codegen_util.cc
uick/mir_to_lir.h
f246af27f8c0736640eb7ae78225ef6c0c0a9f0e 27-Nov-2013 Vladimir Marko <vmarko@google.com> Fix intrinsic Long.reverseBytes().

Allocate temporary only if needed and initialize it from
the correct register.

Change-Id: Ifdc0e8b586e1ef90fb817687eb86e05fba1dadbe
uick/gen_invoke.cc
1da1e2fceb0030b4b76b43510b1710a9613e0c2e 15-Nov-2013 buzbee <buzbee@google.com> More compile-time tuning

Another round of compile-time tuning, this time yeilding in the
vicinity of 3% total reduction in compile time (which means about
double that for the Quick Compile portion).

Primary improvements are skipping the basic block combine optimization
pass when using Quick (because we already have big blocks), combining
the null check elimination and type inference passes, and limiting
expensive local value number analysis to only those blocks which
might benefit from it.

Following this CL, the actual compile phase consumes roughly 60%
of the total dex2oat time on the host, and 55% on the target (Note,
I'm subtracting out the Deduping time here, which the timing logger
normally counts against the compiler).

A sample breakdown of the compilation time follows (this taken on
PlusOne.apk w/ a Nexus 4):

39.00% -> MIR2LIR: 1374.90 (Note: includes local optimization & scheduling)
10.25% -> MIROpt:SSATransform: 361.31
8.45% -> BuildMIRGraph: 297.80
7.55% -> Assemble: 266.16
6.87% -> MIROpt:NCE_TypeInference: 242.22
5.56% -> Dedupe: 196.15
3.45% -> MIROpt:BBOpt: 121.53
3.20% -> RegisterAllocation: 112.69
3.00% -> PcMappingTable: 105.65
2.90% -> GcMap: 102.22
2.68% -> Launchpads: 94.50
1.16% -> MIROpt:InitRegLoc: 40.94
1.16% -> Cleanup: 40.93
1.10% -> MIROpt:CodeLayout: 38.80
0.97% -> MIROpt:ConstantProp: 34.35
0.96% -> MIROpt:UseCount: 33.75
0.86% -> MIROpt:CheckFilters: 30.28
0.44% -> SpecialMIR2LIR: 15.53
0.44% -> MIROpt:BBCombine: 15.41

(cherry pick of 9e8e234af4430abe8d144414e272cd72d215b5f3)

Change-Id: I86c665fa7e88b75eb75629a99fd292ff8c449969
ataflow_iterator-inl.h
ataflow_iterator.h
rontend.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/assemble_arm.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mir_to_lir.cc
uick/x86/assemble_x86.cc
reg_analysis.cc
3e5af82ae1a2cd69b7b045ac008ac3b394d17f41 21-Nov-2013 Vladimir Marko <vmarko@google.com> Intrinsic Unsafe.CompareAndSwapLong() for ARM.

(cherry picked from cb53fcd79b1a5ce608208ec454b5c19f64aaba37)

Change-Id: Iadd3cc8b4ed390670463b80f8efd579ce6ece226
uick/arm/arm_dex_file_method_inliner.cc
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/int_arm.cc
uick/mir_to_lir.h
73fbaadee029f310362c9d83a52177f00f2e5d77 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: Ic7b311b635483a44265c89d47f37f4202a5b18f7
ortable/mir_to_gbc.cc
1c282e2b9a9b432e132b2c332f861cad9feb4a73 21-Nov-2013 Vladimir Marko <vmarko@google.com> Refactor intrinsic CAS, prepare for 64-bit version.

Bug: 11391018
Change-Id: Ic0f740e0cd0eb47f2c915f81be02f52f7721f8a3
uick/arm/arm_dex_file_method_inliner.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mips/mips_dex_file_method_inliner.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/x86_dex_file_method_inliner.cc
2247984899247b1402408d39731ff64048f0e274 19-Nov-2013 Vladimir Marko <vmarko@google.com> Clean up kOpCmp on ARM.

kThumb2CmnRI8M is now used.

Change-Id: I300299258ed99d86c300dee45c904c360dd44638
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
ba9ece9c58de90b39c39b29dbdaee54b1654c066 19-Nov-2013 Narayan Kamath <narayan@google.com> Fix inlining for String.indexOf / String.isEmpty.

Before vs After:

Equals URI 1544014.6 ==============================
Equals URI 992997.6 ========================

bug: 11551453

Change-Id: I41045fda59b4c69a209d6b895dc7c2bdd1fc4e89
uick/dex_file_method_inliner.cc
e4a50ee34695a9d90cf03fbb1e8afd1e434f6ee1 18-Nov-2013 Mathieu Chartier <mathieuc@google.com> Fix build.

cpplint errors.

Change-Id: I11141f6e19b56a3f53d6e52f3013f4d20f33f102
rontend.cc
rontend.h
uick/dex_file_method_inliner.cc
uick/dex_file_to_method_inliner_map.cc
uick/dex_file_to_method_inliner_map.h
259b592d2f61aa8addd3f6d8aa04523773f1008a 18-Nov-2013 Vladimir Marko <vmarko@google.com> Fix build: add required spaces after //.

Change-Id: I332b3d514d02900ec9b485a46aa9e27c084f1bd6
uick/mips/mips_dex_file_method_inliner.cc
uick/x86/x86_dex_file_method_inliner.cc
3cebbc759a1e34d5900d35933bb364e160072c1e 18-Nov-2013 Vladimir Marko <vmarko@google.com> Merge "Rewrite intrinsics detection." into dalvik-dev
332b7aa6220124dc638b9f7e59611c376473f128 18-Nov-2013 Vladimir Marko <vmarko@google.com> Improve Thumb2 instructions' use of constant operands.

Rename instructions using modified immediate to use suffix
I8M. Many were using I8 which may lead to confusion with
Thumb I8 instructions and some were using other suffixes.

Add and use CmnRI8M, increase constant range of AddRRI12 and
SubRRI12 and use BicRRI8M for applicable kOpAnd constants.
In particular, this should marginaly improve Math.abs(float)
and Math.abs(double) by converting x & 0x7fffffff to BIC.

Bug: 11579369

Change-Id: I0f17a9eb80752d2625730a60555152cdffed50ba
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
5c96e6b4dc354a7439b211b93462fbe8edea5e57 14-Nov-2013 Vladimir Marko <vmarko@google.com> Rewrite intrinsics detection.

Intrinsic methods should be treated as a special case of
inline methods. They should be detected early and used to
guide other optimizations. This CL rewrites the intrinsics
detection so that it can be moved to any compilation phase.

Change-Id: I4424a6a869bd98b9c478953c9e3bcaf1c6de2b33
rontend.cc
rontend.h
uick/arm/arm_dex_file_method_inliner.cc
uick/arm/arm_dex_file_method_inliner.h
uick/codegen_util.cc
uick/dex_file_method_inliner.cc
uick/dex_file_method_inliner.h
uick/dex_file_to_method_inliner_map.cc
uick/dex_file_to_method_inliner_map.h
uick/gen_invoke.cc
uick/mips/mips_dex_file_method_inliner.cc
uick/mips/mips_dex_file_method_inliner.h
uick/mir_to_lir.h
uick/x86/x86_dex_file_method_inliner.cc
uick/x86/x86_dex_file_method_inliner.h
b5856431731298348b917e75a0e57672672eeb59 15-Nov-2013 Ian Rogers <irogers@google.com> Merge "Fix memory leaks relating to timing logger." into dalvik-dev
5fe9af720048673e62ee29597a30bb9e54c903c5 14-Nov-2013 Ian Rogers <irogers@google.com> Fix memory leaks relating to timing logger.

Bug: 11670287.
We use pointers to uninitialized values for control-flow in the timing logger
code, add TODO comments to clean this up later.
Remove base namespace and other bits of tidying.

Change-Id: I1e6600a1e92f974c8f58f3a405a4e4abb4d9f80f
ompiler_ir.h
rontend.cc
17189ac098b2f156713db1821b49db7b2f018bbe 08-Nov-2013 buzbee <buzbee@google.com> Quick compiler compile-time/memory use improvement

This CL delivers a surprisingly large reduction in compile time,
as well as a significant reduction in memory usage by conditionally
removing a CFG construction feature introduced to support LLVM
bitcode generation.

In short, bitcode requires all potential exception edges to be
explicitly present in the CFG. The Quick compiler (based on the
old JIT), can ignore, at least for the purposes of dataflow
analysis, potential throw points that do not have a corresponding
catch block.

To support LLVM, we create a target basic block for every
potentially throwing instruction to give us a destination for
the exception edge. Then, following the check elimination pass,
we remove blocks whose edges have gone away.

However, if we're not using LLVM, we can skip the creation of
those things in the first place. The savings are significant.

Single-threaded compilation time on the host looks to be reduced
by something in the vicinity of 10%. We create roughly 60% fewer
basic blocks (and, importantly, the creation of fewer basic
block nodes has a multiplying effect on memory use reduction
because it results in fewer dataflow bitmaps).

Some basic block redution stats:

boot: 2325802 before, 844846 after.
Phonesky: 485472 before, 156014 after.
PlusOne: 806232 before, 243156 after.
Thinkfree: 864498 before, 264858 after.

Another nice side effect of this change is giving the basic
block optimization pass generally larger scope.

For arena memusage in the boot class path (compiled on the host):

Average Max
Before: 50,863 88,017,820
After: 41,964 4,914,208

The huge reduction in max arena memory usage is due to the
collapsing of a large initialization method. Specifically, with complete
exception edges org.ccil.cowan.tagsoup.Scheme requires 13,802
basic blocks. With exception edges collapsed, it requires 4.

This change also caused 2 latent bugs to surface.

1) The dex parsing code did not expect that the target of a switch statement
could reside in the middle of the same basic block ended by that same switch
statement.

2) The x86 backend introduced a 5-operand LIR instruction for indexed memops.
However, there was no corresponding change to the use/def mask creation code.
Thus, the 5th operand was never included in the use/def mask. This allowed
the instruction scheduling code to incorrectly move a use above a definition.
We didn't see this before because the affected x86 instructions were only used
for aget/aput, and prior to this CL those Dalvik opcodes caused a basic
block break because of the implied exception edge - which prevented the code
motion.

And finally, also included is some minor tuning of register use weighting.

Change-Id: I3f2cab7136dba2bded71e9e33b452b95e8fffc0e
rontend.cc
rontend.h
ocal_value_numbering.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
uick/mir_to_lir-inl.h
25724efbf84cce5734d1869e636cf59bc3f95941 12-Nov-2013 Vladimir Marko <vmarko@google.com> Fix CompilationUnit's UniquePtr usage.

CompilationUnit defined in compiler_ir.h uses UniquePtr with
forward-declared MIRGraph, so the ctor/dtor must be defined
in a compilation unit that actually includes MIRGraph's
definition. Otherwise the build would depend on the order of
includes.

Change-Id: I53096c5f1c975843bad3c375d4ce72a9c0656264
ompiler_ir.h
rontend.cc
e21a40730ae51d8dfd0633dc021765a7839f70dc 07-Nov-2013 Brian Carlstrom <bdc@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit f7ee11632e3dfda29d553d8962be9747d5ce6dfd.
ortable/mir_to_gbc.cc
da5bd6a2d53113edce5761ff67d7d3eee8c830a6 07-Nov-2013 Brian Carlstrom <bdc@google.com> am 7ed8d7f3: Merge "Update ART for LLVM merge up to r187914."

* commit '7ed8d7f33665689a9538281fbb5c4915463dc2a6':
Update ART for LLVM merge up to r187914.
73b9eea49175748ee1eb8fcb439d65d7666c3905 06-Nov-2013 Vladimir Marko <vmarko@google.com> Merge "Improve Mir2Lir::GenIntrinsic() performance." into dalvik-dev
f7ee11632e3dfda29d553d8962be9747d5ce6dfd 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: Idc2e3fb73d798a62b6ebf6f55aff5c715b2c62f7
ortable/mir_to_gbc.cc
7020278bce98a0735dc6abcbd33bdf1ed2634f1d 23-Oct-2013 Dave Allison <dallison@google.com> Support hardware divide instruction

Bug: 11299025

Uses sdiv for division and a combo of sdiv, mul and sub for modulus.
Only does this on processors that are capable of the sdiv instruction, as determined
by the build system.

Also provides a command line arg --instruction-set-features= to allow cross compilation.
Makefile adds the --instruction-set-features= arg to build-time dex2oat runs and defaults
it to something obtained from the target architecture.

Provides a GetInstructionSetFeatures() function on CompilerDriver that can be
queried for various features. The only feature supported right now is hasDivideInstruction().

Also adds a few more instructions to the ARM disassembler

b/11535253 is an addition to this CL to be done later.

Change-Id: Ia8aaf801fd94bc71e476902749cf20f74eba9f68
ompiler_ir.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
94b400d56bb246d54a1606a3ca3f0b2157acc1fa 05-Nov-2013 Vladimir Marko <vmarko@google.com> Improve Mir2Lir::GenIntrinsic() performance.

GenIntrinsic() spends most time just comparing the method's
declaring class name to the class names we're looking for
without hiting anything. Reduce the number of comparisons
by splitting the path for java.lang.* and other calls.

Change-Id: Ic0d42ee2bde9e86b602b421c11fb2315de774a29
uick/gen_invoke.cc
e508a2090b19fe705fbc6b99d76474037a74bbfb 04-Nov-2013 Vladimir Marko <vmarko@google.com> Fix unaligned Memory peek/poke intrinsics.

Change-Id: Id454464d0b28aa37f5239f1c6589ceb0b3bbbdea
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
3beafe10c49c30ee28e1dc2f16b9f50c8074648c 01-Nov-2013 Vladimir Marko <vmarko@google.com> Merge "Add intrinsics for Memory peek/poke." into dalvik-dev
65636e5de2375839e29e3e19ee7a7db737901cf0 24-Oct-2013 Vladimir Marko <vmarko@google.com> Add intrinsics for Memory peek/poke.

Add intrinsics for single memory access (non-array)
peek/poke methods in libcore.io.Memory.

Change-Id: I5d66a5b14ea89875d8afb8252eb293f7d637b83f
uick/gen_invoke.cc
uick/mir_to_lir.h
cdb4b715e77f427838b97da9bdb6654f561296ab 01-Nov-2013 Vladimir Marko <vmarko@google.com> Fix intrinsic Long.reverseBytes().

Change-Id: I6cfab7e072f406439f0bde73f192149f0a6e58f7
uick/gen_invoke.cc
0b1191cfece83f6f8d4101575a06555a2d13387a 28-Oct-2013 Bill Buzbee <buzbee@google.com> Revert "Revert "Null check elimination improvement""

This reverts commit 31aa97cfec5ee76b2f2496464e1b6f9e11d21a29.

..and thereby brings back change 380165, which was reverted
because it was buggy.

Three problems with the original CL:

1. The author ran the pre-submit tests, but used -j24 and
failed to search the output for fail messages.
2. The new null check analysis pass uses an interative
approach to identify whether a null check is needed. It
is possible that the null-check-required state may
oscillate, and a logic error caused it to stick in the
"no check needed" state.
3. Our old nemesis Dalvik untyped constants, in which 0 values
can be used both as object reference and non-object references.
This CL conservatively treats all CONST definitions as
potential object definitions for the purposes of null
check elimination.

Change-Id: I3c1744e44318276e42989502a314585e56ac57a0
ir_dataflow.cc
ir_graph.h
ir_optimization.cc
uick/codegen_util.cc
sa_transformation.cc
7195dd860e424057bd9a17d501269d9b50673f11 30-Oct-2013 Ian Rogers <irogers@google.com> Merge "Don't use UTF16 length as length for MUTF8." into dalvik-dev
dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111 30-Oct-2013 Ian Rogers <irogers@google.com> Don't use UTF16 length as length for MUTF8.

Bug 11367555.

Change-Id: Ia0b07072a1a49d435c3b71ed9a668b316b7ff5d8
uick/gen_invoke.cc
c844a0f04e07bb0b8761e2648392251d522c89c1 29-Oct-2013 Jeff Hao <jeffhao@google.com> Merge "Implement Interface Method Tables (IMT)." into dalvik-dev
88474b416eb257078e590bf9bc7957cee604a186 24-Oct-2013 Jeff Hao <jeffhao@google.com> Implement Interface Method Tables (IMT).

Change-Id: Idf7fe85e1293453a8ad862ff2380dcd5db4e3a39
ompiler_enums.h
uick/arm/target_arm.cc
uick/gen_invoke.cc
uick/mips/target_mips.cc
uick/x86/target_x86.cc
6bdf1fff5f841f3997d4b488f00647f7aa2cdaa3 29-Oct-2013 Vladimir Marko <vmarko@google.com> Add intrinsics for {Short,Int,Long}.reverseBytes().

Change-Id: I34a2ec642f59fc4ff18aed59769a9e8d7e361098
uick/gen_invoke.cc
uick/mir_to_lir.h
a8b4caf7526b6b66a8ae0826bd52c39c66e3c714 24-Oct-2013 Vladimir Marko <vmarko@google.com> Add byte swap instructions for ARM and x86.

Change-Id: I03fdd61ffc811ae521141f532b3e04dda566c77d
ompiler_enums.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/utility_arm.cc
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
17088bbded68e35da8050a40206dfd3cbba9e6d2 28-Oct-2013 Vladimir Marko <vmarko@google.com> Fix invalid DCHECK for movzx/movsx.

k86Movzx8RM and kMovsx8RM don't have to use eax/ecx/edx/ebx.
The incorrect check could fail for LoadBaseDisp() with
kUnsignedByte or kSignedByte.

Change-Id: I777f14cf372c7b211ad8c595d4a8a47533bdd0fc
uick/x86/assemble_x86.cc
ba150c37d582eeeb8c11ba5245edc281cf31793c 28-Aug-2013 Brian Carlstrom <bdc@google.com> Omit OatMethodOffsets for classes without compiled code

Change-Id: If0d290f4aebc778ff12d8fed017c270ad2ac3220
rena_allocator_test.cc
rena_bit_vector.h
3c2a6e2468e3e519ade6c3cfcaad7cd34243cdf1 26-Oct-2013 Ian Rogers <irogers@google.com> Merge "Revert "Null check elimination improvement"" into dalvik-dev
31aa97cfec5ee76b2f2496464e1b6f9e11d21a29 26-Oct-2013 Ian Rogers <irogers@google.com> Revert "Null check elimination improvement"

This reverts commit 4db179d1821a9e78819d5adc8057a72f49e2aed8.

Change-Id: I059c15c85860c6c9f235b5dabaaef2edebaf1de2
ir_dataflow.cc
ir_optimization.cc
uick/codegen_util.cc
sa_transformation.cc
75fabbe71ec82836787b34e7250d992da64c6be0 26-Oct-2013 Ian Rogers <irogers@google.com> Merge "Populate dex cache for sharpened calls." into dalvik-dev
83883d7fddf30fdb8b6903560fa1337ab991e74c 22-Oct-2013 Ian Rogers <irogers@google.com> Populate dex cache for sharpened calls.

We ensured the resolved method was in the dex cache, but for a sharpened call
this is abstract. Ensure that the concrete method is also resolved.
Limit the use of direct dex cache based dispatch to cases where we know how to
patch the dex cache.

Bug 11389002

Change-Id: I08252686a53b5948650632837c74bcd5cbf8a862
uick/gen_invoke.cc
dbf39a79d17f226936430b025ce1f0beeac2f441 25-Oct-2013 buzbee <buzbee@google.com> Merge "Add timing logger to Quick compiler" into dalvik-dev
a61f49539a59b610e557b5513695295639496750 23-Aug-2013 buzbee <buzbee@google.com> Add timing logger to Quick compiler

Current Quick compiler breakdown for compiling the boot class path:

MIR2LIR: 29.674%
MIROpt:SSATransform: 17.656%
MIROpt:BBOpt: 11.508%
BuildMIRGraph: 7.815%
Assemble: 6.898%
MIROpt:ConstantProp: 5.151%
Cleanup: 4.916%
MIROpt:NullCheckElimination: 4.085%
RegisterAllocation: 3.972%
GcMap: 2.359%
Launchpads: 2.147%
PcMappingTable: 2.145%
MIROpt:CodeLayout: 0.697%
LiteralData: 0.654%
SpecialMIR2LIR: 0.323%

Change-Id: I9f77e825faf79e6f6b214bb42edcc4b36f55d291
ompiler_ir.h
rontend.cc
rontend.h
uick/arm/assemble_arm.cc
uick/codegen_util.cc
uick/mips/assemble_mips.cc
uick/mir_to_lir.cc
uick/x86/assemble_x86.cc
bbf88131e138634c5e24c4cf5c5ca753fa742850 25-Oct-2013 buzbee <buzbee@google.com> Merge "Null check elimination improvement" into dalvik-dev
7f835b491b71a030f2a04e8e55a291bbab95eb1a 25-Oct-2013 Brian Carlstrom <bdc@google.com> Merge "Refactor ArenaBitVector to create more general BitVector" into dalvik-dev
413e89f277ec6ba1bdf2040f5b5611f29a27a447 22-Oct-2013 Brian Carlstrom <bdc@google.com> Refactor ArenaBitVector to create more general BitVector

Change-Id: Ib26f2884de9ce7d620048bdf5ed6dec639622e41
rena_bit_vector.cc
rena_bit_vector.h
sa_transformation.cc
4db179d1821a9e78819d5adc8057a72f49e2aed8 23-Oct-2013 buzbee <buzbee@google.com> Null check elimination improvement

See b/10862777

Improves the null check elimination pass by tracking visibility
of object definitions, rather than successful uses of object
dereferences. For boot class path, increases static null
check elimination success rate from 98.4% to 98.6%. Reduces
size of boot.oat by ~300K bytes.

Fixes loop nesting depth computation, which is used by register
promotion, and tweaked the heuristics.

Fixes a bug in verbose listing output in which a basic block
id is directly dereferenced, rather than first being converted
to a pointer.

Change-Id: Id01c20b533cdb12ea8fc4be576438407d0a34cec
ir_dataflow.cc
ir_optimization.cc
uick/codegen_util.cc
sa_transformation.cc
8a70bcc04a6a95f5236ae9e41060254c1496dfbe 24-Oct-2013 Vladimir Marko <vmarko@google.com> Merge "Fix x86 code generation for 0x0F 0x3A 0x?? instructions." into dalvik-dev
fd7e33f67d535e9f4363ef8c1b56ca7aede3b1a6 24-Oct-2013 Ian Rogers <irogers@google.com> Merge "Throw IOException at source of failing to open a dex file." into dalvik-dev
e6ed00ba91da535fbe1d0b5a5705e99da149d82e 24-Oct-2013 Vladimir Marko <vmarko@google.com> Fix x86 code generation for 0x0F 0x3A 0x?? instructions.

Change-Id: I9b2b2190787d1e5674818159aa96e513d6325b54
uick/x86/assemble_x86.cc
uick/x86/x86_lir.h
8d31bbd3d6536de12bc20e3d29cfe03fe848f9da 13-Oct-2013 Ian Rogers <irogers@google.com> Throw IOException at source of failing to open a dex file.

Before is:
java.lang.ClassNotFoundException: Didn't find class "GCBench" on path: DexPathList[[zip file "/disk2/dalvik-dev/out/host/linux-x86/framework/GCBench.jar"],nativeLibraryDirectories=[/disk2/dalvik-dev/out/host/linux-x86/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
Suppressed: java.lang.ClassNotFoundException: GCBench
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 1 more
Caused by: java.lang.NoClassDefFoundError: Class "LGCBench;" not found
... 5 more
And after is:
java.lang.ClassNotFoundException: Didn't find class "GCBench" on path: DexPathList[[zip file "/disk2/dalvik-dev/out/host/linux-x86/framework/GCBench.jar"],nativeLibraryDirectories=[/disk2/dalvik-dev/out/host/linux-x86/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
Suppressed: java.io.IOException: Zip archive '/disk2/dalvik-dev/out/host/linux-x86/framework/GCBench.jar' doesn't contain classes.dex
at dalvik.system.DexFile.openDexFile(Native Method)
at dalvik.system.DexFile.<init>(DexFile.java:80)
at dalvik.system.DexFile.<init>(DexFile.java:59)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:268)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:235)
at dalvik.system.DexPathList.<init>(DexPathList.java:113)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:38)
at java.lang.ClassLoader.createSystemClassLoader(ClassLoader.java:128)
at java.lang.ClassLoader.access$000(ClassLoader.java:65)
at java.lang.ClassLoader$SystemClassLoader.<clinit>(ClassLoader.java:81)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:137)
Suppressed: java.lang.ClassNotFoundException: GCBench
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 1 more
Caused by: java.lang.NoClassDefFoundError: Class "LGCBench;" not found
... 5 more

Also, move dex file verifier messages out of logs.
In the process the ClassLinker::dex_lock_ needed tidying to cover a smaller
scope. Bug 11301553.

Change-Id: I80058652e11e7ea63457cc01a0cb48afe1c15543
rena_allocator.cc
a8d24bf578a1022ff14f89f650074dc39b9667fe 21-Oct-2013 buzbee <buzbee@google.com> Merge "64-bit prep" into dalvik-dev
0d82948094d9a198e01aa95f64012bdedd5b6fc9 12-Oct-2013 buzbee <buzbee@google.com> 64-bit prep

Preparation for 64-bit roll.
o Eliminated storing pointers in 32-bit int slots in LIR.
o General size reductions of common structures to reduce impact
of doubled pointer sizes:
- BasicBlock struct was 72 bytes, now is 48.
- MIR struct was 72 bytes, now is 64.
- RegLocation was 12 bytes, now is 8.
o Generally replaced uses of BasicBlock* pointers with 16-bit Ids.
o Replaced several doubly-linked lists with singly-linked to save
one stored pointer per node.
o We had quite a few uses of uintptr_t's that were a holdover from
the JIT (which used pointers to mapped dex & actual code cache
addresses rather than trace-relative offsets). Replaced those with
uint32_t's.
o Clean up handling of embedded data for switch tables and array data.
o Miscellaneous cleanup.

I anticipate one or two additional CLs to reduce the size of MIR and LIR
structs.

Change-Id: I58e426d3f8e5efe64c1146b2823453da99451230
rena_bit_vector.h
ompiler_enums.h
ompiler_ir.h
ataflow_iterator-inl.h
ataflow_iterator.h
ir_analysis.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/assemble_mips.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/utility_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
sa_transformation.cc
b917ea1a62aa0ab8eca3f689ef64b5be34e11abb 18-Oct-2013 Ian Rogers <irogers@google.com> Fix intrinsification of floatToRawIntBits.

Accidentially lost in quick refactoring in
commit fa57c47f1b72916371a9c2d5c1389219bce655b4.

Change-Id: Ic83cf257306efa66a236f2034ffbff3b53579090
uick/gen_invoke.cc
379067c3970fb225332cca25301743f5010d3ef9 16-Oct-2013 Ian Rogers <irogers@google.com> Don't clobber array reg if its needed for card marking

Change-Id: I4377717a2431ffd7e8fafc2e2cca7c1285b38668
uick/arm/int_arm.cc
uick/mips/int_mips.cc
773aab1e8992b2834153eb23c976a4eb0da51a71 14-Oct-2013 Ian Rogers <irogers@google.com> Correct free-ing of temp register.

Bug 11199874.
The card mark was potentially using a register freed just before. Make the
free-ing of temps strongly correspond to their allocation.

Change-Id: I3d1e8c923b7fd8b3666e841d3ff9a46e6eb58318
uick/arm/int_arm.cc
uick/mips/int_mips.cc
uick/x86/int_x86.cc
409fe94ad529d9334587be80b9f6a3d166805508 11-Oct-2013 buzbee <buzbee@google.com> Quick assembler fix

This CL re-instates the select pattern optimization disabled by
CL 374310, and fixes the underlying problem: improper handling of
the kPseudoBarrier LIR opcode. The bug was introduced in the
recent assembler restructuring. In short, LIR pseudo opcodes (which
have values < 0), should always have size 0 - and thus cause no
bits to be emitted during assembly. In this case, bad logic caused
us to set the size of a kPseudoBarrier opcode via lookup through the
EncodingMap.

Because all pseudo ops are < 0, this meant we did an array underflow
load, picking up whatever garbage was located before the EncodingMap.
This explains why this error showed up recently - we'd previuosly just
gotten a lucky layout.

This CL corrects the faulty logic, and adds DCHECKs to uses of
the EncodingMap to ensure that we don't try to access w/ a
pseudo op. Additionally, the existing is_pseudo_op() macro is
replaced with IsPseudoLirOp(), named similar to the existing
IsPseudoMirOp().

Change-Id: I46761a0275a923d85b545664cadf052e1ab120dc
ir_optimization.cc
uick/arm/assemble_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/target_x86.cc
41cdd43bd6968a06b1344efdd57ccf302f997a0e 11-Oct-2013 Ian Rogers <irogers@google.com> Disable select instruction generation on ARM.

Change-Id: I114547d44605b06b2fed396b2fbad03935f66ebc
ir_optimization.cc
252a00273bc945ebe4a1d77d82d085fdff2ae769 10-Oct-2013 Sebastien Hertz <shertz@google.com> Merge "Add missing references." into dalvik-dev
74e256b8e442417d4ba2054c771c1e4f41062768 04-Oct-2013 Sebastien Hertz <shertz@google.com> Add missing references.

This mainly avoids implicit copies when extracting an object from a container.

Change-Id: If4d0e6153e8c2b48345fde5bb546b4c65649fcf3
sa_transformation.cc
a9a8254c920ce8e22210abfc16c9842ce0aea28f 04-Oct-2013 Ian Rogers <irogers@google.com> Improve quick codegen for aput-object.

1) don't type check known null.
2) if we know types in verify don't check at runtime.
3) if we're runtime checking then move all the code out-of-line.

Also, don't set up a callee-save frame for check-cast, do an instance-of test
then throw an exception if that fails.
Tidy quick entry point of Ldivmod to Lmod which it is on x86 and mips.
Fix monitor-enter/exit NPE for MIPS.
Fix benign bug in mirror::Class::CannotBeAssignedFromOtherTypes, a byte[]
cannot be assigned to from other types.

Change-Id: I9cb3859ec70cca71ed79331ec8df5bec969d6745
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
c68fb2094b562186a571f496fc46ad2b85b02a39 02-Oct-2013 Ian Rogers <irogers@google.com> Merge "Inflate contended lock word by suspending owner." into dalvik-dev
d9c4fc94fa618617f94e1de9af5f034549100753 02-Oct-2013 Ian Rogers <irogers@google.com> Inflate contended lock word by suspending owner.

Bug 6961405.
Don't inflate monitors for Notify and NotifyAll.
Tidy lock word, handle recursive lock case alongside unlocked case and move
assembly out of line (except for ARM quick). Also handle null in out-of-line
assembly as the test is quick and the enter/exit code is already a safepoint.
To gain ownership of a monitor on behalf of another thread, monitor contenders
must not hold the monitor_lock_, so they wait on a condition variable.
Reduce size of per mutex contention log.
Be consistent in calling thin lock thread ids just thread ids.
Fix potential thread death races caused by the use of FindThreadByThreadId,
make it invariant that returned threads are either self or suspended now.

Code size reduction on ARM boot.oat 0.2%.
Old nexus 7 speedup 0.25%, new nexus 7 speedup 1.4%, nexus 10 speedup 2.24%,
nexus 4 speedup 2.09% on DeltaBlue.

Change-Id: Id52558b914f160d9c8578fdd7fc8199a9598576a
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/gen_common.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
b48819db07f9a0992a72173380c24249d7fc648a 15-Sep-2013 buzbee <buzbee@google.com> Compile-time tuning: assembly phase

Not as much compile-time gain from reworking the assembly phase as I'd
hoped, but still worthwhile. Should see ~2% improvement thanks to
the assembly rework. On the other hand, expect some huge gains for some
application thanks to better detection of large machine-generated init
methods. Thinkfree shows a 25% improvement.

The major assembly change was to establish thread the LIR nodes that
require fixup into a fixup chain. Only those are processed during the
final assembly pass(es). This doesn't help for methods which only
require a single pass to assemble, but does speed up the larger methods
which required multiple assembly passes.

Also replaced the block_map_ basic block lookup table (which contained
space for a BasicBlock* for each dex instruction unit) with a block id
map - cutting its space requirements by half in a 32-bit pointer
environment.

Changes:
o Reduce size of LIR struct by 12.5% (one of the big memory users)
o Repurpose the use/def portion of the LIR after optimization complete.
o Encode instruction bits to LIR
o Thread LIR nodes requiring pc fixup
o Change follow-on assembly passes to only consider fixup LIRs
o Switch on pc-rel fixup kind
o Fast-path for small methods - single pass assembly
o Avoid using cb[n]z for null checks (almost always exceed displacement)
o Improve detection of large initialization methods.
o Rework def/use flag setup.
o Remove a sequential search from FindBlock using lookup table of 16-bit
block ids rather than full block pointers.
o Eliminate pcRelFixup and use fixup kind instead.
o Add check for 16-bit overflow on dex offset.

Change-Id: I4c6615f83fed46f84629ad6cfe4237205a9562b4
ompiler_enums.h
rontend.cc
ir_analysis.cc
ir_graph.cc
ir_graph.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
d91d6d6a80748f277fd938a412211e5af28913b1 26-Sep-2013 Ian Rogers <irogers@google.com> Introduce Signature type to avoid string comparisons.

Method resolution currently creates strings to then compare with strings formed
from methods in other dex files. The temporary strings are purely created for
the sake of comparisons. This change creates a new Signature type that
represents a method signature but not as a string. This type supports
comparisons and so can be used when searching for methods in resolution.

With this change malloc is no longer the hottest method during dex2oat (now its
memset) and allocations during verification have been reduced. The verifier is
commonly what is populating the dex cache for methods and fields not declared
in the dex file itself.

Change-Id: I5ef0542823fbcae868aaa4a2457e8da7df0e9dae
uick/codegen_util.cc
uick/mir_to_lir.h
fc0e94bed3f88ed7e50854fd8dfaf5dcb345250f 24-Sep-2013 Ian Rogers <irogers@google.com> StringPiece clean up.

Profile guided clean up.
Try to avoid creating StringPieces with the contents of a dex file where
the length is known.
Try to avoid RegTypeCache::FromDescriptor when there's a class available.
Make ConstantType::ConstantValue inlinable.
Saving of about 50ms from a 2 threaded ThinkFree compile on host.

Change-Id: I47a12c3c76f46e2c9805be1c3a3e3870fe1f5d85
uick/gen_invoke.cc
8b2c0b9abc3f520495f4387ea040132ba85cae69 19-Sep-2013 Ian Rogers <irogers@google.com> Use class def index from java.lang.Class.

Bug: 10244719
Depends on:
https://googleplex-android-review.git.corp.google.com/362363
This removes the computation of the dex file index, when necessary this is
computed by searching the dex file. Its only necessary in
dalvik.system.DexFile.defineClassNative and DexFile::FindInClassPath, the
latter not showing up significantly in profiling with this change.

Change-Id: I20c73a3b17d86286428ab0fd21bc13f51f36c85c
ompiler_ir.h
ex_to_dex_compiler.cc
rontend.cc
rontend.h
ir_graph.cc
ir_graph.h
uick/codegen_util.cc
1fc5800def46a2fa6cbd235fcb8af099ee35a127 18-Sep-2013 buzbee <buzbee@google.com> Art compiler: minor instruction assembler fix

During the assembly phase, we iteratively walk through the LIR
encoding instructions until we can complete a full pass without
without having to change the sequence because of displacement
overflow.

In the (fairly common) situation in which a 16-bit cbnz/cbz
can't reach the target, we expand it to a compare and branch sequence
Initially, we use a 16-bit Thumb1 unconditional branch, which itself
may be expanded in a future pass to a 32-bit branch.

The original cbnz/cbz LIR is converted into a cmp, and a new branch
instruction is inserted following. The problem here is that by doing
a following insertion, that new instruction will be the next one
considered to determine if it can reach it's target. Because it
is new, though, it's starting offset will show as zero - making it
much more likely that it will be treated as a displacement overflow
and be converted to a 32-bit branch.

This is not a correctness issue - the bad offset will be corrected
on the next pass, but it does result in unnecessary uses of 32-bit
branches where 16-bit ones would work.

Change-Id: Ie68a93fd319f0f7c603e1d870588047ad6a0779f
uick/arm/assemble_arm.cc
c729a6b936d59562bd9fb830a595d9ff65dfd129 15-Sep-2013 buzbee <buzbee@google.com> Improve promotion of double-precision regs

Minor rework of the double allocation mechanism to more explicitly
manage the allocation of preserved floating point single pairs as
doubles.

Change-Id: Id9db4b0e86e5ef54a5db587f367e00efdf7e98d6
uick/mir_to_lir.h
uick/ralloc_util.cc
cd6f5fe5b08dd6bcc05cbc77355593bf3540caa0 14-Sep-2013 buzbee <buzbee@google.com> Merge "Timely color fix" into dalvik-dev
d0a03b8099347dee6e4bab3af95e14cd5a03b29c 14-Sep-2013 buzbee <buzbee@google.com> Timely color fix

See b/10690000

For efficiency, the Quick compiler will not flush incoming register
arguments to the frame if their underlying Dalvik virtual registers
have been promoted to physical registers. In this case, though,
there was a bug on Arm devices in that an incoming Double was promoted
to physical floating point registers, but not in a usable form. The
entry code generation saw that both halves of the double were promoted,
but failed to check if it was in a form usable as a double.

In this particular case, it meant that subsequent uses of the incoming
argument referred to the uninitialized home location in the frame,
resulting in garbage color values.

That's the bug. Another problem is that the incoming double should
never have been promoted to an unusable state in the first place - but
that's merely an efficiency issue and will be addressed in another CL.

Note: no good way to generate a regression test for this issue. The
bug triggered because of an unusual sequence of events driving register
promotion that can't easily (or robustly) be triggered from Java source.

Change-Id: I7242422277193a04376461134dde71e9dec55576
uick/gen_invoke.cc
2de2aa1a96dfa5bebc004f29b5dbfafd37039cee 13-Sep-2013 Jeff Hao <jeffhao@google.com> Make inlined CAS32 loop until store is successful if values match.

The native implementation of compareAndSwap uses android_atomic_cas,
which will repeat the strex until it succeeds. The compiled version
was changed to do the same.

Bug: 10530407
Change-Id: I7efb3f92d0d0610fcc5a885e2c97f1d701b5a4ea
uick/arm/int_arm.cc
b048dd2b662c19644361f4396a1e8d6213445ee8 12-Sep-2013 Mathieu Chartier <mathieuc@google.com> Merge "Add valgrind support to compiler arena allocator." into dalvik-dev
75165d015cc737f951d4264f8c55012298abdb18 12-Sep-2013 Mathieu Chartier <mathieuc@google.com> Add valgrind support to compiler arena allocator.

Change-Id: Id9974301d3810bfac968ee562b01a11098e402c2
rena_allocator.cc
rena_allocator.h
77695d2e13d522426c973546391c07ac88242bc2 12-Sep-2013 Jeff Hao <jeffhao@google.com> am 715084a2: am 9d7e507f: am 95848d01: Revert "Fix CAS intrinsic to clear exclusive if values don\'t match."

* commit '715084a24a9db1b898c38bbf4a8a7383da76e326':
Revert "Fix CAS intrinsic to clear exclusive if values don't match."
95848d01adae14c6a9ba433f6789a9462edb8e7d 12-Sep-2013 Jeff Hao <jeffhao@google.com> Revert "Fix CAS intrinsic to clear exclusive if values don't match."

Ian is correct. I can still see this bug even with this change.

This reverts commit 3a0831507637028a439712dedaaddd7cd0893995.

Change-Id: I780f2de926f1ff7576adc679c56a6cf491dad127
uick/arm/int_arm.cc
3a0831507637028a439712dedaaddd7cd0893995 12-Sep-2013 Jeff Hao <jeffhao@google.com> Fix CAS intrinsic to clear exclusive if values don't match.

The LDREX has a matching STREX if the values match, but it needed
a CLREX for the case where they didn't.

Bug: 10530407
Change-Id: I46b474cca326a251536e7f214c80486694431386
(cherry picked from commit 78765e84a3654357a03f84b76985556cf7d9731a)
uick/arm/int_arm.cc
78765e84a3654357a03f84b76985556cf7d9731a 12-Sep-2013 Jeff Hao <jeffhao@google.com> Fix CAS intrinsic to clear exclusive if values don't match.

The LDREX has a matching STREX if the values match, but it needed
a CLREX for the case where they didn't.

Bug: 10530407
Change-Id: I46b474cca326a251536e7f214c80486694431386
uick/arm/int_arm.cc
bd663de599b16229085759366c56e2ed5a1dc7ec 11-Sep-2013 buzbee <buzbee@google.com> Compile-time tuning: register/bb utilities

This CL yeilds about a 4% improvement in the compilation phase
of dex2oat (single-threaded; multi-threaded compilation is
more difficult to accurately measure). The register utilities
could stand to be completely rewritten, but this gets most of the
easy benefit.

Next up: the assembly phase.

Change-Id: Ife5a474e9b1a6d9e501e888dda6749d34eb77e96
rowable_array.h
ir_graph.cc
ir_graph.h
uick/arm/codegen_arm.h
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/mips/codegen_mips.h
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/codegen_x86.h
uick/x86/target_x86.cc
fffd663bd276ee5fd8fda6641689546042429981 10-Sep-2013 buzbee <buzbee@google.com> Merge "More Quick compile-time tuning: labels & branches" into dalvik-dev
252254b130067cd7a5071865e793966871ae0246 09-Sep-2013 buzbee <buzbee@google.com> More Quick compile-time tuning: labels & branches

This CL represents a roughly 3.5% performance improvement for the
compile phase of dex2oat. Move of the gain comes from avoiding
the generation of dex boundary LIR labels unless a debug listing
is requested. The other significant change is moving from a basic block
ending branch model of "always generate a fall-through branch, and then
delete it if we can" to a "only generate a fall-through branch if we need
it" model.

The data motivating these changes follow. Note that two area of
potentially attractive gain remain: restructing the assembler model and
reworking the register handling utilities. These will be addressed
in subsequent CLs.

--- data follows

The Quick compiler's assembler has shown up on profile reports a bit
more than seems reasonable. We've tried a few quick fixes to apparently
hot portions of the code, but without much gain. So, I've been looking at
the assembly process at a somewhat higher level. There look to be several
potentially good opportunities.

First, an analysis of the makeup of the LIR graph showed a surprisingly
high proportion of LIR pseudo ops. Using the boot classpath as a basis,
we get:

32.8% of all LIR nodes are pseudo ops.
10.4% are LIR instructions which require pc-relative fixups.
11.8% are LIR instructions that have been nop'd by the various
optimization passes.

Looking only at the LIR pseudo ops, we get:
kPseudoDalvikByteCodeBoundary 43.46%
kPseudoNormalBlockLabel 21.14%
kPseudoSafepointPC 20.20%
kPseudoThrowTarget 6.94%
kPseudoTarget 3.03%
kPseudoSuspendTarget 1.95%
kPseudoMethodExit 1.26%
kPseudoMethodEntry 1.26%
kPseudoExportedPC 0.37%
kPseudoCaseLabel 0.30%
kPseudoBarrier 0.07%
kPseudoIntrinsicRetry 0.02%
Total LIR count: 10167292

The standout here is the Dalvik opcode boundary marker. This is just a
label inserted at the beginning of the codegen for each Dalvik bytecode.
If we're also doing a verbose listing, this is also where we hang the
pretty-print disassembly string. However, this label was also
being used as a convenient way to find the target of switch case
statements (and, I think at one point was used in the Mir->GBC conversion
process).

This CL moves the use of kPseudoDalvikByteCodeBoundary labels to only
verbose listing runs, and replaces the codegen uses of the label with
the kPseudoNormalBlockLabel attached to the basic block that contains the
switch case target. Great savings here - 14.3% reduction in the number of
LIR nodes needed. After this CL, our LIR pseudo proportions drop to 21.6%
of all LIR. That's still a lot, but much better. Possible further
improvements via combining normal labels with kPseudoSafepointPC labels
where appropriate, and also perhaps reduce memory usage by using a
short-hand form for labels rather than a full LIR node. Also, many
of the basic block labels are no longer branch targets by the time
we get to assembly - cheaper to delete, or just ingore?

Here's the "after" LIR pseudo op breakdown:

kPseudoNormalBlockLabel 37.39%
kPseudoSafepointPC 35.72%
kPseudoThrowTarget 12.28%
kPseudoTarget 5.36%
kPseudoSuspendTarget 3.45%
kPseudoMethodEntry 2.24%
kPseudoMethodExit 2.22%
kPseudoExportedPC 0.65%
kPseudoCaseLabel 0.53%
kPseudoBarrier 0.12%
kPseudoIntrinsicRetry 0.04%
Total LIR count: 5748232

Not done in this CL, but it will be worth experimenting with actually
deleting LIR nodes from the graph when they are optimized away, rather
than just setting the NOP bit. Keeping them around is invaluable
during debugging - but when not debugging it may pay off if the cost of
node removal is less than the cost of traversing through dead nodes
in subsequent passes.

Next up (and partially in this CL - but mostly to be done in follow-on
CLs) is the overall assembly process. Inherited from the trace JIT,
the Quick compiler has a fairly simple-minded approach to instruction
assembly. First, a pass is made over the LIR list to assign offsets
to each instruction. Then, the assembly pass is made - which generates
the actual machine instruction bit patterns and pushes the instruction
data into the code_buffer. However, the code generator takes the "always
optimistic" approach to instruction selection and emits the shortest
instruction. If, during assembly, we find that a branch or load doesn't
reach, that short-form instruction is replaces with a longer sequence.

Of course, this invalidates the previously-computed offset calculations.
Assembly thus is an iterative process: compute offsets and then assemble
until we survive an assembly pass without invalidation. This seems
like a likely candidate for improvement. First, I analyzed the
number of retries required, and the reason for invalidation over the
boot classpath load.

The results: more than half of methods don't require a retry, and
very few require more than 1 extra pass:

5 or more: 6 of 96334
4 or more: 22 of 96334
3 or more: 140 of 96334
2 or more: 1794 of 96334 - 2%
1 or more: 40911 of 96334 - 40%
0 retries: 55423 of 96334 - 58%

The interesting group here is the one that requires 1 retry. Looking
at the reason, we see three typical reasons:

1. A cbnz/cbz doesn't reach (only 7 bits of offset)
2. A 16-bit Thumb1 unconditional branch doesn't reach.
3. An unconditional branch which branches to the next instruction
is encountered, and deleted.

The first 2 cases are the cost of the optimistic strategy - nothing
much to change there. However, the interesting case is #3 - dead
branch elimination. A further analysis of the single retry group showed
that 42% of the methods (16305) that required a single retry did so
*only* because of dead branch elimination. The big question here is
why so many dead branches survive to the assembly stage. We have
a dead branch elimination pass which is supposed to catch these - perhaps
it's not working correctly, should be moved later in the optimization
process, or perhaps run multiple times.

Other things to consider:

o Combine the offset generation pass with the assembly pass. Skip
pc-relative fixup assembly (other than assigning offset), but push
LIR* for them into work list. Following the main pass, zip through
the work list and assemble the pc-relative instructions (now that we
know the offsets). This would significantly cut back on traversal
costs.

o Store the assembled bits into both the code buffer and the LIR.
In the event we have to retry, only the pc-relative instructions
would need to be assembled, and we'd finish with a pass over the
LIR just to dumb the bits into the code buffer.

Change-Id: I50029d216fa14f273f02b6f1c8b6a0dde5a7d6a6
rowable_array.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/x86/assemble_x86.cc
02ed4c04468ca5f5540c5b704ac3e2f30eb9e8f4 06-Sep-2013 Ian Rogers <irogers@google.com> Move disassembler out of runtime.

Bug: 9877500.
Change-Id: Ica6d9f5ecfd20c86e5230a2213827bd78cd29a29
rena_allocator.cc
ex_to_dex_compiler.cc
ortable/mir_to_gbc.cc
uick/mir_to_lir.cc
28c2300d9a85f4e7288fb5d94280332f923b4df3 07-Sep-2013 buzbee <buzbee@google.com> More compile-time tuning

Small, but measurable, improvement.

Change-Id: Ie3c7180f9f9cbfb1729588e7a4b2cf6c6d291c95
rena_bit_vector.cc
rena_bit_vector.h
ir_graph.h
uick/codegen_util.cc
reg_analysis.cc
9f799db0e4124d3158cde6ead854289fba10f3aa 07-Sep-2013 buzbee <buzbee@google.com> Merge "Compile-time tuning" into dalvik-dev
56c717860df2d71d66fb77aa77f29dd346e559d3 06-Sep-2013 buzbee <buzbee@google.com> Compile-time tuning

Specialized the dataflow iterators and did a few other minor tweaks.
Showing ~5% compile-time improvement in a single-threaded environment;
less in multi-threaded (presumably because we're blocked by something
else).

Change-Id: I2e2ed58d881414b9fc97e04cd0623e188259afd2
ataflow_iterator-inl.h
ataflow_iterator.h
rowable_array.h
ir_analysis.cc
ir_dataflow.cc
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/codegen_util.cc
uick/local_optimizations.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
sa_transformation.cc
reg_analysis.cc
9b297bfc588c7d38efd12a6f38cd2710fc513ee3 06-Sep-2013 Ian Rogers <irogers@google.com> Refactor CompilerDriver::Compute..FieldInfo

Don't use non-const reference arguments.
Move ins before outs.

Change-Id: I7b251156388d8f07513b3da62ebfd29e5fd9ff76
ex_to_dex_compiler.cc
uick/arm/call_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/mir_to_lir.h
65ec92cf13c9d11c83711443a02e4249163d47f1 06-Sep-2013 Ian Rogers <irogers@google.com> Refactor CompilerDriver::ComputeInvokeInfo

Don't use non-const reference arguments.
Move ins before outs.

Change-Id: I4a7b8099abe91ea60f93a56077f4989303fa4876
ex_to_dex_compiler.cc
ir_dataflow.cc
uick/gen_invoke.cc
866709c85da0c0d2c76968713e4dc4a35dce27fd 06-Sep-2013 Sebastien Hertz <shertz@google.com> Merge "Disable devirtualization detection in DEX-to-DEX compiler." into dalvik-dev
1e54d68ce8e77dfe63340275d11a072c5184c89a 06-Sep-2013 Sebastien Hertz <shertz@google.com> Disable devirtualization detection in DEX-to-DEX compiler.

This CL allows the DEX-to-DEX compiler to disable devirtualization detection.
This allows to quicken invoke-virtual/range instructions that used to be
eligible for devirtualization.

Bug: 10632943
Change-Id: I6c9f4d3249cf42b47f004be5825b3186fa83501e
ex_to_dex_compiler.cc
ir_dataflow.cc
uick/gen_invoke.cc
d1946a2621553968599ca4db0f4200877c30186f 04-Sep-2013 Mathieu Chartier <mathieuc@google.com> am 22955837: Merge "Multi threaded hashed deduplication during compilation." into klp-dev

* commit '22955837e20f126845ff0e516dfa6f74ec81d240':
Multi threaded hashed deduplication during compilation.
193bad9b9cfd10642043fa2ebbfc68bd5f9ede4b 30-Aug-2013 Mathieu Chartier <mathieuc@google.com> Multi threaded hashed deduplication during compilation.

Moved deduplication to be in the compiler driver instead of oat
writer. This enables deduplication to be performed on multiple
threads. Also added a hash function to avoid excessive comparison
of byte arrays.

Improvements:
Before (alloats host):
real 1m6.967s
user 4m22.940s
sys 1m22.610s

Thinkfree.apk (target mako):
0m23.74s real 0m50.95s user 0m9.50s system
0m24.62s real 0m50.61s user 0m10.07s system
0m24.22s real 0m51.44s user 0m10.09s system
0m23.70s real 0m51.05s user 0m9.97s system
0m23.50s real 0m50.74s user 0m10.63s system

After (alloats host):
real 1m5.705s
user 4m44.030s
sys 1m29.990s

Thinkfree.apk (target mako):
0m23.32s real 0m51.38s user 0m10.00s system
0m23.49s real 0m51.20s user 0m9.80s system
0m23.18s real 0m50.80s user 0m9.77s system
0m23.52s real 0m51.22s user 0m10.02s system
0m23.50s real 0m51.55s user 0m9.46s system

Bug: 10552630

Change-Id: Ia6d06a747b86b0bfc4473b3cd68f8ce1a1c7eb22
uick/codegen_util.cc
6e288203c06c71c945935830b91a215a273bf8e6 30-Aug-2013 Brian Carlstrom <bdc@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit 70814f7746793934a29e010211ef6e652ad75cd2.
ortable/mir_to_gbc.cc
70814f7746793934a29e010211ef6e652ad75cd2 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: I49e691b6771f7e3f77fe583841ea51b06ee7cfdf
ortable/mir_to_gbc.cc
e0948e13d5a4552e6a2728087573c07961e4a4f9 29-Aug-2013 Brian Carlstrom <bdc@google.com> Make DexFiles opened from files readonly by default, but writable during dex2oat

Bug: 9618388
Change-Id: I83f2e16ee8446a79a94a84971146d807bb0c9ee0
ex_to_dex_compiler.cc
a7d56cf5e0fe6da41969f6dd841aef0d73f09d93 29-Aug-2013 Ian Rogers <irogers@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit eaeab46304a139da495de941e853ce9acdace175.

Change-Id: I854e09c9c988702de08a9ff642619761d1d57639
(cherry picked from commit 03feadd72f6205f0b88fe69aaa30c69d1b2e8c2d)
ortable/mir_to_gbc.cc
eaeab46304a139da495de941e853ce9acdace175 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: I5ee58031e423838cdc8968675192f9b63a7d867d
ortable/mir_to_gbc.cc
11b63d13f0a3be0f74390b66b58614a37f9aa6c1 27-Aug-2013 buzbee <buzbee@google.com> Quick compiler: division by literal fix

The constant propagation optimization pass attempts to identify
constants in Dalvik virtual registers and handle them more efficiently.
The use of small constants in divison, though, was handled incorrectly
in that the high level code correctly detected the use of a constant,
but the actual code generation routine was only expecting the use of
a special constant form opcode.

see b/10503566

Change-Id: I88aa4d2eafebb2b1af1a1e88049f1845aefae261
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/gen_common.cc
uick/mips/codegen_mips.h
uick/mips/int_mips.cc
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
f6c4b3ba3825de1dbb3e747a68b809c6cc8eb4db 25-Aug-2013 Mathieu Chartier <mathieuc@google.com> New arena memory allocator.

Before we were creating arenas for each method. The issue with doing this
is that we needed to memset each memory allocation. This can be improved
if you start out with arenas that contain all zeroed memory and recycle
them for each method. When you give memory back to the arena pool you do
a single memset to zero out all of the memory that you used.

Always inlined the fast path of the allocation code.

Removed the "zero" parameter since the new arena allocator always returns
zeroed memory.

Host dex2oat time on target oat apks (2 samples each).
Before:
real 1m11.958s
user 4m34.020s
sys 1m28.570s

After:
real 1m9.690s
user 4m17.670s
sys 1m23.960s

Target device dex2oat samples (Mako, Thinkfree.apk):
Without new arena allocator:
0m26.47s real 0m54.60s user 0m25.85s system
0m25.91s real 0m54.39s user 0m26.69s system
0m26.61s real 0m53.77s user 0m27.35s system
0m26.33s real 0m54.90s user 0m25.30s system
0m26.34s real 0m53.94s user 0m27.23s system

With new arena allocator:
0m25.02s real 0m54.46s user 0m19.94s system
0m25.17s real 0m55.06s user 0m20.72s system
0m24.85s real 0m55.14s user 0m19.30s system
0m24.59s real 0m54.02s user 0m20.07s system
0m25.06s real 0m55.00s user 0m20.42s system

Correctness of Thinkfree.apk.oat verified by diffing both of the oat files.

Change-Id: I5ff7b85ffe86c57d3434294ca7a621a695bf57a9
rena_allocator.cc
rena_allocator.h
rena_bit_vector.cc
rena_bit_vector.h
ompiler_ir.h
rontend.cc
rowable_array.h
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
uick/arm/call_arm.cc
uick/arm/target_arm.cc
uick/codegen_util.cc
uick/local_optimizations.cc
uick/mips/call_mips.cc
uick/mips/target_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/target_x86.cc
sa_transformation.cc
reg_analysis.cc
4b8c13ee44c4c959d7b8de9adff7ce6df48c31d0 24-Aug-2013 Brian Carlstrom <bdc@google.com> Fix sort order to make register promotion stable

Also some minor oatdump fixes

Change-Id: I5679835bf684b98d130b77ecf00bda5f6547d383
uick/ralloc_util.cc
ec0cf9b8217ceaddbb53faa78c3cf34b07ac87b1 22-Aug-2013 Brian Carlstrom <bdc@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit b8a874ca3b13007f4bf688963483ffb3c76e0d7d.
ortable/mir_to_gbc.cc
b8a874ca3b13007f4bf688963483ffb3c76e0d7d 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: I7403dca575104de2ceb5fc0619611366a8058e5d
ortable/mir_to_gbc.cc
677ffa4eb84bcf667b1ae43559b61aff85a1322d 22-Aug-2013 Ian Rogers <irogers@google.com> Don't skip compilation for portable builds.

Portable build fix.

Change-Id: If4e5efedb232d52257714af020c50a52843cbad8
rontend.cc
fe9ca4028f379688ecba6132ac3738171176b3e4 21-Aug-2013 buzbee <buzbee@google.com> Compiler filter update

Tweak of the compiler filter to give better results for applications
which are not dominated by tight arithmetic loops. Deleted
the "DeferCompilation" setting - it didn't differ enough from the
"Space" setting. Added "Everything" setting to support forced
compilation (for images and testing). Previously used "Speed"
for that purpose, but in the speed setting there are some things we
don't want to compile.

Change-Id: Ia53b14f2044fc9738c1a4c1318f8204f2c25abe3
ir_analysis.cc
ir_graph.h
b7767e8db32cac29370852170871a6769388195f 20-Aug-2013 Brian Carlstrom <bdc@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit 6a94caa048121858ee8e71f84caf7b9ae1f940df.
ortable/mir_to_gbc.cc
6a94caa048121858ee8e71f84caf7b9ae1f940df 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

(cherry picked from commit 6e6819f7b8b4820ae2b1003a516fe9aa60fa478e)

Change-Id: I4fb59f291bb58c7ed8575f71a44f7c59f653a5ec
ortable/mir_to_gbc.cc
9329e6d1a8ff8d3775c4a9db9a7bb97694bc267d 19-Aug-2013 buzbee <buzbee@google.com> More suspend check repair.

The previous fix to the suspend check optimization mechanism left
a bug in the handling of constant-folded branches.

Change-Id: Ib71f1cb9f17203bee26746006e568d448666962d
ir_graph.cc
ir_graph.h
ir_optimization.cc
uick/mir_to_lir.cc
cbcfaf3a410e35730c4daeaff6c791665764925a 19-Aug-2013 buzbee <buzbee@google.com> Fix suspend check optimization

Art's Quick compiler currently uses a convervative mechanism
to ensure that a safe point will be reached within a "small" amount
of time. Explicit suspend checks are placed prior to backwards
branches and on returns. There are a lot of ways to optimize,
which we'll get to in the future, but for now the only optimization
is to detect a backwards branch that targets a return block. That's
a common pattern in dex, and simple to detect. In those cases, we can
suppress the suspend check on the backwards branch knowing that the
return will do it.

However, the notion of what is a backwards branch got a bit muddied
with some mir optimizations that transform the graph by changing the
sense of branches. What started off as a taken backwards branch may
turn into a fallthrough backwards branch.

This CL avoid the confusion by marking branches backwards based on
their original dex targets rather than using the post-transform test
of backwardness.

Change-Id: I9b30be168c801af51bae7f66ecd442edcb115a18
ir_graph.cc
ir_graph.h
ir_optimization.cc
uick/mir_to_lir.cc
be6810d714bbf0c9c3c1d7d919e1aef5a3b52a20 14-Aug-2013 Brian Carlstrom <bdc@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit 6e6819f7b8b4820ae2b1003a516fe9aa60fa478e.
ortable/mir_to_gbc.cc
6e6819f7b8b4820ae2b1003a516fe9aa60fa478e 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

(cherry picked from commit 1961a2716cf02f597f06c27a0850daa2dc917586)

Change-Id: Idc2e3fb73d798a62b6ebf6f55aff5c715b2c62f7
ortable/mir_to_gbc.cc
ea46f950e7a51585db293cd7f047de190a482414 30-Jul-2013 Brian Carlstrom <bdc@google.com> Refactor java.lang.reflect implementation

Cherry-picked from commit ed41d5c44299ec5d44b8514f6e17f802f48094d1.

Move to ArtMethod/Field instead of AbstractMethod/Field and have
java.lang.reflect APIs delegate to ArtMethod/ArtField.

Bug: 10014286.

Change-Id: Iafc1d8c5b62562c9af8fb9fd8c5e1d61270536e7
ex_to_dex_compiler.cc
uick/gen_common.cc
uick/gen_invoke.cc
73a79074c06d8b0a8c14946438c59c3821d88fe7 13-Aug-2013 Stephen Hines <srhines@google.com> Revert "Update ART for LLVM merge up to r187914."

This reverts commit 1961a2716cf02f597f06c27a0850daa2dc917586.
ortable/mir_to_gbc.cc
34de74bb9d91534ab7ebbd1f73ee1d96db894b4c 13-Aug-2013 Stephen Hines <srhines@google.com> Merge "Update ART for LLVM merge up to r187914." into klp-dev
a49bdffd3826ea45b5d8f435b2add160871351bb 31-Jul-2013 Ian Rogers <irogers@google.com> Don't add barriers to clinit methods.

Change-Id: I13e6c008feb8c19e452d6e2f88b2bbbcac997de5
(cherry picked from commit 9fc16eb43fe938f0cddb13638bd7cbc2ea9534a2)
ex_to_dex_compiler.cc
96faf5b363d922ae91cf25404dee0e87c740c7c5 10-Aug-2013 Ian Rogers <irogers@google.com> Uleb128 compression of vmap and mapping table.

Bug 9437697.

Change-Id: I30bcb97d12cd8b46d3b2cdcbdd358f08fbb9947a
(cherry picked from commit 1809a72a66d245ae598582d658b93a24ac3bf01e)
uick/codegen_util.cc
uick/mir_to_lir.h
468532ea115657709bc32ee498e701a4c71762d4 05-Aug-2013 Ian Rogers <irogers@google.com> Entry point clean up.

Create set of entry points needed for image methods to avoid fix-up at load time:
- interpreter - bridge to interpreter, bridge to compiled code
- jni - dlsym lookup
- quick - resolution and bridge to interpreter
- portable - resolution and bridge to interpreter

Fix JNI work around to use JNI work around argument rewriting code that'd been
accidentally disabled.
Remove abstact method error stub, use interpreter bridge instead.
Consolidate trampoline (previously stub) generation in generic helper.
Simplify trampolines to jump directly into assembly code, keeps stack crawlable.
Dex: replace use of int with ThreadOffset for values that are thread offsets.
Tidy entry point routines between interpreter, jni, quick and portable.

Change-Id: I52a7c2bbb1b7e0ff8a3c3100b774212309d0828e
(cherry picked from commit 848871b4d8481229c32e0d048a9856e5a9a17ef9)
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
1961a2716cf02f597f06c27a0850daa2dc917586 09-Aug-2013 Stephen Hines <srhines@google.com> Update ART for LLVM merge up to r187914.

Removed NoFramePointerElimNonLeaf because this is now only specified via
a function attribute (and thus covered by existing cases).

Switch to llvm::sys::fs::F_* enums.

Remove unused DisableSimplifyLibCalls().

Change-Id: I792e3a31f5dc289459aeacac995e7c828b6063d3
ortable/mir_to_gbc.cc
ee17e0aa4d24deb11c1766bfcc6a864519df1c1e 31-Jul-2013 buzbee <buzbee@google.com> Compilation filter

This CL introduces a static compilation filter mechanism intended
to allow us to reduce compilation time and space requirements until
we have a profiling mechanism in place.

It supports 5 modes of filtering:

o interpret-only (compile nothing)
o deferred-compilation (compile only those methods believe to be
compute-intensive)
o space (optimized for space)
o balanced (best return on space investment)
o speed (compile everything)

A future CL will allow the default filtering mode to be set
via system property. For now, you can pass it in via command
line as follows:

dalvikvm -compiler-filter:[interpret-only|defer-compilation|
space|balanced|speed]

or dex2oat --runtime-arg -compiler-filter:[one of the above modes]

Creating a file named art/SMALL_ART will force the filter
default to interpret-only. Later on we'll move this capability
to a persistent system property.

or modify kDefaultCompilerFilter in runtime.h

It also changes the compiler driver to allow the compilers to
decline to compile a method by return NULL.

Change-Id: Ic73411818f8bb845a4a19a05b0395c50902c534f
(cherry picked from commit a024a0686c3b0fea13f362bff70d65981e5febc5)
rontend.cc
rontend.h
ir_analysis.cc
ir_graph.h
1b8b2e49fdfee50cafafe01d73346af6dfcf231d 31-Jul-2013 Sebastien Hertz <shertz@google.com> Merge "Adds a DEX-to-DEX compilation level." into dalvik-dev
75021222d9c03a80fa5c136db0d5fb8d82d04031 16-Jul-2013 Sebastien Hertz <shertz@google.com> Adds a DEX-to-DEX compilation level.

This CL adds a DEX-to-DEX compilation level which allows the DEX-to-DEX
compiler to ensure correctness on classes with soft-failed verification.

Bug: 9307738
Change-Id: If051336bf81370bca55872c8c75ccd573d8ca391
ex_to_dex_compiler.cc
0b12b9318c29d7c32d5a605e0b1dc309872c8a37 31-Jul-2013 buzbee <buzbee@google.com> resolved conflicts for merge of 2724776a to dalvik-dev

Change-Id: I7f55e92b7d4d2c57812bc6eb7daa7bb5b77cacc2
2724776ad521eebb1c7f0e4be56d6e6ab4764f86 28-Jul-2013 buzbee <buzbee@google.com> Support inline dex data, take 2

Allow switch and array data blocks to appear interspersed
with Dex code (rather than just at the end).

Bug 10040419

Change-Id: Ia2850070f0e702381eb402f604d675e5a0b101de
ir_graph.cc
7655f29fabc0a12765de828914a18314382e5a35 29-Jul-2013 Ian Rogers <irogers@google.com> Portable refactorings.

Separate quick from portable entrypoints.
Move architectural dependencies into arch.

Change-Id: I9adbc0a9782e2959fdc3308215f01e3107632b7c
uick/arm/call_arm.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/x86/call_x86.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
166db04e259ca51838c311891598664deeed85ad 26-Jul-2013 Ian Rogers <irogers@google.com> Move assembler out of runtime into compiler/utils.

Other directory layout bits of clean up. There is still work to separate quick
and portable in some files (e.g. argument visitor, proxy..).

Change-Id: If8fecffda8ba5c4c47a035f0c622c538c6b58351
uick/arm/call_arm.cc
uick/arm/int_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
46a1270fad27d81904ed60d0df56761356af500d 27-Jul-2013 Brian Carlstrom <bdc@google.com> Revert "Support inline dex data"

This reverts commit 728328a441c6d3172283f3e44d120550997b5887.
ir_graph.cc
64d8f18c94b23cb4ff908304aef4d9f3f5a85f39 27-Jul-2013 buzbee <buzbee@google.com> Merge "Support inline dex data"
728328a441c6d3172283f3e44d120550997b5887 27-Jul-2013 buzbee <buzbee@google.com> Support inline dex data

Dx always places switch table and array data following executable
code. However, embedding data inline appears to be legal - and
the Garmin Connect app does this. Unknown is what tool generated
the odd dex code. This CL reworks dex parsing to support inline data.

Further, a verification check to require a move-exception at
the beginning of catch regions is disabled. Dalvik's verifier appears
to only require that if a move-exception exists, it must be at
the beginning of the catch. If there is value to the check
requiring a move-exception, we'll need to enable it based on a
future dex version.

Change-Id: I80c78544993acb999f7c62d32479c3c8455b56cb
ir_graph.cc
7934ac288acfb2552bb0b06ec1f61e5820d924a4 26-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/comments issues

Change-Id: Iae286862c85fb8fd8901eae1204cd6d271d69496
rena_allocator.h
ompiler_enums.h
ataflow_iterator.h
ex_to_dex_compiler.cc
rontend.cc
rontend.h
ocal_value_numbering.h
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/arm_lir.h
uick/arm/call_arm.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mips/call_mips.cc
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/fp_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
sa_transformation.cc
reg_analysis.cc
2b1de652896040e3049814da91c835b2b500af55 20-Jul-2013 buzbee <buzbee@google.com> am 479f83c1: Dex compiler: re-enable method pattern matching

* commit '479f83c196d5a95e36196eac548dc6019e70a5be':
Dex compiler: re-enable method pattern matching
ebd66389dacec3118232fbd426c70dbed573cff1 19-Jul-2013 Brian Carlstrom <bdc@google.com> am 4274889d: Fixing cpplint readability/check issues

* commit '4274889d48ef82369bf2c1ca70d84689b4f9e93a':
Fixing cpplint readability/check issues
ac43ae545ffca66aac813ed3e6ab54e3559b5e4e 19-Jul-2013 Brian Carlstrom <bdc@google.com> am 2d88862f: Fixing cpplint readability/casting issues

* commit '2d88862f0752a7a0e65145b088f49dabd49d4284':
Fixing cpplint readability/casting issues
58d8b956e7d83bb1b219405be87e135c89b9cdb2 19-Jul-2013 Brian Carlstrom <bdc@google.com> am 02c8cc6d: Fixing cpplint whitespace/blank_line, whitespace/end_of_line, whitespace/labels, whitespace/semicolon issues

* commit '02c8cc6d1312a2b55533f02f6369dc7c94672f90':
Fixing cpplint whitespace/blank_line, whitespace/end_of_line, whitespace/labels, whitespace/semicolon issues
5775391897aa290d96ad903ddbe00f66e7a6a4f8 19-Jul-2013 Brian Carlstrom <bdc@google.com> am 6f485c62: Fix cpplint whitespace/indent issues

* commit '6f485c62b9cfce3ab71020c646ab9f48d9d29d6d':
Fix cpplint whitespace/indent issues
d0b495921acbe890892eddd6a7b055acee3d6505 19-Jul-2013 Brian Carlstrom <bdc@google.com> am 9b7085a4: Fix cpplint readability/braces issues

* commit '9b7085a4e7c40e7fa01932ea1647a4a33ac1c585':
Fix cpplint readability/braces issues
fbf49d27f4a4e74c5901899a1c4879946b7bdf4e 19-Jul-2013 Brian Carlstrom <bdc@google.com> resolved conflicts for merge of 50af9793 to dalvik-dev

Change-Id: I13e7db2b4d4340d2c1a9994a4c6277f04e19d9fb
479f83c196d5a95e36196eac548dc6019e70a5be 19-Jul-2013 buzbee <buzbee@google.com> Dex compiler: re-enable method pattern matching

The dex compiler's mechanism to detect simple methods and emit
streamlined code was disabled during the last big restructuring
(there was a question of how to make it useful for Portable as
well as Quick). This CL does not address the Portable question,
but turns the optimization back on for Quick.

See b/9428200

Change-Id: I9f25b41219d7a243ec64efb18278e5a874766f4d
ir_graph.cc
ir_graph.h
uick/codegen_util.cc
4274889d48ef82369bf2c1ca70d84689b4f9e93a 19-Jul-2013 Brian Carlstrom <bdc@google.com> Fixing cpplint readability/check issues

Change-Id: Ia81db7238b4a13ff2e585aaac9d5e3e91df1e3e0
ir_graph.cc
uick/arm/int_arm.cc
2d88862f0752a7a0e65145b088f49dabd49d4284 19-Jul-2013 Brian Carlstrom <bdc@google.com> Fixing cpplint readability/casting issues

Change-Id: I6821da0e23737995a9b884a04e9b63fac640cd05
uick/codegen_util.cc
uick/gen_invoke.cc
02c8cc6d1312a2b55533f02f6369dc7c94672f90 19-Jul-2013 Brian Carlstrom <bdc@google.com> Fixing cpplint whitespace/blank_line, whitespace/end_of_line, whitespace/labels, whitespace/semicolon issues

Change-Id: Ide4f8ea608338b3fed528de7582cfeb2011997b6
ir_graph.cc
ir_optimization.cc
uick/codegen_util.cc
uick/ralloc_util.cc
reg_analysis.cc
6f485c62b9cfce3ab71020c646ab9f48d9d29d6d 19-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/indent issues

Change-Id: I7c1647f0c39e1e065ca5820f9b79998691ba40b1
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/call_arm.cc
uick/arm/utility_arm.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
9b7085a4e7c40e7fa01932ea1647a4a33ac1c585 19-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint readability/braces issues

Change-Id: I56b88956510077b0e13aad4caee8898313fab55b
rena_allocator.h
rena_bit_vector.h
ackend.h
ex_to_dex_compiler.cc
rontend.cc
rowable_array.h
ocal_value_numbering.h
ir_graph.cc
uick/arm/utility_arm.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
38f85e4892f6504971bde994fec81fd61780ac30 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/operators issues

Change-Id: I730bd87b476bfa36e93b42e816ef358006b69ba5
ir_dataflow.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/mips/assemble_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/ralloc_util.cc
reg_analysis.cc
e3409880554bdefe8f0392e949315d234478ab8a 18-Jul-2013 Brian Carlstrom <bdc@google.com> am 1895ea38: Fix cpplint readability/fn_size issues

* commit '1895ea386ca78573302483f589ebabd8ce1480e7':
Fix cpplint readability/fn_size issues
1895ea386ca78573302483f589ebabd8ce1480e7 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint readability/fn_size issues

Change-Id: I1efdb07a948a2af49db1a9d21ccab16dacc03a54
ortable/mir_to_gbc.cc
uick/mir_to_lir.cc
b9070095218595a5d6a37ef874df2794c1761030 18-Jul-2013 Brian Carlstrom <bdc@google.com> resolved conflicts for merge of df62950e to dalvik-dev

Change-Id: I78fbcfc7a2dcbeccb7557ca27302928d7d00debd
08524597899d0bb021c9165218deff51dc88da50 18-Jul-2013 Brian Carlstrom <bdc@google.com> am 0cd7ec2d: Fix cpplint whitespace/blank_line issues

* commit '0cd7ec2dcd8d7ba30bf3ca420b40dac52849876c':
Fix cpplint whitespace/blank_line issues
df62950e7a32031b82360c407d46a37b94188fbb 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/parens issues

Change-Id: Ifc678d59a8bed24ffddde5a0e543620b17b0aba9
rena_bit_vector.h
ataflow_iterator.h
rontend.cc
ir_dataflow.cc
ir_graph.cc
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/utility_x86.cc
sa_transformation.cc
reg_analysis.cc
0cd7ec2dcd8d7ba30bf3ca420b40dac52849876c 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/blank_line issues

Change-Id: Ice937e95e23dd622c17054551d4ae4cebd0ef8a2
rena_allocator.h
rena_bit_vector.h
ackend.h
ataflow_iterator.h
rowable_array.h
ocal_value_numbering.cc
ocal_value_numbering.h
ir_graph.cc
ir_graph.h
ortable/mir_to_gbc.cc
ortable/mir_to_gbc.h
uick/arm/assemble_arm.cc
uick/codegen_util.cc
uick/gen_invoke.cc
uick/local_optimizations.cc
uick/mips/codegen_mips.h
uick/mir_to_lir.h
uick/x86/codegen_x86.h
sa_transformation.cc
073deb8dda59ba42ad563f0453daa09a359edef7 18-Jul-2013 Brian Carlstrom <bdc@google.com> am f69863b3: Fix cpplint whitespace/newline issues

* commit 'f69863b3039fc621ff4250e262d2a024d5e79ec8':
Fix cpplint whitespace/newline issues
f69863b3039fc621ff4250e262d2a024d5e79ec8 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/newline issues

Change-Id: Ie2049d9f667339e41f36c4f5d09f0d10d8d2c762
rontend.cc
uick/codegen_util.cc
uick/mips/utility_mips.cc
b267c89acd0fcda0e8e2a9eeaeeed9ee048d1abc 18-Jul-2013 Brian Carlstrom <bdc@google.com> am 93ba893c: Fix cpplint runtime/explicit issues

* commit '93ba893c20532990a430741e0a97212900094e8c':
Fix cpplint runtime/explicit issues
397f477582243bdffed603a73ff5a06ee295d7fb 18-Jul-2013 Brian Carlstrom <bdc@google.com> am b1eba213: Fix cpplint whitespace/comma issues

* commit 'b1eba213afaf7fa6445de863ddc9680ab99762ea':
Fix cpplint whitespace/comma issues
98c19d201b83119cbadd9aa3966fd0fb86064813 18-Jul-2013 Brian Carlstrom <bdc@google.com> am 2ce745c0: Fix cpplint whitespace/braces issues

* commit '2ce745c06271d5223d57dbf08117b20d5b60694a':
Fix cpplint whitespace/braces issues
93ba893c20532990a430741e0a97212900094e8c 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint runtime/explicit issues

Change-Id: I352ba0b427f1ff9b22887693952b180eae0839ba
rena_allocator.h
rena_bit_vector.h
ackend.h
rowable_array.h
ocal_value_numbering.h
b1eba213afaf7fa6445de863ddc9680ab99762ea 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/comma issues

Change-Id: I456fc8d80371d6dfc07e6d109b7f478c25602b65
ir_graph.cc
ir_optimization.cc
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/x86/assemble_x86.cc
uick/x86/x86_lir.h
reg_analysis.cc
2ce745c06271d5223d57dbf08117b20d5b60694a 18-Jul-2013 Brian Carlstrom <bdc@google.com> Fix cpplint whitespace/braces issues

Change-Id: Ide80939faf8e8690d8842dde8133902ac725ed1a
rena_allocator.h
rena_bit_vector.cc
ataflow_iterator.h
rontend.cc
ocal_value_numbering.cc
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mips/assemble_mips.cc
uick/mips/call_mips.cc
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/call_x86.cc
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
sa_transformation.cc
reg_analysis.cc
42425b3a8befe092199fde69c95833e31db8fec9 18-Jul-2013 Brian Carlstrom <bdc@google.com> am fc0e3219: Fix multiple inclusion guards to match new pathnames

* commit 'fc0e3219edc9a5bf81b166e82fd5db2796eb6a0d':
Fix multiple inclusion guards to match new pathnames
fc0e3219edc9a5bf81b166e82fd5db2796eb6a0d 17-Jul-2013 Brian Carlstrom <bdc@google.com> Fix multiple inclusion guards to match new pathnames

Change-Id: Id7735be1d75bc315733b1773fba45c1deb8ace43
rena_allocator.h
rena_bit_vector.h
ackend.h
ompiler_enums.h
ompiler_internals.h
ompiler_ir.h
ataflow_iterator-inl.h
ataflow_iterator.h
rontend.h
rowable_array.h
ocal_value_numbering.h
ir_graph.h
ortable/mir_to_gbc.h
uick/arm/arm_lir.h
uick/arm/codegen_arm.h
uick/mips/codegen_mips.h
uick/mips/mips_lir.h
uick/mir_to_lir-inl.h
uick/mir_to_lir.h
uick/x86/codegen_x86.h
uick/x86/x86_lir.h
543959c9ede4c09ffaf8749a612a9ac31d6dd356 03-Jul-2013 Sebastien Hertz <shertz@google.com> Support check-cast elision in DEX-to-DEX compiler.

Bug: 9648428

Replaces safe check-cast by 2 consecutive nop instructions.

Change-Id: I2cd99c629a6a00a6e0effc853c3439bc92683d6d
ex_to_dex_compiler.cc
7940e44f4517de5e2634a7e07d58d0fb26160513 12-Jul-2013 Brian Carlstrom <bdc@google.com> Create separate Android.mk for main build targets

The runtime, compiler, dex2oat, and oatdump now are in seperate trees
to prevent dependency creep. They can now be individually built
without rebuilding the rest of the art projects. dalvikvm and jdwpspy
were already this way. Builds in the art directory should behave as
before, building everything including tests.

Change-Id: Ic6b1151e5ed0f823c3dd301afd2b13eb2d8feb81
rena_allocator.cc
rena_allocator.h
rena_bit_vector.cc
rena_bit_vector.h
ackend.h
ompiler_enums.h
ompiler_internals.h
ompiler_ir.h
ataflow_iterator-inl.h
ataflow_iterator.h
ex_to_dex_compiler.cc
rontend.cc
rontend.h
rowable_array.h
ocal_value_numbering.cc
ocal_value_numbering.h
ir_dataflow.cc
ir_graph.cc
ir_graph.h
ir_optimization.cc
ortable/mir_to_gbc.cc
ortable/mir_to_gbc.h
uick/arm/arm_lir.h
uick/arm/assemble_arm.cc
uick/arm/call_arm.cc
uick/arm/codegen_arm.h
uick/arm/fp_arm.cc
uick/arm/int_arm.cc
uick/arm/target_arm.cc
uick/arm/utility_arm.cc
uick/codegen_util.cc
uick/gen_common.cc
uick/gen_invoke.cc
uick/gen_loadstore.cc
uick/local_optimizations.cc
uick/mips/README.mips
uick/mips/assemble_mips.cc
uick/mips/call_mips.cc
uick/mips/codegen_mips.h
uick/mips/fp_mips.cc
uick/mips/int_mips.cc
uick/mips/mips_lir.h
uick/mips/target_mips.cc
uick/mips/utility_mips.cc
uick/mir_to_lir-inl.h
uick/mir_to_lir.cc
uick/mir_to_lir.h
uick/ralloc_util.cc
uick/x86/assemble_x86.cc
uick/x86/call_x86.cc
uick/x86/codegen_x86.h
uick/x86/fp_x86.cc
uick/x86/int_x86.cc
uick/x86/target_x86.cc
uick/x86/utility_x86.cc
uick/x86/x86_lir.h
sa_transformation.cc
reg_analysis.cc