Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1166,6 +1166,13 @@ def mgeneral_regs_only : Flag<["-"], "mgeneral-regs-only">, Group, HelpText<"Generate code which only uses the general purpose registers (AArch64 only)">; +def mfix_cortex_a53_835769 : Flag<["-"], "mfix-cortex-a53-835769">, + Group, + HelpText<"Workaround Cortex-A53 erratum 835769 (AArch64 only)">; +def mno_fix_cortex_a53_835769 : Flag<["-"], "mno-fix-cortex-a53-835769">, + Group, + HelpText<"Don't workaround Cortex-A53 erratum 835769 (AArch64 only)">; + def mvsx : Flag<["-"], "mvsx">, Group; def mno_vsx : Flag<["-"], "mno-vsx">, Group; def mfprnd : Flag<["-"], "mfprnd">, Group; Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -913,6 +913,15 @@ CmdArgs.push_back("-aarch64-no-strict-align"); } + if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769, + options::OPT_mno_fix_cortex_a53_835769)) { + CmdArgs.push_back("-backend-option"); + if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769)) + CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1"); + else + CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0"); + } + // Setting -mno-global-merge disables the codegen global merge pass. Setting // -mglobal-merge has no effect as the pass is enabled by default. if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, Index: test/Driver/aarch64-fix-cortex-a53-835769-cg.c =================================================================== --- /dev/null +++ test/Driver/aarch64-fix-cortex-a53-835769-cg.c @@ -0,0 +1,19 @@ +// REQUIRES: aarch64-registered-target +// RUN: %clang -O3 -target aarch64-linux-eabi %s -S -o- \ +// RUN: | FileCheck --check-prefix=CHECK-NO --check-prefix=CHECK %s +// RUN: %clang -O3 -target aarch64-linux-eabi -mfix-cortex-a53-835769 %s -S -o- 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-YES --check-prefix=CHECK %s +// RUN: %clang -O3 -target aarch64-linux-eabi -mno-fix-cortex-a53-835769 %s -S -o- 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO --check-prefix=CHECK %s + +#include + +int64_t f_load_madd_64(int64_t a, int64_t b, int64_t *c) { + int64_t result = a+b*(*c); + return result; +} + +// CHECK: ldr +// CHECK-YES-NEXT: nop +// CHECK-NO-NEXT-NOT: nop +// CHECK-NEXT: madd Index: test/Driver/aarch64-fix-cortex-a53-835769.c =================================================================== --- /dev/null +++ test/Driver/aarch64-fix-cortex-a53-835769.c @@ -0,0 +1,9 @@ +// RUN: %clang -target aarch64-linux-eabi %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-DEF %s +// RUN: %clang -target aarch64-linux-eabi -mfix-cortex-a53-835769 %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-YES %s +// RUN: %clang -target aarch64-linux-eabi -mno-fix-cortex-a53-835769 %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO %s +// CHECK-DEF-NOT: "-backend-option" "-aarch64-fix-cortex-a53-835769" +// CHECK-YES: "-backend-option" "-aarch64-fix-cortex-a53-835769=1" +// CHECK-NO: "-backend-option" "-aarch64-fix-cortex-a53-835769=0"