From: Matt Turner Date: Thu, 26 May 2016 22:53:00 +0000 (-0700) Subject: glsl: Avoid aliasing violations. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=149309a424ed8c19354fc2c5830f927787f02ccc;p=mesa.git glsl: Avoid aliasing violations. Reviewed-by: Brian Paul Reviewed-by: Ian Romanick --- diff --git a/src/compiler/glsl/ir_constant_expression.cpp b/src/compiler/glsl/ir_constant_expression.cpp index ea50087f4c0..6329acde2b6 100644 --- a/src/compiler/glsl/ir_constant_expression.cpp +++ b/src/compiler/glsl/ir_constant_expression.cpp @@ -1573,18 +1573,13 @@ ir_expression::constant_expression_value(struct hash_table *variable_context) data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f); } break; - case ir_unop_pack_double_2x32: { + case ir_unop_pack_double_2x32: /* XXX needs to be checked on big-endian */ - uint64_t temp; - temp = (uint64_t)op[0]->value.u[0] | ((uint64_t)op[0]->value.u[1] << 32); - data.d[0] = *(double *)&temp; - + memcpy(&data.d[0], &op[0]->value.u[0], sizeof(double)); break; - } case ir_unop_unpack_double_2x32: /* XXX needs to be checked on big-endian */ - data.u[0] = *(uint32_t *)&op[0]->value.d[0]; - data.u[1] = *((uint32_t *)&op[0]->value.d[0] + 1); + memcpy(&data.u[0], &op[0]->value.d[0], sizeof(double)); break; case ir_triop_bitfield_extract: { diff --git a/src/compiler/glsl/link_uniform_initializers.cpp b/src/compiler/glsl/link_uniform_initializers.cpp index effbb6aea0c..17660a75741 100644 --- a/src/compiler/glsl/link_uniform_initializers.cpp +++ b/src/compiler/glsl/link_uniform_initializers.cpp @@ -65,8 +65,7 @@ copy_constant_to_storage(union gl_constant_value *storage, break; case GLSL_TYPE_DOUBLE: /* XXX need to check on big-endian */ - storage[i * 2].u = *(uint32_t *)&val->value.d[i]; - storage[i * 2 + 1].u = *(((uint32_t *)&val->value.d[i]) + 1); + memcpy(&storage[i * 2].u, &val->value.d[i], sizeof(double)); break; case GLSL_TYPE_BOOL: storage[i].b = val->value.b[i] ? boolean_true : 0;