[DAGCombiner] restrict (float)((int) f) --> ftrunc with no-signed-zeros

Authored by spatel on Jun 27 2018, 11:16 AM.


[DAGCombiner] restrict (float)((int) f) --> ftrunc with no-signed-zeros

As noted in the D44909 review, the transform from (fptosi+sitofp) to ftrunc
can produce -0.0 where the original code does not:

#include <stdio.h>

int main(int argc) {

float x;
x = -0.8 * argc;
printf("%f\n", (float)((int)x));
return 0;


$ clang -O0 -mavx fp.c ; ./a.out
$ clang -O1 -mavx fp.c ; ./a.out

Ideally, we'd use IR/node flags to predicate the transform, but the IR parser
doesn't currently allow fast-math-flags on the cast instructions. So for now,
just use the function attribute that corresponds to clang's "-fno-signed-zeros"

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

llvm-svn: 335761