Add a -fgo-debug-optimization option to emit optimization
diagnostics. This can be used for testing optimizations. Apply
this to the range clear optimizations of maps and arrays.
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/170002
gcc/go:
* lang.opt (-fgo-debug-optimization): New option.
* go-c.h (struct go_create_gogo_args): Add debug_optimization
field.
* go-lang.c (go_langhook_init): Set debug_optimization field.
* gccgo.texi (Invoking gccgo): Document -fgo-debug-optimization.
gcc/testsuite:
* go.dg/arrayclear.go: New test.
* go.dg/mapclear.go: New test.
From-SVN: r270993
13 files changed:
+2019-05-07 Cherry Zhang <cherryyz@google.com>
+
+ * lang.opt (-fgo-debug-optimization): New option.
+ * go-c.h (struct go_create_gogo_args): Add debug_optimization
+ field.
+ * go-lang.c (go_langhook_init): Set debug_optimization field.
+ * gccgo.texi (Invoking gccgo): Document -fgo-debug-optimization.
+
2019-03-06 Ian Lance Taylor <iant@golang.org>
PR go/89227
2019-03-06 Ian Lance Taylor <iant@golang.org>
PR go/89227
that match the given suffix @var{n}. This can be used to binary
search across functions to uncover escape analysis bugs.
that match the given suffix @var{n}. This can be used to binary
search across functions to uncover escape analysis bugs.
+@item -fgo-debug-optimization
+@cindex @option{-fgo-debug-optimization}
+@cindex @option{-fno-go-debug-optimization}
+Output optimization diagnostics.
+
@item -fgo-c-header=@var{file}
@cindex @option{-fgo-c-header}
Write top-level named Go struct definitions to @var{file} as C code.
@item -fgo-c-header=@var{file}
@cindex @option{-fgo-c-header}
Write top-level named Go struct definitions to @var{file} as C code.
int debug_escape_level;
const char* debug_escape_hash;
int64_t nil_check_size_threshold;
int debug_escape_level;
const char* debug_escape_hash;
int64_t nil_check_size_threshold;
+ bool debug_optimization;
};
extern void go_create_gogo (const struct go_create_gogo_args*);
};
extern void go_create_gogo (const struct go_create_gogo_args*);
args.debug_escape_level = go_debug_escape_level;
args.debug_escape_hash = go_debug_escape_hash;
args.nil_check_size_threshold = TARGET_AIX ? -1 : 4096;
args.debug_escape_level = go_debug_escape_level;
args.debug_escape_hash = go_debug_escape_hash;
args.nil_check_size_threshold = TARGET_AIX ? -1 : 4096;
+ args.debug_optimization = go_debug_optimization;
args.linemap = go_get_linemap();
args.backend = go_get_backend();
go_create_gogo (&args);
args.linemap = go_get_linemap();
args.backend = go_get_backend();
go_create_gogo (&args);
-4b3015de639cf22ed11ff96097555700909827c8
+dc9c1b43753f392fdc2045bcb7a4abaa44fe79f1
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
if (args->debug_escape_hash != NULL)
::gogo->set_debug_escape_hash(args->debug_escape_hash);
::gogo->set_nil_check_size_threshold(args->nil_check_size_threshold);
if (args->debug_escape_hash != NULL)
::gogo->set_debug_escape_hash(args->debug_escape_hash);
::gogo->set_nil_check_size_threshold(args->nil_check_size_threshold);
+ if (args->debug_optimization)
+ ::gogo->set_debug_optimization(args->debug_optimization);
}
// Parse the input files.
}
// Parse the input files.
check_divide_overflow_(true),
compiling_runtime_(false),
debug_escape_level_(0),
check_divide_overflow_(true),
compiling_runtime_(false),
debug_escape_level_(0),
+ debug_optimization_(false),
nil_check_size_threshold_(4096),
verify_types_(),
interface_types_(),
nil_check_size_threshold_(4096),
verify_types_(),
interface_types_(),
set_debug_escape_hash(const std::string& s)
{ this->debug_escape_hash_ = s; }
set_debug_escape_hash(const std::string& s)
{ this->debug_escape_hash_ = s; }
+ // Return whether to output optimization diagnostics.
+ bool
+ debug_optimization() const
+ { return this->debug_optimization_; }
+
+ // Set the option to output optimization diagnostics.
+ void
+ set_debug_optimization(bool b)
+ { this->debug_optimization_ = b; }
+
// Return the size threshold used to determine whether to issue
// a nil-check for a given pointer dereference. A threshold of -1
// implies that all potentially faulting dereference ops should
// Return the size threshold used to determine whether to issue
// a nil-check for a given pointer dereference. A threshold of -1
// implies that all potentially faulting dereference ops should
// -fgo-debug-escape-hash option. The analysis is run only on
// functions with names that hash to the matching value.
std::string debug_escape_hash_;
// -fgo-debug-escape-hash option. The analysis is run only on
// functions with names that hash to the matching value.
std::string debug_escape_hash_;
+ // Whether to output optimization diagnostics, from the
+ // -fgo-debug-optimization option.
+ bool debug_optimization_;
// Nil-check size threshhold.
int64_t nil_check_size_threshold_;
// A list of types to verify.
// Nil-check size threshhold.
int64_t nil_check_size_threshold_;
// A list of types to verify.
range_temp, loc);
if (clear != NULL)
{
range_temp, loc);
if (clear != NULL)
{
+ if (gogo->debug_optimization())
+ go_inform(loc, "map range clear");
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
range_temp, loc);
if (clear != NULL)
{
range_temp, loc);
if (clear != NULL)
{
+ if (gogo->debug_optimization())
+ go_inform(loc, "array range clear");
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
Go Joined RejectNegative Var(go_debug_escape_hash) Init(0)
-fgo-debug-escape-hash=<string> Hash value to debug escape analysis.
Go Joined RejectNegative Var(go_debug_escape_hash) Init(0)
-fgo-debug-escape-hash=<string> Hash value to debug escape analysis.
+fgo-debug-optimization
+Go Var(go_debug_optimization) Init(0)
+Emit optimization diagnostics.
+
o
Go Joined Separate
; Documented in common.opt
o
Go Joined Separate
; Documented in common.opt
+2019-05-07 Cherry Zhang <cherryyz@google.com>
+
+ * go.dg/arrayclear.go: New test.
+ * go.dg/mapclear.go: New test.
+
2019-05-07 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/89765
2019-05-07 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/89765
--- /dev/null
+// { dg-do compile }
+// { dg-options "-fgo-debug-optimization" }
+
+package p
+
+var a [10]int
+
+func arrayClear() {
+ for i := range a { // { dg-error "array range clear" }
+ a[i] = 0
+ }
+}
+
+var s []int
+
+func sliceClear() {
+ for i := range s { // { dg-error "array range clear" }
+ s[i] = 0
+ }
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-fgo-debug-optimization" }
+
+package p
+
+func clear(m map[int]int) {
+ for k := range m { // { dg-error "map range clear" }
+ delete(m, k)
+ }
+}