Mesa (master): glsl: Avoid aliasing violations.
Matt Turner
mattst88 at kemper.freedesktop.org
Tue Jul 26 19:12:39 UTC 2016
Module: Mesa
Branch: master
Commit: 149309a424ed8c19354fc2c5830f927787f02ccc
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=149309a424ed8c19354fc2c5830f927787f02ccc
Author: Matt Turner <mattst88 at gmail.com>
Date: Thu May 26 15:53:00 2016 -0700
glsl: Avoid aliasing violations.
Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/compiler/glsl/ir_constant_expression.cpp | 11 +++--------
src/compiler/glsl/link_uniform_initializers.cpp | 3 +--
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/src/compiler/glsl/ir_constant_expression.cpp b/src/compiler/glsl/ir_constant_expression.cpp
index ea50087..6329acd 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 effbb6a..17660a7 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;
More information about the mesa-commit
mailing list