Merge "Update STANDALONE-TOOLCHAIN.html for issue 39089."
diff --git a/tests/build/issue22336-ICE-emit-rtl/jni/Android.mk b/tests/build/issue22336-ICE-emit-rtl/jni/Android.mk
new file mode 100644
index 0000000..ec269d3
--- /dev/null
+++ b/tests/build/issue22336-ICE-emit-rtl/jni/Android.mk
@@ -0,0 +1,9 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := issue22336-ICE-emit-rtl
+LOCAL_ARM_NEON := true
+LOCAL_CFLAGS += -O0
+LOCAL_SRC_FILES := issue22336-ICE-emit-rtl.cpp
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/build/issue22336-ICE-emit-rtl/jni/Application.mk b/tests/build/issue22336-ICE-emit-rtl/jni/Application.mk
new file mode 100644
index 0000000..850a82e
--- /dev/null
+++ b/tests/build/issue22336-ICE-emit-rtl/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := armeabi-v7a
diff --git a/tests/build/issue22336-ICE-emit-rtl/jni/issue22336-ICE-emit-rtl.cpp b/tests/build/issue22336-ICE-emit-rtl/jni/issue22336-ICE-emit-rtl.cpp
new file mode 100644
index 0000000..c3033c1
--- /dev/null
+++ b/tests/build/issue22336-ICE-emit-rtl/jni/issue22336-ICE-emit-rtl.cpp
@@ -0,0 +1,32 @@
+#include <arm_neon.h>
+
+struct Matrix43 {
+    float32x4_t row0;
+    float32x4_t row1;
+    float32x4_t row2;
+    float32x4_t row3;
+};
+
+__attribute__((always_inline)) inline Matrix43 operator*(const Matrix43& m1, const Matrix43& m2) {
+    Matrix43 rr;
+    rr.row0 = vmulq_n_f32(         m2.row0, vgetq_lane_f32(m1.row0, 0));
+    rr.row0 = vmlaq_n_f32(rr.row0, m2.row1, vgetq_lane_f32(m1.row0, 1));
+    rr.row0 = vmlaq_n_f32(rr.row0, m2.row2, vgetq_lane_f32(m1.row0, 2));
+
+    rr.row1 = vmulq_n_f32(         m2.row0, vgetq_lane_f32(m1.row1, 0));
+    rr.row1 = vmlaq_n_f32(rr.row1, m2.row1, vgetq_lane_f32(m1.row1, 1));
+    rr.row1 = vmlaq_n_f32(rr.row1, m2.row2, vgetq_lane_f32(m1.row1, 2));
+
+    rr.row2 = vmulq_n_f32(         m2.row0, vgetq_lane_f32(m1.row2, 0));
+    rr.row2 = vmlaq_n_f32(rr.row2, m2.row1, vgetq_lane_f32(m1.row2, 1));
+    rr.row2 = vmlaq_n_f32(rr.row2, m2.row2, vgetq_lane_f32(m1.row2, 2));
+
+    rr.row3 = vmlaq_n_f32(m2.row3, m2.row0, vgetq_lane_f32(m1.row3, 0));
+    rr.row3 = vmlaq_n_f32(rr.row3, m2.row1, vgetq_lane_f32(m1.row3, 1));
+    rr.row3 = vmlaq_n_f32(rr.row3, m2.row2, vgetq_lane_f32(m1.row3, 2));
+    return rr;
+}
+
+void _f_with_internal_compiler_error(const Matrix43& m, const void* a1, const void* a2) {
+    m * m * m;
+}
diff --git a/tests/build/issue22345-ICE-postreload/jni/Android.mk b/tests/build/issue22345-ICE-postreload/jni/Android.mk
new file mode 100644
index 0000000..29001fb
--- /dev/null
+++ b/tests/build/issue22345-ICE-postreload/jni/Android.mk
@@ -0,0 +1,8 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := issue22345-ICE-postreload
+LOCAL_ARM_NEON := true
+LOCAL_SRC_FILES := issue22345-ICE-postreload.cpp
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/build/issue22345-ICE-postreload/jni/Application.mk b/tests/build/issue22345-ICE-postreload/jni/Application.mk
new file mode 100644
index 0000000..850a82e
--- /dev/null
+++ b/tests/build/issue22345-ICE-postreload/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := armeabi-v7a
diff --git a/tests/build/issue22345-ICE-postreload/jni/issue22345-ICE-postreload.cpp b/tests/build/issue22345-ICE-postreload/jni/issue22345-ICE-postreload.cpp
new file mode 100644
index 0000000..537d9a8
--- /dev/null
+++ b/tests/build/issue22345-ICE-postreload/jni/issue22345-ICE-postreload.cpp
@@ -0,0 +1,50 @@
+#include <arm_neon.h>
+
+namespace math {
+    namespace internal {
+#define _IOS_SHUFFLE_1032(vec) vrev64q_f32(vec)
+#define _IOS_SHUFFLE_2301(vec) vcombine_f32(vget_high_f32(vec), vget_low_f32(vec))
+        inline float32x4_t dot4VecResult(const float32x4_t& vec1, const float32x4_t& vec2) {
+            float32x4_t result = vmulq_f32(vec1, vec2);
+            result = vaddq_f32(result, _IOS_SHUFFLE_1032(result));
+            result = vaddq_f32(result, _IOS_SHUFFLE_2301(result));
+            return result;
+        }
+
+        inline float32x4_t fastRSqrt(const float32x4_t& vec) {
+            float32x4_t result;
+            result = vrsqrteq_f32(vec);
+            result = vmulq_f32(vrsqrtsq_f32(vmulq_f32(result, result), vec), result);
+            return result;
+        }
+
+    }
+    typedef float32x4_t Vector3;
+
+    inline Vector3 normalize(const Vector3& v1) {
+        float32x4_t dot;
+        dot = vsetq_lane_f32(0.0f, v1, 3);
+        dot = internal::dot4VecResult(dot, dot);
+
+        if (vgetq_lane_f32(dot, 0) == 0.0f) {
+            return v1;
+        } else {
+            Vector3 result;
+            result = vmulq_f32(v1, internal::fastRSqrt(dot));
+            return result;
+        }
+    }
+
+    inline Vector3 cross(const Vector3& v1, const Vector3& v2) {
+        float32x4x2_t v_1203 = vzipq_f32(vcombine_f32(vrev64_f32(vget_low_f32(v1)), vrev64_f32(vget_low_f32(v2))), vcombine_f32(vget_high_f32(v1), vget_high_f32(v2)));
+        float32x4x2_t v_2013 = vzipq_f32(vcombine_f32(vrev64_f32(vget_low_f32(v_1203.val[0])), vrev64_f32(vget_low_f32(v_1203.val[1]))), vcombine_f32(vget_high_f32(v_1203.val[0]), vget_high_f32(v_1203.val[1])));
+
+        Vector3 result;
+        result = vmlsq_f32(vmulq_f32(v_1203.val[0], v_2013.val[1]), v_1203.val[1], v_2013.val[0]);
+        return result;
+    }
+}
+
+void _f_with_internal_compiler_error_in_reload_cse_simplify_operands(const math::Vector3& v1, const math::Vector3& v2) {
+    math::normalize(math::cross(v1, v2));
+}