On Thu, Sep 3, 2015 at 8:15 AM, Oded Gabbay <oded.gab...@gmail.com> wrote: > round(val*dscale) produces a double result, as val and dscale are double. > However, LLVMConstInt receives unsigned long long, so there is an > implicit conversion from double to unsigned long long. > This is an undefined behavior. Therefore, we need to first explicitly > convert the round result to long long, and then let the compiler handle > conversion from that to unsigned long long. > > This bug manifests itself in POWER, where all IMM values of -1 are being > converted to 0 implicitly, causing a wrong LLVM IR output. > > Signed-off-by: Oded Gabbay <oded.gab...@gmail.com> > CC: "10.6" <mesa-sta...@lists.freedesktop.org> > --- > src/gallium/auxiliary/gallivm/lp_bld_const.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.c > b/src/gallium/auxiliary/gallivm/lp_bld_const.c > index 0f5a8f8..9cd7c55 100644 > --- a/src/gallium/auxiliary/gallivm/lp_bld_const.c > +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.c > @@ -311,7 +311,7 @@ lp_build_const_elem(struct gallivm_state *gallivm, > else { > double dscale = lp_const_scale(type); > > - elem = LLVMConstInt(elem_type, round(val*dscale), 0); > + elem = LLVMConstInt(elem_type, (long long) round(val*dscale), 0);
Looks like I'm late to the party, but shouldn't you just use llround()? _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev