[COMMIT] [AOSP] JustArchi's ArchiDroid Optimizations V4.1 - Unleash the power!

Search This thread

PWn3R

Senior Member
Dec 10, 2010
905
985
Flagstaff
Nexus 7
Motorola Droid X
So neither of you have fixed this? @JustArchi - you have any thoughts here? I even got medieval and put -g in the cflags in that file and the main BT ones to try to fix.

Original flags changes were made in system/bt/core/Android.mk
 
Last edited:

PWn3R

Senior Member
Dec 10, 2010
905
985
Flagstaff
Nexus 7
Motorola Droid X
So - I'm not one to give up on a problem and I hope to fix this for the betterment of everyone who wants to use these optimizations.

I am STILL getting the Bluetooth Share has stopped non stop. I've tried putting -Os and -g as flags in EVERY BDROID_CFLAGS (that might not be exactly the variable, but the one that you update to fix this problem based on the fix in the OP) in EVERY file in the entire build directory. NO DICE.

Here's a tombstone dump file (sorry if that's not the right lingo, I'm not a pro dev here).

https://drive.google.com/open?id=0B6BaDxaggle2UkUwc2R1QmJJYlk

And this is the logcat of the crash on the device. I suspect this is the SAME problem that EVERYONE who's tried this and can't get it to work after changing the Bluetooth flags and then gave up. Can someone help us? :)

Logcat is this: ( I can post the whole logcat if you want)

--------- beginning of crash

07-07 13:27:41.217 12511 12511 F DEBUG :

07-07 13:27:41.217 12511 12511 F DEBUG : Tombstone written to: /data/tombstones/tombstone_05

07-07 13:27:44.679 13466 13493 F libc : Fatal signal 7 (SIGBUS), code 1, fault addr 0xac98f9be in tid 13493 (BT Service Call)

07-07 13:27:44.781 12511 12511 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

07-07 13:27:44.781 12511 12511 F DEBUG : CM Version: 'unknown'

07-07 13:27:44.781 12511 12511 F DEBUG : Build fingerprint: 'google/shamu/shamu:6.0.1/MOB30M/2862625:user/release-keys'

07-07 13:27:44.781 12511 12511 F DEBUG : Revision: '0'

07-07 13:27:44.781 12511 12511 F DEBUG : ABI: 'arm'

07-07 13:27:44.781 12511 12511 F DEBUG : pid: 13466, tid: 13493, name: BT Service Call >>> com.android.bluetooth <<<

07-07 13:27:44.781 12511 12511 F DEBUG : signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0xac98f9be

07-07 13:27:44.800 12511 12511 F DEBUG : r0 aeb98300 r1 00000005 r2 00000000 r3 b334b010

07-07 13:27:44.800 12511 12511 F DEBUG : r4 ac98f9ba r5 b36bed04 r6 00000005 r7 ac98f9ba

07-07 13:27:44.800 12511 12511 F DEBUG : r8 00000000 r9 aea7fd7c sl aea7fd78 fp 00000001

07-07 13:27:44.800 12511 12511 F DEBUG : ip fffff418 sp aea7fd40 lr b47e3637 pc b36948f4 cpsr 20000030

07-07 13:27:44.806 12511 12511 F DEBUG :

07-07 13:27:44.806 12511 12511 F DEBUG : backtrace:

07-07 13:27:44.806 12511 12511 F DEBUG : #00 pc 000048f4 /system/lib/libbluetooth_jni.so

07-07 13:27:44.807 12511 12511 F DEBUG : #01 pc 000066c9 /system/lib/libbluetooth_jni.so

07-07 13:27:44.807 12511 12511 F DEBUG : #02 pc 00043493 /system/lib/hw/bluetooth.default.so

07-07 13:27:44.807 12511 12511 F DEBUG : #03 pc 00042fa3 /system/lib/hw/bluetooth.default.so

07-07 13:27:44.807 12511 12511 F DEBUG : #04 pc 0012278d /system/lib/hw/bluetooth.default.so

07-07 13:27:44.807 12511 12511 F DEBUG : #05 pc 00121455 /system/lib/hw/bluetooth.default.so

07-07 13:27:44.807 12511 12511 F DEBUG : #06 pc 0012267d /system/lib/hw/bluetooth.default.so

07-07 13:27:44.807 12511 12511 F DEBUG : #07 pc 0005167d /system/lib/libc.so (_ZL15__pthread_startPv+32)

07-07 13:27:44.807 12511 12511 F DEBUG : #08 pc 00018721 /system/lib/libc.so (__start_thread+8)
 

kogone

Senior Member
Nov 9, 2014
121
28
Islamorada
Google Pixel 3 XL
This is from the BoardConfig of angler (nexus 6p)

Code:
TARGET_ARCH := arm64
TARGET_ARCH_VARIANT := armv8-a
TARGET_CPU_ABI := arm64-v8a
TARGET_CPU_ABI2 :=
TARGET_CPU_VARIANT := cortex-a53

TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv7-a-neon
TARGET_2ND_CPU_ABI := armeabi-v7a
TARGET_2ND_CPU_ABI2 := armeabi
TARGET_2ND_CPU_VARIANT := cortex-a7

when i watch the rom being built with htop, i notice that the arm toolchains are being used at times.

however, when i build the kernel from source (not through mka bootimg), it's only necessary to export the location of an aarch64 kernel toolchain.

can someone explain this?
 

faizauthar12

Recognized Dev / Inactive Recognized Contributor
Jan 26, 2014
1,907
2,731
Jakarta
Lenovo ZUK Z2 (Plus)
OnePlus 7T
This is from the BoardConfig of angler (nexus 6p)



when i watch the rom being built with htop, i notice that the arm toolchains are being used at times.

however, when i build the kernel from source (not through mka bootimg), it's only necessary to export the location of an aarch64 kernel toolchain.

can someone explain this?
This is my opinion
Even you're 64 bit
You also need to make 32 bit stuff ...
That's why arm toolchain will be used for 32 bit libs / files
 

bigsupersquid

Senior Member
Sep 22, 2010
2,254
1,671
BFE, MO
Google Pixel 4a 5G
So neither of you have fixed this? @JustArchi - you have any thoughts here? I even got medieval and put -g in the cflags in that file and the main BT ones to try to fix.

Original flags changes were made in system/bt/core/Android.mk
so when i added vynikal's squashed commit he pieced together for mm from justarchi's repo to my cm13 build, using uber 5.3 toolchains, i got the evil com.android.bt has stopped, Bluetooth share had stopped etc.
adding -Os to system/bt/Android.mk CFLAGS didn't solve it but i tracked my issue to packages/apps/Bluetooth/jni, added -Os to that directory's Android.mk CFLAGS as well, and now I'm good on BT.
testing it out, i needed the -Os in both those places together to make it work.
just fyi, maybe it'll help you and or others too since i hadn't seen reference to doing anything with the packages/apps/Bluetooth on my searching.
patches, specifically:
Code:
packages/apps/Bluetooth
commit d58f68c6f364eedc8771de1204d9a45073df2f82
Author: bigsupersquid <scrubbed>
Date:   Sun Jul 10 20:49:52 2016 -0500

    -Os jni
    
    Change-Id: Iafb2af0773bc093633483403e6bda7680130cf43

diff --git a/jni/Android.mk b/jni/Android.mk
index 68ca6e7..d973978 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -33,6 +33,7 @@ LOCAL_SHARED_LIBRARIES := \
 LOCAL_MULTILIB := 32
 
 #LOCAL_CFLAGS += -O0 -g
+LOCAL_CFLAGS += -Os
 
 LOCAL_MODULE := libbluetooth_jni
 LOCAL_MODULE_TAGS := optional

system/bt
commit 604eeb7c5a84c0fc4e1ecdda368271bc122c2a51
Author: bigsupersquid <scrubbed>
Date:   Sun Jul 10 20:51:08 2016 -0500

    -Os
    
    Change-Id: I9e4440b575c0b269dbb291ba0b34834a2a686e5c

diff --git a/Android.mk b/Android.mk
index b398132..dfdb788 100644
--- a/Android.mk
+++ b/Android.mk
@@ -38,7 +38,8 @@ bdroid_CFLAGS += \
   -Wno-unused-parameter \
   -Wunused-but-set-variable \
   -UNDEBUG \
-  -DLOG_NDEBUG=1
+  -DLOG_NDEBUG=1 \
+  -Os
 
 include $(call all-subdir-makefiles)
 
Last edited:

PWn3R

Senior Member
Dec 10, 2010
905
985
Flagstaff
Nexus 7
Motorola Droid X
so when i added vynikal's squashed commit he pieced together for mm from justarchi's repo to my cm13 build, using uber 5.3 toolchains, i got the evil com.android.bt has stopped, Bluetooth share had stopped etc.
adding -Os to system/bt/Android.mk CFLAGS didn't solve it but i tracked my issue to packages/apps/Bluetooth/jni, added -Os to that directory's Android.mk CFLAGS as well, and now I'm good on BT.
testing it out, i needed the -Os in both those places together to make it work.
just fyi, maybe it'll help you and or others too since i hadn't seen reference to doing anything with the packages/apps/Bluetooth on my searching.
patches, specifically:
Code:
packages/apps/Bluetooth
commit d58f68c6f364eedc8771de1204d9a45073df2f82
Author: bigsupersquid <scrubbed>
Date:   Sun Jul 10 20:49:52 2016 -0500

    -Os jni
    
    Change-Id: Iafb2af0773bc093633483403e6bda7680130cf43

diff --git a/jni/Android.mk b/jni/Android.mk
index 68ca6e7..d973978 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -33,6 +33,7 @@ LOCAL_SHARED_LIBRARIES := \
 LOCAL_MULTILIB := 32
 
 #LOCAL_CFLAGS += -O0 -g
+LOCAL_CFLAGS += -Os
 
 LOCAL_MODULE := libbluetooth_jni
 LOCAL_MODULE_TAGS := optional

system/bt
commit 604eeb7c5a84c0fc4e1ecdda368271bc122c2a51
Author: bigsupersquid <scrubbed>
Date:   Sun Jul 10 20:51:08 2016 -0500

    -Os
    
    Change-Id: I9e4440b575c0b269dbb291ba0b34834a2a686e5c

diff --git a/Android.mk b/Android.mk
index b398132..dfdb788 100644
--- a/Android.mk
+++ b/Android.mk
@@ -38,7 +38,8 @@ bdroid_CFLAGS += \
   -Wno-unused-parameter \
   -Wunused-but-set-variable \
   -UNDEBUG \
-  -DLOG_NDEBUG=1
+  -DLOG_NDEBUG=1 \
+  -Os
 
 include $(call all-subdir-makefiles)

Thanks for the information - I had tried doing everything with the bdroid flags or whatever it is in the system/bt directory. That didn't work. I've got a build running with your flag change on it right now. If it works I owe you several internets as do the rest of the people having this issue!

---------- Post added at 10:40 PM ---------- Previous post was at 09:50 PM ----------

Confirmed. Thank you!!!!!!

Sent from my Nexus 6 using Tapatalk
 
  • Like
Reactions: bigsupersquid

sagarshah1729

Senior Member
May 14, 2014
131
351
23
Surat
Great script! :) Tried this myself but it didn't work unfortunately.

However, I've found out that if you copy the /data/misc/adb/adb_keys file from a working and authorized rom to your bootlooping rom zip and add some lines to the updater-script to make it install, adb works flawlessly afterwards. :good:

Was able to grab a log of my bootloop now.. Any opinions or ideas? :)

Code:
E/rmt_storage( 2039): Unable to change dir
E/rmt_storage( 2039): Failed in getting the physical address for shared mem
I/ServiceManager(  730): Waiting for service media.audio_policy...
W/AudioSystem(  730): AudioPolicyService not published, waiting...
I/ServiceManager(  730): Waiting for service media.audio_policy...
I/ServiceManager(  730): Waiting for service media.audio_policy...

EDIT: Just to clarify, "Waiting for service media.audio_policy..." is the problem.. I've tried removing rmt_storage binary, but the bootloop persisted. So Audio Policy is the reason.
Bro sorry for quoting your old post..I am getting the same error as you are getting while booting.. Took logcat and got the same Audio system error..Can you help me fixing it?
 

Mata99

Senior Member
Jun 23, 2014
236
68
I have this problem
Code:
matteo@matteo-SATELLITE-U920T ~/mako/build $ git remote add 32 -f git@github.com:Vynikal/android_build.git && git cherry pick 6af9a30f748153bf9bcab533dbaa7c964113aff2
Aggiornamento di 32
Da github.com:Vynikal/android_build
 * [nuovo branch]    caf/cm-12.0 -> 32/caf/cm-12.0
 * [nuovo branch]    caf/cm-12.1 -> 32/caf/cm-12.1
 * [nuovo branch]    cm-10.1    -> 32/cm-10.1
 * [nuovo branch]    cm-10.2    -> 32/cm-10.2
 * [nuovo branch]    cm-11.0    -> 32/cm-11.0
 * [nuovo branch]    cm-12.0    -> 32/cm-12.0
 * [nuovo branch]    cm-12.1    -> 32/cm-12.1
 * [nuovo branch]    cm-13-flags -> 32/cm-13-flags
 * [nuovo branch]    cm-13.0    -> 32/cm-13.0
 * [nuovo branch]    cm-9.0.0   -> 32/cm-9.0.0
 * [nuovo branch]    cm-9.1.0   -> 32/cm-9.1.0
 * [nuovo branch]    donut      -> 32/donut
 * [nuovo branch]    eclair     -> 32/eclair
 * [nuovo branch]    froyo      -> 32/froyo
 * [nuovo branch]    froyo-stable -> 32/froyo-stable
 * [nuovo branch]    gb-release-7.2 -> 32/gb-release-7.2
 * [nuovo branch]    gingerbread -> 32/gingerbread
 * [nuovo branch]    gingerbread-release -> 32/gingerbread-release
 * [nuovo branch]    ics        -> 32/ics
 * [nuovo branch]    ics-release -> 32/ics-release
 * [nuovo branch]    jellybean  -> 32/jellybean
 * [nuovo branch]    jellybean-release -> 32/jellybean-release
 * [nuovo branch]    jellybean-stable -> 32/jellybean-stable
 * [nuovo branch]    mr1.1-staging -> 32/mr1.1-staging
 * [nuovo branch]    qcril      -> 32/qcril
 * [nuovo branch]    shipping/cm-11.0 -> 32/shipping/cm-11.0
 * [nuovo branch]    stable/cm-10.2 -> 32/stable/cm-10.2
 * [nuovo branch]    stable/cm-11.0 -> 32/stable/cm-11.0
 * [nuovo branch]    stable/cm-11.0-XNF8Y -> 32/stable/cm-11.0-XNF8Y
 * [nuovo branch]    stable/cm-11.0-XNF9X -> 32/stable/cm-11.0-XNF9X
 * [nuovo branch]    stable/cm-11.0-XNG2S -> 32/stable/cm-11.0-XNG2S
 * [nuovo branch]    stable/cm-11.0-XNG3C -> 32/stable/cm-11.0-XNG3C
 * [nuovo branch]    stable/cm-12.0-YNG1T -> 32/stable/cm-12.0-YNG1T
 * [nuovo branch]    stable/cm-12.0-YNG1TA -> 32/stable/cm-12.0-YNG1TA
 * [nuovo branch]    stable/cm-12.0-YNG3C -> 32/stable/cm-12.0-YNG3C
 * [nuovo branch]    stable/cm-12.0-YNG4N -> 32/stable/cm-12.0-YNG4N
 * [nuovo branch]    stable/cm-12.1-YOG3C -> 32/stable/cm-12.1-YOG3C
 * [nuovo branch]    stable/cm-12.1-YOG4P -> 32/stable/cm-12.1-YOG4P
 * [nuovo branch]    stable/cm-12.1-YOG7D -> 32/stable/cm-12.1-YOG7D
 * [nuovo branch]    stable/cm-13.0-ZNH0E -> 32/stable/cm-13.0-ZNH0E
 * [nuovo branch]    staging/caf/themes/cm-12.0 -> 32/staging/caf/themes/cm-12.0
 * [nuovo branch]    staging/cm-12.0-caf -> 32/staging/cm-12.0-caf
 * [nuovo branch]    staging/cm-12.1 -> 32/staging/cm-12.1
fatal: Commit pick sconosciuto
 
  • Like
Reactions: benmater

HaoZeke

Senior Member
Aug 16, 2009
860
655
Kanpur
rgoswami.me
Redmi Note 10 Pro
Hey any idea about this? Using Uber 4.9 for both toolchain and kernel. No other funny business. honami, cm-12.1

art/compiler/dex/quick/dex_file_method_inliner.cc: In member function 'bool art::DexFileMethodInliner::GenIntrinsic(art::Mir2Lir*, art::CallInfo*)':
art/compiler/dex/quick/dex_file_method_inliner.cc:508:1: error: insn does not satisfy its constraints:
}
^
(insn 2244 1443 1444 107 (parallel [
(set (reg:DI 3 r3 [539])
(lshiftrt:DI (reg:DI 2 r2 [orig:186 D.340824 ] [186])
(const_int 1 [0x1])))
(clobber (reg:CC 100 cc))
]) art/compiler/dex/quick/dex_file_method_inliner.cc:496 132 {arm_lshrdi3_1bit}
(expr_list:REG_UNUSED (reg:CC 100 cc)
(expr_list:REG_UNUSED (reg:SI 4 r4)
(nil))))
art/compiler/dex/quick/dex_file_method_inliner.cc:508:1: internal compiler error: in build_def_use, at regrename.c:1573
0x8119ea _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
../.././../gcc/gcc-UBER/gcc/rtl-error.c:109
0x811a11 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
../.././../gcc/gcc-UBER/gcc/rtl-error.c:120
0x7f0102 build_def_use
../.././../gcc/gcc-UBER/gcc/regrename.c:1573
0x7f0102 regrename_analyze(bitmap_head*)
../.././../gcc/gcc-UBER/gcc/regrename.c:715
0x7f0409 regrename_optimize
../.././../gcc/gcc-UBER/gcc/regrename.c:1830
0x7f0409 execute
../.././../gcc/gcc-UBER/gcc/regrename.c:1871
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
make: *** [build/core/binary.mk:619: /run/media/haozeke/Storage/AndBuild/cm-12.1/out/target/product/honami/obj/SHARED_LIBRARIES/libart-compiler_intermediates/dex/quick/dex_file_method_inliner.o] Error 1
make: *** Waiting for unfinished jobs....
 

HaoZeke

Senior Member
Aug 16, 2009
860
655
Kanpur
rgoswami.me
Redmi Note 10 Pro
So I disabled the flags in the archidroid.mk like so
ARCHIDROID_GCC_CFLAGS +=
# removed -fgraphite -fgraphite-identity
But, even after make clobber and ccache -C I got the same error... Help?
art/compiler/dex/quick/dex_file_method_inliner.cc: In member function 'bool art::DexFileMethodInliner::GenIntrinsic(art::Mir2Lir*, art::CallInfo*)':
art/compiler/dex/quick/dex_file_method_inliner.cc:508:1: error: insn does not satisfy its constraints:
}
^
(insn 2244 1443 1444 107 (parallel [
(set (reg:DI 3 r3 [539])
(lshiftrt:DI (reg:DI 2 r2 [orig:186 D.340824 ] [186])
(const_int 1 [0x1])))
(clobber (reg:CC 100 cc))
]) art/compiler/dex/quick/dex_file_method_inliner.cc:496 132 {arm_lshrdi3_1bit}
(expr_list:REG_UNUSED (reg:CC 100 cc)
(expr_list:REG_UNUSED (reg:SI 4 r4)
(nil))))
art/compiler/dex/quick/dex_file_method_inliner.cc:508:1: internal compiler error: in build_def_use, at regrename.c:1573
0x8119ea _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
../.././../gcc/gcc-UBER/gcc/rtl-error.c:109
0x811a11 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
../.././../gcc/gcc-UBER/gcc/rtl-error.c:120
0x7f0102 build_def_use
../.././../gcc/gcc-UBER/gcc/regrename.c:1573
0x7f0102 regrename_analyze(bitmap_head*)
../.././../gcc/gcc-UBER/gcc/regrename.c:715
0x7f0409 regrename_optimize
../.././../gcc/gcc-UBER/gcc/regrename.c:1830
0x7f0409 execute
../.././../gcc/gcc-UBER/gcc/regrename.c:1871
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
make: *** [build/core/binary.mk:619: /run/media/haozeke/Storage/AndBuild/cm-12.1/out/target/product/honami/obj/SHARED_LIBRARIES/libart-compiler_intermediates/dex/quick/dex_file_method_inliner.o] Error 1
 

Top Liked Posts

  • There are no posts matching your filters.
  • 695
    Hello dear developers.

    I'd like to share with you effect of nearly 300 hours spent on trying to optimize Android and push it to the limits.

    In general. You should be already experienced in setting up your buildbox, using git, building AOSP/CyanogenMod/OmniROM from source and cherry-picking things from review/gerrit. Solving git conflicts would also be nice. If you don't know how to build your own ROM from source, this is not a something you can apply to your ROM. Also, as you probably noticed, this is not a something you can apply to already prebuilt ROM (stocks), as these optimizations are applied during compilation, so only AOSP roms, self-compiled from source may use this masterpiece.

    So, what is it about? As we know, Android contains a bunch of low-level C/C++ code, which is compiled and acts as a backend for our java's frontend and android apps. Unfortunately, Google didn't put their best at focusing on optimization, so as a result we're using the same old flags set back in 2006 for Android Donut or anything which existed back then. As you guess, in 2006 we didn't have as powerful devices as now, we had to sacrifice performance for smaller code size, to fit to our little devices and run well on very low amount of memory. However, this is no longer a case, and by using newest compilers and properly setting flags, we can achieve something great.

    You probably may heard of some developers claiming using of "O3 Flags" in their ROMs. Well, while this may be true, they've applied only to low-level ARM code, mostly used during kernel compilation. Additionally it overwrites O2 flag, which is already fast, so as you may guess, this is more likely a placebo effect and disappears right after you change the kernel. Take a look at the most cherry-picked "O3 Flags commit". You see big "-Os" in "TARGET_thumb_CFLAGS"? This is what I'm talking about.

    However, the commit I'm about to present you is not a placebo effect, as it applies flags to everything what is compiled, and mostly important - target THUMB, about 90% of an Android.

    Now I'll tell you some facts. We have three interesting optimization levels. Os, O2, O3. O2 enables all optimizations that do not involve a space-speed tradeoff. Os is similar to O2, but it disables all flags that increase code size. It also performs further optimizations to reduce code size to the minimum. O3 enables all O2 optimizations and some extra optimizations that like to increase code size and may, or may not, increase performance. If you want to ask if there's something more like O4, there is - Ofast, however it breaks IEEE standard and doesn't work with Android, as i.e. sqlite3 is not compatible with Ofast's -ffast-math flag. So no go for us.

    Now here comes the fun part. Android by default is compiled with O2 flag for target ARM (about 10% of Android, mostly low-level parts) and Os flag for target THUMB (about 90% of Android, nearly everything apart from low-level parfts). Some guys think that Os is better than O2 or O3 because smaller code size is faster due to better fitting in cpu cache. Unfortunately, I proven that it is a myth. Os was good back in 2006, as only with this flag Google was able to compile Dalvik and it's virtual machine while keeping good amount of free memory and space on eMMC cards. As or now, we have plenty of space, plenty of ram, plenty of CPU power and still good old Os flag for 90% of Android.

    I've made countless tests to find out what is the most efficient in terms of GCC optimization, two selected tests I am about to present you right now.

    3j9IcCO.png

    As you may noticed, I compiled whetstone.c benchmark using three different optimization flags - Os, O2 and O3. I set CPU to performance, maximum frequency, and I repeated each test additional two times, just to make sure that Android doesn't lie to me. Source code of this test is available here and you may download it, compile for our beloved Android and try yourself. As you can see O3 > O2 >> Os, Os performs about 2.5x times worse than O2, and about 3.0x times worse than O3.

    But, of course. Android is not a freaking benchmark, it's operating system. We can't tell if things are getting better or worse according to a simple benchmark. I kept that in mind and provided community with JustArchi's Mysterious Builds for test. I gave both mysterious builds and didn't tell my users what is the mysterious change. Both builds have been compiled with the same toolchain, same version, same commits. The one and only mysterious change was the fact that every component compiled as target thumb (major portion of an android) has been optimized for speed (O3) in build #1 (experimental), and optimized for size (Os) in build #2 (normal behaviour). Check poll yourself, 9 votes on build 1 in terms of performance, and 1 vote on build 2. I decided that this and benchmark is enough to tell that O2/O3 for target thumb is something that we want.

    Now it doesn't matter that match if you wish to use O2 or O3, but here is some comparison:
    1. Kernel compiled with O2 has 4902 KB, with O3 4944 KB, so O3 is 42 KB bigger.
    2. ROM compiled with O3 is 3 MB larger than O2 after zip compression. Fast overview: 97 binaries in /system/bin and 2 binaries in /system/xbin + 283 libraries in /system/lib and other files, about 400 files in total. 3 MB / 400 = 7,5 KB per file size increase.
    3. It's unlikely that code working properly with O2 level might break on O3 level, most issues are on the Os <-> O2 part.
    4. If it doesn't cause any issues, and speeds up a binary by a little bit, why not use it?
    5. The only real reason to not use O3 is potential higher memory usage due to oversized binaries.

    In general, I doubt that this extra chunk of code may cause any significant memory usage or slower performance. I suggest to use O3 if it doesn't cause any issues to you compared to O2, but older devices may use O2 purely for saving on code size, similar way Google did it back in 2006 using Os flag.

    [SIZE="+1"]Now let's get down to business[/SIZE].

    Here is a list of important improvements:
    - Optimized for speed yet more all instructions - ARM and THUMB (-O3)
    - Optimized for speed also parts which are compiled with Clang (-O3)
    - Turned off all debugging code (lack of -g)
    - Eliminated redundant loads that come after stores to the same memory location, both partial and full redundancies (-fgcse-las)
    - Ran a store motion pass after global common subexpression elimination. This pass attempts to move stores out of loops (-fgcse-sm)
    - Enabled the identity transformation for graphite. For every SCoP we generate the polyhedral representation and transform it back to gimple. We can then check the costs or benefits of the GIMPLE -> GRAPHITE -> GIMPLE transformation. Some minimal optimizations are also performed by the code generator ISL, like index splitting and dead code elimination in loops (-fgraphite -fgraphite-identity)
    - Performed interprocedural pointer analysis and interprocedural modification and reference analysis (-fipa-pta)
    - Performed induction variable optimizations (strength reduction, induction variable merging and induction variable elimination) on trees (-fivopts)
    - Didn't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions (-fomit-frame-pointer)
    - Attempted to avoid false dependencies in scheduled code by making use of registers left over after register allocation. This optimization most benefits processors with lots of registers (-frename-registers)
    - Tried to reduce the number of symbolic address calculations by using shared “anchor” symbols to address nearby objects. This transformation can help to reduce the number of GOT entries and GOT accesses on some targets (-fsection-anchors)
    - Performed tail duplication to enlarge superblock size. This transformation simplifies the control flow of the function allowing other optimizations to do a better job (-ftracer)
    - Performed loop invariant motion on trees. It also moved operands of conditions that are invariant out of the loop, so that we can use just trivial invariantness analysis in loop unswitching. The pass also includes store motion (-ftree-loop-im)
    - Created a canonical counter for number of iterations in loops for which determining number of iterations requires complicated analysis. Later optimizations then may determine the number easily (-ftree-loop-ivcanon)
    - Assumed that loop indices do not overflow, and that loops with nontrivial exit condition are not infinite. This enables a wider range of loop optimizations even if the loop optimizer itself cannot prove that these assumptions are valid (-funsafe-loop-optimizations)
    - Moved branches with loop invariant conditions out of the loop (-funswitch-loops)
    - Constructed webs as commonly used for register allocation purposes and assigned each web individual pseudo register. This allows the register allocation pass to operate on pseudos directly, but also strengthens several other optimization passes, such as CSE, loop optimizer and trivial dead code remover (-fweb)
    - Sorted the common symbols by alignment in descending order. This is to prevent gaps between symbols due to alignment constraints (-Wl,--sort-common)

    Sound cool, doesn't it? Head over to my ArchiDroid project and see yourself how people react after switching to my ROM. Take a look at just one small example, or another one :). No bullsh*t guys, this is not a placebo.

    However, please read my commit carefully before you decide to cherry-pick it. You must understand that Google's flags weren't touched since 7 years and nobody can assure you that they will work properly for your ROM and your device. You may experiment with them a bit to find out if they're not causing conflicts or other issues.

    I can assure you that my ArchiDroid based on CM compiles fine with suggested steps written in the commit itself. Just don't forget to clean ccache (rm -rf /home/youruser/.ccache or rm -rf /root/.ccache) and make clean/clobber.

    You can use, modify and share my commit anyway you want, just please keep proper credits in changelogs and in the repo itself. If you feel generous, you may also buy me a coke for massive amount of hours put into those experiments.

    Now go ahead and show your users how things should be done :cool:.

    Cherry-picking time!

    Android "Lollipop" (5.1.1 & 5.0.2 tested)
    JustArchi's ArchiDroid Optimizations V4.1 for CyanogenMod (latest)

    A set of commits you may want to pick to fix O3-related issues:
    external_bluetooth_bluedroid | hardware_qcom_display | libcore | frameworks_av #1 | frameworks_av #2

    Older entries are provided for reference only. I suggest using only latest commit above.

    Android "Lollipop" (5.1.1 & 5.0.2 tested)
    JustArchi's ArchiDroid Optimizations V4 for CyanogenMod

    Android "Kitkat" 4.4.4:
    JustArchi's ArchiDroid Optimizations V3 for CyanogenMod
    JustArchi's ArchiDroid Optimizations V3 for OmniROM
    JustArchi's ArchiDroid Optimizations V2
    JustArchi's ArchiDroid Optimizations V1

    AFTER applying above commit and AFTER EVERY CHANGE regarding flags, ALWAYS make clean/clobber AND empty ccache (rm -rf ~/.ccache)


    Q: How to properly change toolchains used in local manifest?
    Open from your source rootdir .repo/local_manifests/roomservice.xml (or create one). Here is a sample manifest that replaces default 4.8 toolchain (both eabi and androideabi) with 4.8 SaberMod and 4.9 ArchiToolchain:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
    <remove-project name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" />
    <project name="ArchiDroid/Toolchain" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" remote="github" revision="architoolchain-5.2-arm-linux-gnueabihf" />
    <remove-project name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" />
    <project name="ArchiDroid/Toolchain" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" remote="github" revision="uber-4.9-arm-linux-androideabi" />
    </manifest>

    This is only an example, you should use the toolchains that suit you best. My ArchiDroid/Toolchain github repo is a good start to test various different toolchains and decide which one you like the most, or which one causes the least problems for you. I do not suggest any other magic tricks to include custom toolchains, putting your selected one in proper path is enough, avoid magic android_build modifications.


    [size=+1]Troubleshooting[/size]

    Q: Compiler errror:
    Code:
    (...)/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/../libexec/gcc/arm-linux-androideabi/4.8.x-sabermod/cc1: error while loading shared libraries: libcloog-isl.so.4: cannot open shared object file: No such file or directory

    This error can be fixed by installing missing library. libcloog-isl.so.4 is provided by libcloog-isl4 package, so on debian-like OSes, you should be able to fix it with:
    Code:
    apt-get install libcloog-isl4

    Q: Compiler errror:
    Code:
    (...)/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/../libexec/gcc/arm-linux-androideabi/4.8.x-sabermod/cc1: error while loading shared libraries: libisl.so.13: cannot open shared object file: No such file or directory

    This error is very similar to above, but considers other shared library. libisl.so.13 is provided by libisl13 package. Now the problem is that this package is in testing/sid, so we'll need to install it from there.

    Add to your /etc/apt/sources.list following entries:
    Code:
    deb http://ftp.debian.org/debian testing main contrib non-free
    deb-src http://ftp.debian.org/debian testing main contrib non-free

    Then apt-get update && apt-get install libisl13.


    Issues below are for older commits and should be used for reference only


    Kitkat THUMB O2+ errors?
    These are the most common issues.
    * Change -O3 flag from TARGET_thumb_CFLAGS back to -Os, make clean/clobber, empty ccache and try again. This fixes most of the issues.
    * RIL problems for for the Exynos 4210 family? Add -fno-tree-vectorize to TARGET_thumb_CFLAGS.
    * Broken exFAT -> https://github.com/JustArchi/android_external_fuse/commit/78ebbc4404de260862dca5f0454bffccee650e0d

    Errors caused by toolchain?
    1. Try Google's GCC 4.8 if you used Linaro 4.8 or SaberMod 4.8
    2. Fallback to Google's GCC 4.7 if above didn't help (change TARGET_GCC_VERSION back to 4.7)

    Errors caused by GCC 4.8+?
    * ART Fix (bootloop) -> https://github.com/JustArchi/android_art/commit/71a0ca3057cc3865bd8e41dcb94443998d028407
    * Not booting kernel -> https://github.com/JustArchi/androi...mmit/9262707f4ea471acf40baa43ffe4bfb3cff64de9 and https://github.com/JustArchi/androi...mmit/41a70abcdad746d9415f3ee40f90528feb0c9bdd

    Errors caused by GCC 4.9+?
    * Graphical glitches in PlayStore -> https://github.com/JustArchi/android_external_webp/commit/36c6201fbb108d6b757f860e2cd57f3982191662

    Errors caused by Linaro?
    * error: unknown CPU architecture -> https://github.com/JustArchi/androi...mmit/5e5e158a7c147725beae1eeb6785174baacecb03 (Keep in mind that this is a sample fix for smdk4412 kernel, you may need to use similar solution in your own case. Also, this error happens only with Linaro toolchain, doesn't happen with Google's GCC)

    Other errors?
    * error: undefined reference to 'memmove' -> https://github.com/XperiaSTE/androi...mmit/679a4e571ef77f47892a785e852d8219c1e6807a


    [size=+1]Credits[/size]
    @IAmTheOneTheyCallNeo - For inspiration and first steps
    @metalspring - For some nice commits
    @sparksco - For SaberMod, some nice commits and support for the optimization idea
    33
    Hello dear developers.

    I'd like to share with you effect of nearly 200 hours spent on trying to optimize Android and push it to the limits.

    In general. You should be already experienced in setting up your buildbox, using git, building AOSP/CyanogenMod/OmniROM from source and cherry-picking things from review/gerrit. If you don't know how to build your own ROM from source, this is not a something you can apply to your ROM. Also, as you probably noticed, this is not a something you can apply to every ROM, as these optimizations are applied during compilation, so only AOSP roms, self-compiled from source may use this masterpiece.

    So, what is it about? As we know, Android contains a bunch of low-level C/C++ code, which is compiled and acts as a backend for our java's frontend and android apps. Unfortunately, Google didn't put their best at focusing on optimization, so as a result we're using the same old flags set back in 2006 for Android Donut or anything which existed back then. As you guess, in 2006 we didn't have as powerful devices as now, we had to sacrifice performance for smaller code size, to fit to our little devices and run well on very low amount of memory. However, this is no longer a case, and by using newest compilers such as GCC 4.8 and properly setting flags, we can achieve something, which I call "Android in 2014".

    You probably may heard of some developers claiming using of "O3 Flags" in their ROMs. Well, while this may be true, they've applied only to low-level ARM code, mostly used during kernel compilation. Additionally it overwrites O2 flag, which is already fast, so as you may guess, this is more likely a placebo effect and disappears right after you change the kernel. Take a look at the most cherry-picked "O3 Flags commit". You see big "-Os" in "TARGET_thumb_CFLAGS"? This is what I'm talking about.

    However, the commit I'm about to present you is not a placebo effect, as it applies flags to everything what is compiled, and mostly important - target THUMB, about 90% of an Android.

    Now I'll tell you some facts. We have three interesting optimization levels. Os, O2, O3. O2 enables all optimizations that do not involve a space-speed tradeoff. Os is similar to O2, but it disables all flags that increase code size. It also performs further optimizations to reduce code size to the minimum. O3 enables all O2 optimizations and some extra optimizations that like to increase code size and may, or may not, increase performance. If you want to ask if there's something more like O4, there is - Ofast, however it breaks IEEE standard and doesn't work with Android, as i.e. sqlite3 is not compatible with Ofast's -ffast-math flag. So no go for us.

    Now here comes the fun part. Android by default is compiled with O2 flag for target ARM (about 10% of Android, mostly kernel) and Os flag for target THUMB (about 90% of Android, nearly everything apart from kernel). Some guys think that Os is better than O2 or O3 because smaller code size is faster due to bettering fitting in cpu cache. Unfortunately, I proven that it is a myth. Os was good back in 2006, as only with this flag Google was able to compile Dalvik and it's virtual machine while keeping good amount of free memory and space on eMMC cards. As or now, we have plenty of space, plenty of ram, plenty of CPU power and still good old Os flag for 90% of Android.

    Now you should ask - where is your proof?, here I have it for you:

    Screenshot_2014-03-07-23-54-52.png

    As you may noticed, I compiled whetstone.c benchmark using three different optimization flags - Os, O2 and O3. I repeated each test additional two times, just to make sure that Android doesn't lie to me. Source code of this test is available here and you may download it, compile for our beloved Android and try yourself. As you can see O3 > O2 >> Os, Os performs about 2.5x times worse than O2, and about 3.0x times worse than O3.

    But, of course. Android is not a freaking benchmark, it's operating system. We can't tell if things are getting better or worse according to a simple benchmark. I kept that in mind and provided community with JustArchi's Mysterious Builds for test. I gave both mysterious builds and didn't tell them what is the mysterious change. Both builds have been compiled with the same toolchain, same version, same commits. The one and only mysterious change was the fact that every component compiled as target thumb (major portion of an android) has been optimized for speed (O3) in build #1 (experimental), and optimized for size (Os) in build #2 (normal behaviour). Check poll yourself, 9 votes on build 1 in terms of performance, and 1 vote on build 2. I decided that this and benchmark is enough to tell that O2/O3 for target thumb is something that we want.

    Now the battle is, O2 or O3? This is tough choice, here are some facts:
    1. Kernel compiled with O2 has 4902 KB, with O3 4944 KB, so O3 is 42 KB bigger.
    2. ROM compiled with O3 is 3 MB larger than O2 after zip compression. Fast overview: 97 binaries in /system/bin and 2 binaries in /system/xbin + 283 libraries in /system/lib and other files, about 400 files in total. 3 MB / 400 = 7,5 KB per file size increase.
    3. No issues

    In general, I doubt that this extra chunk of code may cause any significant memory usage or slower performance. I suggest to use O3 if it doesn't cause any issues to you compared to O2, but older devices may use O2 purely for saving on code size, similar way Google did it back in 2006 using Os flag.

    [SIZE="+1"]Now let's get down to bussiness[/SIZE].
    Here is a link to the commit -> https://github.com/JustArchi/android_build/commit/8e1b82c082a8de9160e6c0fc3ded37b591c3e517

    And here is a list of important improvements:


    Looks badass? It is badass. Head over to my ArchiDroid 2.X project and see yourself how people react after switching to my ROM. Take a look at just one small example, or another one :). No bullsh*t guys, this is future.

    However, please read my commit carefully before you decide to cherry-pick it. You must understand that Google's flags weren't touched since 7 years and nobody can assure you that they will work properly for your ROM and your device. You may experiment with them a bit to find out if they're not causing conflicts or other issues.

    I can assure you that my OmniROM build compiles fine with some fixes mentioned in the commit itself. Just don't forget to clean ccache (rm -rf /home/youruser/.ccache or rm -rf /root/.ccache) and make clean/clobber.

    You can use, modify and share my commit anyway you want, just please keep proper credits in changelogs and in the repo itself. If you feel generous, you may also buy me a coke for massive amount of hours put into those experiments.

    Now go ahead and show your users how things should be done :cool:.

    I do agree that the most cherry-picked commit you linked is terrible, and while this is some nice work you've done, it's misleading and not entirely true.

    Android is NOT 90% thumb. I'd give it a maximum of 50%, and that's being extremely generous. On Linaro's website I recall reading about potential future experiments for them, and one of them was to see what else could be improved by using thumb. If Android is already 90% thumb, that'd be a useless task and you might as well compile everything as thumb, and looking at my build logs there's plenty more things compiled as ARM than there are thumb.
    I agree that the people saying usage of -Os is good are way out of date and stuck in the past. With older ARM chips it was a good idea, but anything Cortex-A9 (if not Cortex-A8) and newer is plenty good enough for at least -O2.

    The kernel's compiler flags are all defined in the kernel itself. None of the flags in the build section of Android end up in the kernel.

    There are a number of "changes" you've made which actually didn't do anything:
    1. -DNDEBUG was already defined in TARGET_RELEASE_CFLAGS, which if I remember correctly is just all appended or prepended (doesn't matter which it is in this case) to your usual TARGET_arm_CFLAGS and TARGET_thumb_CFLAGS, so debugging code was already disabled.
    2. The -fgcse-after-reload and -funswitch-loops flags are already enabled by using -O3, so it is not necessary nor helpful to add it by hand.
    3. The -frename-registers flag was already enabled in TARGET_RELEASE_CFLAGS, as was -fomit-frame-pointer, so again these additions have no effect or change.
    4. The -frerun-cse-after-loop is already enabled by using -O3 and it's even enabled at as low as -Os, so this is unnecessary as well and even in the unmodified build flags would already be there.

    There is a flag which you've stated is broken, but actually works just fine and can be extremely beneficial: -flto (Link-Time Optimization).
    I've been using LTO for at least 5 months now.
    You're also missing out on using C++11, this allows for some extra optimizations as well.

    There is a change you've made which is EXTREMELY DANGEROUS and could result in crashes or maybe even worse:
    You've used the "-Wno-error=strict-aliasing" flag. strict-aliasing is a fatal error by default for a reason!! You should definitely give this a read: http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html
    Fixing those violations is extremely time-consuming, and resulted in me having to fork over 30 git repos to do so, but if I didn't do that I could end up being responsible for the loss of data on a thousand or more devices. I don't want something like that on my conscious.


    Now, I've never been one to try and advertise my work or say my work is better than other people's, but I've been hearing about stuff like this for a long time now and I'm getting sick and tired of it.
    My GitHub: https://github.com/MWisBest/
    My ROM's thread: http://xdaforums.com/galaxy-nexus/verizon-develop/rom-fml-fork-life-01-09-2014-t2427087/
    If you take a look at my thread you'll see I'm extremely humble. Heck, if somebody posts that they've moved on to/liked a different ROM better, I'm actually happy that they've found something they like! All I hope for is that people find a ROM they like. If it's mine, great! If it's not, that's just dandy too! I don't boast about the amount of users my ROM has, I don't brag about (let alone bring up) being the first person to get a KitKat ROM on the VZW Galaxy Nexus, etc. I'm not in this for fame and internet points. My expectation when I released my ROM was for it to just fall back page by page and have just a few users.
    I don't know how long you've been working on this stuff, but I've been working on it for 9 months and I'm constantly refining and improving it. I don't claim to be an expert at it, but compared to the people that get attention for similar work I'd say what I've done is better. To put what I've just said into perspective: That is the only time I've ever said anything I've done is better than somebody else here.

    I've been sitting here debating whether or not to press the "Submit Reply" button, in the end I decided that the risks of people using the work posted here outweigh any potential negative outcome from me submitting this post.
    18
    Bravo! I see flags in here that I am yet to try. Thanks for all your work and dedication to this effort.
    Going to do a comparison this week against my "neofy" initiative :)

    Thanks!

    -Neo
    Forum Moderator
    18
    I'm working on CM12 for my beloved i9300, it's in alpha stage, but it works correctly in terms of Android, so I think that I'll start working on V4 for Lollipop soon. But it will take a few weeks more, I need to be sure that there are no upstream bugs before starting to... generate them :).
    18
    Just because some of you are wondering.

    Yes, I'm testing how M works with my optimizations, with UBERTC toolchains, and testing which newly introduced or previously disabled (for compatibility reasons) flags may work again. If you need simple copy-pasta that should work properly, you can find it here and don't forget to click thanks. In the meantime I'm working on V5 for M, which will come at some point, when I test that everything works for at least 2, preferably 3 of my devices, including ARM64 one - OnePlus 2, which is now my main device.

    As I said many times, it's kind of long process, because every flag has to be carefully tested, and because it's being applied globally - also with caution. Full builds take time, tests as well. This commit is already "too device-based", and may require additional fixes for you, so the point now is to require as few as possible, while being compatible with as many as possible devices out of the box.

    So yeah, it will come out, eventually.