]> granicus.if.org Git - clang/commit
[CodeGen] make nan builtins pure rather than const (PR37778)
authorSanjay Patel <spatel@rotateright.com>
Wed, 13 Jun 2018 17:54:52 +0000 (17:54 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 13 Jun 2018 17:54:52 +0000 (17:54 +0000)
commit4b0cada1baa6ea14bc9d253f0545c24c3f08a422
treeddd436459ce5a5433c57113e2c3d60e50a494be9
parentadd093f497fe5510806fe5a81086198885995740
[CodeGen] make nan builtins pure rather than const (PR37778)

https://bugs.llvm.org/show_bug.cgi?id=37778
...shows a miscompile resulting from marking nan builtins as 'const'.

The nan libcalls/builtins take a pointer argument:
http://www.cplusplus.com/reference/cmath/nan-function/
...and the chars dereferenced by that arg are used to fill in the NaN constant payload bits.

"const" means that the pointer argument isn't dereferenced. That's translated to "readnone" in LLVM.
"pure" means that the pointer argument may be dereferenced. That's translated to "readonly" in LLVM.

This change prevents the IR optimizer from killing the lead-up to the nan call here:

double a() {
  char buf[4];
  buf[0] = buf[1] = buf[2] = '9';
  buf[3] = '\0';
  return __builtin_nan(buf);
}

...the optimizer isn't currently able to simplify this to a constant as we might hope,
but this patch should solve the miscompile.

Differential Revision: https://reviews.llvm.org/D48134

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@334628 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Basic/Builtins.def
test/CodeGen/math-builtins.c