diff --git a/.gitignore b/.gitignore index 23e1e70..fbc7d33 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ /gcc-8.2.1-20181215.tar.xz /gcc-8.2.1-20190109.tar.xz /gcc-9.0.0-20190119.tar.xz +/gcc-9.0.0-20190121.tar.xz diff --git a/gcc.spec b/gcc.spec index 6636a18..8b3e080 100644 --- a/gcc.spec +++ b/gcc.spec @@ -1,10 +1,10 @@ -%global DATE 20190119 -%global SVNREV 268094 +%global DATE 20190121 +%global SVNREV 268128 %global gcc_version 9.0.0 %global gcc_major 9 # Note, gcc_release must be integer, if you want to add suffixes to # %%{release}, append them after %%{gcc_release} on Release: line. -%global gcc_release 0.3 +%global gcc_release 0.4 %global nvptx_tools_gitrev c28050f60193b3b95a18866a96f03334e874e78f %global nvptx_newlib_gitrev aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24 %global _unpackaged_files_terminate_build 0 @@ -258,11 +258,12 @@ Patch9: gcc9-Wno-format-security.patch Patch10: gcc9-rh1574936.patch Patch11: gcc9-d-shared-libphobos.patch Patch12: gcc9-pr88714.patch -Patch13: gcc9-pr88901.patch -Patch14: gcc9-pr88044.patch -Patch15: gcc9-utf-array-test.patch -Patch16: gcc9-aarch64-bootstrap.patch -Patch17: gcc9-pr88927.patch +Patch13: gcc9-pr88044.patch +Patch14: gcc9-pr88927.patch +Patch15: gcc9-pr87064.patch +Patch16: gcc9-pr88904.patch +Patch17: gcc9-pr88905.patch +Patch18: gcc9-pr88906.patch Patch1000: nvptx-tools-no-ptxas.patch Patch1001: nvptx-tools-build.patch @@ -842,11 +843,12 @@ to NVidia PTX capable devices if available. %endif %patch11 -p0 -b .d-shared-libphobos~ %patch12 -p0 -b .pr88714~ -%patch13 -p0 -b .pr88901~ -%patch14 -p0 -b .pr88044~ -%patch15 -p0 -b .utf-array-test~ -%patch16 -p0 -b .aarch64-bootstrap~ -%patch17 -p0 -b .pr88927~ +%patch13 -p0 -b .pr88044~ +%patch14 -p0 -b .pr88927~ +%patch15 -p0 -b .pr87064~ +%patch16 -p0 -b .pr88904~ +%patch17 -p0 -b .pr88905~ +%patch18 -p0 -b .pr88906~ cd nvptx-tools-%{nvptx_tools_gitrev} %patch1000 -p1 -b .nvptx-tools-no-ptxas~ @@ -3180,6 +3182,17 @@ fi %endif %changelog +* Mon Jan 21 2019 Jakub Jelinek 9.0.0-0.4 +- update from trunk + - PRs c++/88949, c/88928, fortran/37835, fortran/56789, fortran/77960, + ipa/87615, libstdc++/86590, target/71659, target/88938, + tree-optimization/88934 +- fix up min/max reduction on ppc64le (PR target/87064) +- fix up thread_jump on thumb1 (PR rtl-optimization/88904) +- fix up doubleword unop REG_EQUAL notes with const args (PR target/88905) +- fix up DSE on memcpy/memmove/memcmp libcalls (PR rtl-optimization/49429, + PR target/49454, PR rtl-optimization/86334, PR target/88906) + * Sat Jan 19 2019 Jakub Jelinek 9.0.0-0.3 - update from trunk - PRs c++/86205, c++/86740, c++/86926, c++/88699, c++/88875, c/88664, diff --git a/gcc9-aarch64-bootstrap.patch b/gcc9-aarch64-bootstrap.patch deleted file mode 100644 index db52f38..0000000 --- a/gcc9-aarch64-bootstrap.patch +++ /dev/null @@ -1,47 +0,0 @@ -2019-01-19 Jakub Jelinek - - * config/aarch64/aarch64.c (aarch64_stack_protect_guard): Move - outside of #if CHECKING_P code. - ---- gcc/config/aarch64/aarch64.c.jj 2019-01-19 09:39:18.859831024 +0100 -+++ gcc/config/aarch64/aarch64.c 2019-01-19 18:25:18.037239167 +0100 -@@ -18662,6 +18662,19 @@ aarch64_simd_clone_usable (struct cgraph - } - } - -+/* Implement TARGET_STACK_PROTECT_GUARD. In case of a -+ global variable based guard use the default else -+ return a null tree. */ -+static tree -+aarch64_stack_protect_guard (void) -+{ -+ if (aarch64_stack_protector_guard == SSP_GLOBAL) -+ return default_stack_protect_guard (); -+ -+ return NULL_TREE; -+} -+ -+ - /* Target-specific selftests. */ - - #if CHECKING_P -@@ -18706,19 +18719,6 @@ aarch64_run_selftests (void) - - } // namespace selftest - --/* Implement TARGET_STACK_PROTECT_GUARD. In case of a -- global variable based guard use the default else -- return a null tree. */ --static tree --aarch64_stack_protect_guard (void) --{ -- if (aarch64_stack_protector_guard == SSP_GLOBAL) -- return default_stack_protect_guard (); -- -- return NULL_TREE; --} -- -- - #endif /* #if CHECKING_P */ - - #undef TARGET_STACK_PROTECT_GUARD diff --git a/gcc9-pr87064.patch b/gcc9-pr87064.patch new file mode 100644 index 0000000..ba1889a --- /dev/null +++ b/gcc9-pr87064.patch @@ -0,0 +1,17 @@ +2019-01-21 Jakub Jelinek + + PR target/87064 + * config/rs6000/vsx.md (*vsx_reduc__v2df_scalar): + Disable for little endian. + +--- gcc/config/rs6000/vsx.md.jj 2019-01-19 09:39:13.224924063 +0100 ++++ gcc/config/rs6000/vsx.md 2019-01-21 23:39:27.527774247 +0100 +@@ -4351,7 +4351,7 @@ (define_insn_and_split "*vsx_reduc_ - - PR sanitizer/88901 - * typeck.c (cp_build_binary_op): Don't instrument - SANITIZE_POINTER_COMPARE if processing_template_decl. - (pointer_diff): Similarly for SANITIZE_POINTER_SUBTRACT. - - * g++.dg/asan/pr88901.C: New test. - ---- gcc/cp/typeck.c.jj 2019-01-18 09:13:58.580790058 +0100 -+++ gcc/cp/typeck.c 2019-01-18 11:53:45.941734135 +0100 -@@ -5233,6 +5233,7 @@ cp_build_binary_op (const op_location_t - } - - if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE) -+ && !processing_template_decl - && sanitize_flags_p (SANITIZE_POINTER_COMPARE)) - { - op0 = save_expr (op0); -@@ -5650,7 +5651,8 @@ pointer_diff (location_t loc, tree op0, - else - inttype = restype; - -- if (sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) -+ if (!processing_template_decl -+ && sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) - { - op0 = save_expr (op0); - op1 = save_expr (op1); ---- gcc/testsuite/g++.dg/asan/pr88901.C.jj 2019-01-18 11:55:42.398826983 +0100 -+++ gcc/testsuite/g++.dg/asan/pr88901.C 2019-01-18 11:55:26.559086374 +0100 -@@ -0,0 +1,13 @@ -+// PR sanitizer/88901 -+// { dg-do compile } -+// { dg-options "-fsanitize=address -fsanitize=pointer-compare" } -+ -+template -+struct A { -+ void foo() { -+ auto d = [](char *x, char *y) { -+ for (char *p = x; p + sizeof(T) <= y; p += sizeof(T)) -+ reinterpret_cast(p)->~T(); -+ }; -+ } -+}; diff --git a/gcc9-pr88904.patch b/gcc9-pr88904.patch new file mode 100644 index 0000000..a15ced2 --- /dev/null +++ b/gcc9-pr88904.patch @@ -0,0 +1,77 @@ +2019-01-21 Jakub Jelinek + + PR rtl-optimization/88904 + * cfgcleanup.c (thread_jump): Verify cond2 doesn't mention + any nonequal registers before processing BB_END (b). + + * gcc.c-torture/execute/pr88904.c: New test. + +--- gcc/cfgcleanup.c.jj 2019-01-01 12:37:19.147942300 +0100 ++++ gcc/cfgcleanup.c 2019-01-21 16:45:52.576636305 +0100 +@@ -338,6 +338,13 @@ thread_jump (edge e, basic_block b) + insn != NEXT_INSN (BB_END (b)) && !failed; + insn = NEXT_INSN (insn)) + { ++ /* cond2 must not mention any register that is not equal to the ++ former block. Check this before processing that instruction, ++ as BB_END (b) could contain also clobbers. */ ++ if (insn == BB_END (b) ++ && mentions_nonequal_regs (cond2, nonequal)) ++ goto failed_exit; ++ + if (INSN_P (insn)) + { + rtx pat = PATTERN (insn); +@@ -362,11 +369,6 @@ thread_jump (edge e, basic_block b) + goto failed_exit; + } + +- /* cond2 must not mention any register that is not equal to the +- former block. */ +- if (mentions_nonequal_regs (cond2, nonequal)) +- goto failed_exit; +- + EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi) + goto failed_exit; + +--- gcc/testsuite/gcc.c-torture/execute/pr88904.c.jj 2019-01-21 16:47:16.194265770 +0100 ++++ gcc/testsuite/gcc.c-torture/execute/pr88904.c 2019-01-21 16:46:59.278543027 +0100 +@@ -0,0 +1,38 @@ ++/* PR rtl-optimization/88904 */ ++ ++volatile int v; ++ ++__attribute__((noipa)) void ++bar (const char *x, const char *y, int z) ++{ ++ if (!v) ++ __builtin_abort (); ++ asm volatile ("" : "+g" (x)); ++ asm volatile ("" : "+g" (y)); ++ asm volatile ("" : "+g" (z)); ++} ++ ++#define my_assert(e) ((e) ? (void) 0 : bar (#e, __FILE__, __LINE__)) ++ ++typedef struct { ++ unsigned M1; ++ unsigned M2 : 1; ++ int : 0; ++ unsigned M3 : 1; ++} S; ++ ++S ++foo () ++{ ++ S result = {0, 0, 1}; ++ return result; ++} ++ ++int ++main () ++{ ++ S ret = foo (); ++ my_assert (ret.M2 == 0); ++ my_assert (ret.M3 == 1); ++ return 0; ++} diff --git a/gcc9-pr88905.patch b/gcc9-pr88905.patch new file mode 100644 index 0000000..ed3c1c6 --- /dev/null +++ b/gcc9-pr88905.patch @@ -0,0 +1,142 @@ +2019-01-21 Jakub Jelinek + + PR target/88905 + * optabs.c (add_equal_note): Add op0_mode argument, use it instead of + GET_MODE (op0). + (expand_binop_directly, expand_doubleword_clz, + expand_doubleword_popcount, expand_ctz, expand_ffs, + expand_unop_direct, maybe_emit_unop_insn): Adjust callers. + + * gcc.dg/pr88905.c: New test. + +--- gcc/optabs.c.jj 2019-01-01 12:37:17.711965861 +0100 ++++ gcc/optabs.c 2019-01-21 13:56:18.263446049 +0100 +@@ -55,7 +55,7 @@ void debug_optab_libfuncs (void); + + /* Add a REG_EQUAL note to the last insn in INSNS. TARGET is being set to + the result of operation CODE applied to OP0 (and OP1 if it is a binary +- operation). ++ operation). OP0_MODE is OP0's mode. + + If the last insn does not set TARGET, don't do anything, but return 1. + +@@ -64,7 +64,8 @@ void debug_optab_libfuncs (void); + try again, ensuring that TARGET is not one of the operands. */ + + static int +-add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op1) ++add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, ++ rtx op1, machine_mode op0_mode) + { + rtx_insn *last_insn; + rtx set; +@@ -136,16 +137,16 @@ add_equal_note (rtx_insn *insns, rtx tar + case POPCOUNT: + case PARITY: + case BSWAP: +- if (GET_MODE (op0) != VOIDmode && GET_MODE (target) != GET_MODE (op0)) ++ if (op0_mode != VOIDmode && GET_MODE (target) != op0_mode) + { +- note = gen_rtx_fmt_e (code, GET_MODE (op0), copy_rtx (op0)); +- if (GET_MODE_UNIT_SIZE (GET_MODE (op0)) ++ note = gen_rtx_fmt_e (code, op0_mode, copy_rtx (op0)); ++ if (GET_MODE_UNIT_SIZE (op0_mode) + > GET_MODE_UNIT_SIZE (GET_MODE (target))) + note = simplify_gen_unary (TRUNCATE, GET_MODE (target), +- note, GET_MODE (op0)); ++ note, op0_mode); + else + note = simplify_gen_unary (ZERO_EXTEND, GET_MODE (target), +- note, GET_MODE (op0)); ++ note, op0_mode); + break; + } + /* FALLTHRU */ +@@ -1127,7 +1128,7 @@ expand_binop_directly (enum insn_code ic + if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX + && ! add_equal_note (pat, ops[0].value, + optab_to_code (binoptab), +- ops[1].value, ops[2].value)) ++ ops[1].value, ops[2].value, mode0)) + { + delete_insns_since (last); + return expand_binop (mode, binoptab, op0, op1, NULL_RTX, +@@ -2298,7 +2299,7 @@ expand_doubleword_clz (scalar_int_mode m + seq = get_insns (); + end_sequence (); + +- add_equal_note (seq, target, CLZ, xop0, 0); ++ add_equal_note (seq, target, CLZ, xop0, NULL_RTX, mode); + emit_insn (seq); + return target; + +@@ -2340,7 +2341,7 @@ expand_doubleword_popcount (scalar_int_m + seq = get_insns (); + end_sequence (); + +- add_equal_note (seq, t, POPCOUNT, op0, 0); ++ add_equal_note (seq, t, POPCOUNT, op0, NULL_RTX, mode); + emit_insn (seq); + return t; + } +@@ -2511,7 +2512,7 @@ expand_ctz (scalar_int_mode mode, rtx op + seq = get_insns (); + end_sequence (); + +- add_equal_note (seq, temp, CTZ, op0, 0); ++ add_equal_note (seq, temp, CTZ, op0, NULL_RTX, mode); + emit_insn (seq); + return temp; + } +@@ -2589,7 +2590,7 @@ expand_ffs (scalar_int_mode mode, rtx op + seq = get_insns (); + end_sequence (); + +- add_equal_note (seq, temp, FFS, op0, 0); ++ add_equal_note (seq, temp, FFS, op0, NULL_RTX, mode); + emit_insn (seq); + return temp; + +@@ -2736,7 +2737,7 @@ expand_unop_direct (machine_mode mode, o + if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX + && ! add_equal_note (pat, ops[0].value, + optab_to_code (unoptab), +- ops[1].value, NULL_RTX)) ++ ops[1].value, NULL_RTX, mode)) + { + delete_insns_since (last); + return expand_unop (mode, unoptab, op0, NULL_RTX, unsignedp); +@@ -3588,7 +3589,8 @@ maybe_emit_unop_insn (enum insn_code ico + + if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX + && code != UNKNOWN) +- add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX); ++ add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX, ++ GET_MODE (op0)); + + emit_insn (pat); + +--- gcc/testsuite/gcc.dg/pr88905.c.jj 2019-01-21 14:19:17.279746531 +0100 ++++ gcc/testsuite/gcc.dg/pr88905.c 2019-01-21 14:18:56.264091537 +0100 +@@ -0,0 +1,21 @@ ++/* PR target/88905 */ ++/* { dg-do compile } */ ++/* { dg-options "-Og -fno-tree-ccp" } */ ++/* { dg-additional-options "-mabm" { target { i?86-*-* x86_64-*-* } } } */ ++ ++int a, b, c; ++extern void baz (int); ++ ++static inline int ++bar (unsigned u) ++{ ++ int i = __builtin_popcountll (-(unsigned long long) u); ++ baz (i & c); ++ return a + b + c; ++} ++ ++void ++foo (void) ++{ ++ bar (2376498292ULL); ++} diff --git a/gcc9-pr88906.patch b/gcc9-pr88906.patch new file mode 100644 index 0000000..4758f46 --- /dev/null +++ b/gcc9-pr88906.patch @@ -0,0 +1,94 @@ +2019-01-21 Jakub Jelinek + + PR rtl-optimization/49429 + PR target/49454 + PR rtl-optimization/86334 + PR target/88906 + * expr.c (emit_block_move_hints): Move marking of MEM_EXPRs + addressable from here... + (emit_block_op_via_libcall): ... to here. + + * gcc.target/i386/pr86334.c: New test. + * gcc.target/i386/pr88906.c: New test. + +--- gcc/expr.c.jj 2019-01-10 11:43:08.958466880 +0100 ++++ gcc/expr.c 2019-01-21 12:06:41.782406169 +0100 +@@ -1631,14 +1631,6 @@ emit_block_move_hints (rtx x, rtx y, rtx + if (may_use_call < 0) + return pc_rtx; + +- /* Since x and y are passed to a libcall, mark the corresponding +- tree EXPR as addressable. */ +- tree y_expr = MEM_EXPR (y); +- tree x_expr = MEM_EXPR (x); +- if (y_expr) +- mark_addressable (y_expr); +- if (x_expr) +- mark_addressable (x_expr); + retval = emit_block_copy_via_libcall (x, y, size, + method == BLOCK_OP_TAILCALL); + } +@@ -1884,6 +1876,15 @@ emit_block_op_via_libcall (enum built_in + tree call_expr, dst_tree, src_tree, size_tree; + machine_mode size_mode; + ++ /* Since dst and src are passed to a libcall, mark the corresponding ++ tree EXPR as addressable. */ ++ tree dst_expr = MEM_EXPR (dst); ++ tree src_expr = MEM_EXPR (src); ++ if (dst_expr) ++ mark_addressable (dst_expr); ++ if (src_expr) ++ mark_addressable (src_expr); ++ + dst_addr = copy_addr_to_reg (XEXP (dst, 0)); + dst_addr = convert_memory_address (ptr_mode, dst_addr); + dst_tree = make_tree (ptr_type_node, dst_addr); +--- gcc/testsuite/gcc.target/i386/pr86334.c.jj 2019-01-21 17:52:04.408370956 +0100 ++++ gcc/testsuite/gcc.target/i386/pr86334.c 2019-01-21 17:52:58.504482908 +0100 +@@ -0,0 +1,21 @@ ++/* PR rtl-optimization/86334 */ ++/* { dg-do run { target ia32 } } */ ++/* { dg-options "-O -march=i386 -mtune=athlon -minline-all-stringops -minline-stringops-dynamically -mmemcpy-strategy=libcall:-1:align -Wno-psabi" } */ ++ ++typedef int V __attribute__ ((vector_size (64))); ++ ++static inline V ++foo (V g) ++{ ++ g[0] = 4; ++ return g; ++} ++ ++int ++main () ++{ ++ V x = foo ((V) { }); ++ if (x[0] != 4 || x[1] || x[2] || x[3] || x[4] || x[5] || x[6] || x[7]) ++ __builtin_abort (); ++ return 0; ++} +--- gcc/testsuite/gcc.target/i386/pr88906.c.jj 2019-01-21 12:08:53.110252030 +0100 ++++ gcc/testsuite/gcc.target/i386/pr88906.c 2019-01-21 17:53:08.082325657 +0100 +@@ -0,0 +1,21 @@ ++/* PR target/88906 */ ++/* { dg-do run { target ia32 } } */ ++/* { dg-options "-O -march=i386 -mtune=k6 -minline-all-stringops -minline-stringops-dynamically -mmemcpy-strategy=libcall:-1:align -Wno-psabi" } */ ++ ++typedef unsigned V __attribute__ ((vector_size (16))); ++ ++static inline V ++foo (V v) ++{ ++ __builtin_sub_overflow (0, 0, &v[0]); ++ return v; ++} ++ ++int ++main () ++{ ++ V v = foo ((V) { ~0 }); ++ if (v[0] || v[1] || v[2] || v[3]) ++ __builtin_abort (); ++ return 0; ++} diff --git a/gcc9-utf-array-test.patch b/gcc9-utf-array-test.patch deleted file mode 100644 index 2e3c18d..0000000 --- a/gcc9-utf-array-test.patch +++ /dev/null @@ -1,32 +0,0 @@ -2019-01-18 Jakub Jelinek - - * gcc.dg/utf-array.c: Allow wchar_t to be printed as - {long ,short ,}{unsigned ,}int. - ---- gcc/testsuite/gcc.dg/utf-array.c.jj 2019-01-18 00:33:20.867980701 +0100 -+++ gcc/testsuite/gcc.dg/utf-array.c 2019-01-18 23:32:57.086524528 +0100 -@@ -12,13 +12,13 @@ typedef __CHAR32_TYPE__ char32_t; - const char s_0[] = "ab"; - const char s_1[] = u"ab"; /* { dg-error "from a string literal with type array of" } */ - const char s_2[] = U"ab"; /* { dg-error "from a string literal with type array of" } */ --const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." } */ -+const char s_3[] = L"ab"; /* { dg-error "from a string literal with type array of .(long |short )?(unsigned )?int." } */ - const char s_4[] = u8"ab"; - - const char16_t s16_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */ - const char16_t s16_1[] = u"ab"; - const char16_t s16_2[] = U"ab"; /* { dg-error "from a string literal with type array of" } */ --const char16_t s16_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." "" { target { ! wchar_t_char16_t_compatible } } } */ -+const char16_t s16_3[] = L"ab"; /* { dg-error "from a string literal with type array of .(long |short )?(unsigned )?int." "" { target { ! wchar_t_char16_t_compatible } } } */ - const char16_t s16_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */ - - const char16_t s16_5[0] = u"ab"; /* { dg-warning "chars is too long" } */ -@@ -30,7 +30,7 @@ const char16_t s16_9[4] = u"ab"; - const char32_t s32_0[] = "ab"; /* { dg-error "from a string literal with type array of .char." } */ - const char32_t s32_1[] = u"ab"; /* { dg-error "from a string literal with type array of" } */ - const char32_t s32_2[] = U"ab"; --const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .int." "" { target { ! wchar_t_char32_t_compatible } } } */ -+const char32_t s32_3[] = L"ab"; /* { dg-error "from a string literal with type array of .(long |short )?(unsigned )?int." "" { target { ! wchar_t_char32_t_compatible } } } */ - const char32_t s32_4[] = u8"ab"; /* { dg-error "from a string literal with type array of .char." } */ - - const char32_t s32_5[0] = U"ab"; /* { dg-warning "chars is too long" } */ diff --git a/sources b/sources index 41c6849..aa96da8 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ -SHA512 (gcc-9.0.0-20190119.tar.xz) = 22d58049867a220493ec77da591ebf4a4bc05513451f31a4e9d990035b0a6f571d495fc86ec607bb6eb7aebb310e57ccab669b764d07503ce1e6f6109b893262 +SHA512 (gcc-9.0.0-20190121.tar.xz) = 18dda8f278e99e1cf93fb30f60faa2b4828c13f289de7412e62d59076357b0674f5ae891ac879d7d47a18cf0c291fdb34795162180fc9c9b2651ad42ca08f478 SHA512 (nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.xz) = 94f7089365296f7dfa485107b4143bebc850a81586f3460fd896bbbb6ba099a00217d4042133424fd2183b352132f4fd367e6a60599bdae2a26dfd48a77d0e04 SHA512 (nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.xz) = a688cb12cf805950a5abbb13b52f45c81dbee98e310b7ed57ae20e76dbfa5964a16270148374a6426d177db71909d28360490f091c86a5d19d4faa5127beeee1