Perform update_precision on constructors and converts

Fixes #2740
diff --git a/Test/baseResults/300block.frag.out b/Test/baseResults/300block.frag.out
index e5b07dd..1a5bd9b 100644
--- a/Test/baseResults/300block.frag.out
+++ b/Test/baseResults/300block.frag.out
@@ -24,18 +24,18 @@
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
 0:44    Sequence
-0:44      texture ( global lowp 4-component vector of int)
+0:44      texture ( global lowp 4-component vector of int, operation at mediump)
 0:44        sampler: direct index for structure ( global lowp isampler3D)
 0:44          's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
 0:44          Constant:
 0:44            2 (const int)
-0:44        Construct vec3 ( temp lowp 3-component vector of float)
-0:44          Convert int to float ( temp lowp float)
+0:44        Construct vec3 ( temp mediump 3-component vector of float)
+0:44          Convert int to float ( temp mediump float)
 0:44            ni: direct index for structure (layout( column_major shared) uniform mediump int)
 0:44              'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
@@ -43,7 +43,7 @@
 0:44                  0 (const uint)
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              nbv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                direct index (layout( column_major shared) temp block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
@@ -92,18 +92,18 @@
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
 0:44    Sequence
-0:44      texture ( global lowp 4-component vector of int)
+0:44      texture ( global lowp 4-component vector of int, operation at mediump)
 0:44        sampler: direct index for structure ( global lowp isampler3D)
 0:44          's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
 0:44          Constant:
 0:44            2 (const int)
-0:44        Construct vec3 ( temp lowp 3-component vector of float)
-0:44          Convert int to float ( temp lowp float)
+0:44        Construct vec3 ( temp mediump 3-component vector of float)
+0:44          Convert int to float ( temp mediump float)
 0:44            ni: direct index for structure (layout( column_major shared) uniform mediump int)
 0:44              'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
@@ -111,7 +111,7 @@
 0:44                  0 (const uint)
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              nbv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                direct index (layout( column_major shared) temp block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 85b0116..ac76cbd 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -180,7 +180,7 @@
 0:91              'i' ( temp highp int)
 0:92      imageStore ( global highp void)
 0:92        'ii2da' ( writeonly uniform highp iimage2DArray)
-0:92        Construct ivec3 ( temp 3-component vector of int)
+0:92        Construct ivec3 ( temp highp 3-component vector of int)
 0:92          'i' ( temp highp int)
 0:92          'i' ( temp highp int)
 0:92          'i' ( temp highp int)
@@ -189,9 +189,9 @@
 0:92          0 (const int)
 0:92          0 (const int)
 0:92          0 (const int)
-0:93      imageLoad ( global mediump 4-component vector of float)
+0:93      imageLoad ( global mediump 4-component vector of float, operation at highp)
 0:93        'img2Drgba' (layout( rgba32f) readonly uniform mediump image2D)
-0:93        Construct ivec2 ( temp mediump 2-component vector of int)
+0:93        Construct ivec2 ( temp highp 2-component vector of int)
 0:93          'i' ( temp highp int)
 0:93          'i' ( temp highp int)
 0:94      imageLoad ( global highp 4-component vector of int)
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 9f73c67..e43a887 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -270,7 +270,7 @@
 0:42        Constant:
 0:42          0.000000
 0:42          0.000000
-0:42        Convert float to int ( temp highp 2-component vector of int)
+0:42        Convert float to int ( temp mediump 2-component vector of int)
 0:42          'c2D' ( smooth in mediump 2-component vector of float)
 0:43      textureProjGradOffset ( global highp 4-component vector of uint)
 0:43        'usamp2d' ( uniform highp usampler2D)
@@ -471,7 +471,7 @@
 0:211        Constant:
 0:211          0.100000
 0:211          0.100000
-0:211        Convert float to int ( temp highp 2-component vector of int)
+0:211        Convert float to int ( temp mediump 2-component vector of int)
 0:211          'inf' ( smooth in mediump 2-component vector of float)
 0:212      textureGatherOffsets ( global highp 4-component vector of float)
 0:212        direct index ( temp highp sampler2D)
@@ -507,7 +507,7 @@
 0:221        Constant:
 0:221          0.100000
 0:221          0.100000
-0:221        Convert float to int ( temp highp 2-component vector of int)
+0:221        Convert float to int ( temp mediump 2-component vector of int)
 0:221          'inf' ( smooth in mediump 2-component vector of float)
 0:222      textureGatherOffsets ( global highp 4-component vector of float)
 0:222        direct index ( temp highp sampler2D)
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index 1d2152d..13a88df 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -330,7 +330,7 @@
 0:164          'sIndex' ( uniform highp int)
 0:164          Constant:
 0:164            2 (const int)
-0:165      textureGatherOffset ( global lowp 4-component vector of float)
+0:165      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:165        direct index ( temp lowp sampler2D)
 0:165          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:165          Constant:
@@ -338,7 +338,7 @@
 0:165        Constant:
 0:165          0.100000
 0:165          0.100000
-0:165        Convert float to int ( temp lowp 2-component vector of int)
+0:165        Convert float to int ( temp highp 2-component vector of int)
 0:165          'inf' ( in highp 2-component vector of float)
 0:166      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:166        direct index ( temp lowp sampler2D)
@@ -394,7 +394,7 @@
 0:179          'sIndex' ( uniform highp int)
 0:179          Constant:
 0:179            2 (const int)
-0:180      textureGatherOffset ( global lowp 4-component vector of float)
+0:180      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:180        direct index ( temp lowp sampler2D)
 0:180          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:180          Constant:
@@ -402,7 +402,7 @@
 0:180        Constant:
 0:180          0.100000
 0:180          0.100000
-0:180        Convert float to int ( temp lowp 2-component vector of int)
+0:180        Convert float to int ( temp highp 2-component vector of int)
 0:180          'inf' ( in highp 2-component vector of float)
 0:181      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:181        direct index ( temp lowp sampler2D)
diff --git a/Test/baseResults/320.frag.out b/Test/baseResults/320.frag.out
index 002aa7f..9f4a817 100644
--- a/Test/baseResults/320.frag.out
+++ b/Test/baseResults/320.frag.out
@@ -121,7 +121,7 @@
 0:76          'inf' ( smooth in mediump 2-component vector of float)
 0:76          'ing' ( smooth in mediump 2-component vector of float)
 0:76          'h' ( noContraction temp mediump 2-component vector of float)
-0:77      textureGatherOffset ( global lowp 4-component vector of float)
+0:77      textureGatherOffset ( global lowp 4-component vector of float, operation at mediump)
 0:77        direct index ( temp lowp sampler2D)
 0:77          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:77          Constant:
@@ -129,7 +129,7 @@
 0:77        Constant:
 0:77          0.100000
 0:77          0.100000
-0:77        Convert float to int ( temp lowp 2-component vector of int)
+0:77        Convert float to int ( temp mediump 2-component vector of int)
 0:77          'inf' ( smooth in mediump 2-component vector of float)
 0:78      textureGatherOffsets ( global lowp 4-component vector of float, operation at mediump)
 0:78        direct index ( temp lowp sampler2D)
diff --git a/Test/baseResults/320.vert.out b/Test/baseResults/320.vert.out
index 0313b61..5e80d14 100644
--- a/Test/baseResults/320.vert.out
+++ b/Test/baseResults/320.vert.out
@@ -99,7 +99,7 @@
 0:70          'sIndex' ( uniform highp int)
 0:70          Constant:
 0:70            2 (const int)
-0:71      textureGatherOffset ( global lowp 4-component vector of float)
+0:71      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:71        direct index ( temp lowp sampler2D)
 0:71          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:71          Constant:
@@ -107,7 +107,7 @@
 0:71        Constant:
 0:71          0.100000
 0:71          0.100000
-0:71        Convert float to int ( temp lowp 2-component vector of int)
+0:71        Convert float to int ( temp highp 2-component vector of int)
 0:71          'inf' ( in highp 2-component vector of float)
 0:72      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:72        direct index ( temp lowp sampler2D)
diff --git a/Test/baseResults/glsl.es320.subgroup.geom.out b/Test/baseResults/glsl.es320.subgroup.geom.out
index 5d18d30..eab5454 100644
--- a/Test/baseResults/glsl.es320.subgroup.geom.out
+++ b/Test/baseResults/glsl.es320.subgroup.geom.out
@@ -16,7 +16,7 @@
 0:12            Constant:
 0:12              0 (const uint)
 0:12          'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
-0:12        Construct uvec4 ( temp highp 4-component vector of uint)
+0:12        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:12          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:12          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:12          Constant:
@@ -47,7 +47,7 @@
 0:12            Constant:
 0:12              0 (const uint)
 0:12          'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
-0:12        Construct uvec4 ( temp highp 4-component vector of uint)
+0:12        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:12          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:12          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:12          Constant:
diff --git a/Test/baseResults/glsl.es320.subgroup.tesc.out b/Test/baseResults/glsl.es320.subgroup.tesc.out
index 9512bc5..431a3c3 100644
--- a/Test/baseResults/glsl.es320.subgroup.tesc.out
+++ b/Test/baseResults/glsl.es320.subgroup.tesc.out
@@ -13,7 +13,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
@@ -41,7 +41,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
diff --git a/Test/baseResults/glsl.es320.subgroup.tese.out b/Test/baseResults/glsl.es320.subgroup.tese.out
index 29f7b73..198a757 100644
--- a/Test/baseResults/glsl.es320.subgroup.tese.out
+++ b/Test/baseResults/glsl.es320.subgroup.tese.out
@@ -15,7 +15,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
@@ -45,7 +45,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
diff --git a/Test/baseResults/glsl.es320.subgroup.vert.out b/Test/baseResults/glsl.es320.subgroup.vert.out
index bf1da49..e1a6bea 100644
--- a/Test/baseResults/glsl.es320.subgroup.vert.out
+++ b/Test/baseResults/glsl.es320.subgroup.vert.out
@@ -12,7 +12,7 @@
 0:10            Constant:
 0:10              0 (const uint)
 0:10          'gl_VertexID' ( gl_VertexId highp int VertexId)
-0:10        Construct uvec4 ( temp highp 4-component vector of uint)
+0:10        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:10          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:10          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:10          Constant:
@@ -41,7 +41,7 @@
 0:10            Constant:
 0:10              0 (const uint)
 0:10          'gl_VertexID' ( gl_VertexId highp int VertexId)
-0:10        Construct uvec4 ( temp highp 4-component vector of uint)
+0:10        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:10          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:10          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:10          Constant:
diff --git a/Test/baseResults/spv.ext.AnyHitShader.rahit.out b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
index 7bcf812..880be33 100644
--- a/Test/baseResults/spv.ext.AnyHitShader.rahit.out
+++ b/Test/baseResults/spv.ext.AnyHitShader.rahit.out
@@ -73,6 +73,7 @@
                               Decorate 98(gl_SubgroupSize) RelaxedPrecision
                               Decorate 98(gl_SubgroupSize) BuiltIn SubgroupSize
                               Decorate 99 RelaxedPrecision
+                              Decorate 100 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
index 14ec09b..7f5af89 100644
--- a/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
+++ b/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
@@ -38,10 +38,21 @@
                               Decorate 28(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 28(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 29 RelaxedPrecision
+                              Decorate 30 RelaxedPrecision
                               Decorate 34(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
+                              Decorate 41 RelaxedPrecision
+                              Decorate 42 RelaxedPrecision
                               Decorate 43(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR
+                              Decorate 46 RelaxedPrecision
+                              Decorate 46 RelaxedPrecision
+                              Decorate 47 RelaxedPrecision
                               Decorate 48(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR
+                              Decorate 51 RelaxedPrecision
+                              Decorate 51 RelaxedPrecision
+                              Decorate 52 RelaxedPrecision
                               Decorate 53(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
+                              Decorate 59 RelaxedPrecision
+                              Decorate 60 RelaxedPrecision
                               Decorate 61(gl_SMIDNV) BuiltIn SMIDNV
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/Test/baseResults/spv.precise.tese.out b/Test/baseResults/spv.precise.tese.out
index a23b073..7db4ed0 100644
--- a/Test/baseResults/spv.precise.tese.out
+++ b/Test/baseResults/spv.precise.tese.out
@@ -36,10 +36,6 @@
                               Decorate 43 NoContraction
                               Decorate 62(in_f_color) RelaxedPrecision
                               Decorate 62(in_f_color) Location 0
-                              Decorate 67 RelaxedPrecision
-                              Decorate 68 RelaxedPrecision
-                              Decorate 69 RelaxedPrecision
-                              Decorate 70 RelaxedPrecision
                               Decorate 97 NoContraction
                               Decorate 99 NoContraction
                               Decorate 101 NoContraction
diff --git a/Test/baseResults/spv.subgroup.frag.out b/Test/baseResults/spv.subgroup.frag.out
index ad11586..a3e427f 100644
--- a/Test/baseResults/spv.subgroup.frag.out
+++ b/Test/baseResults/spv.subgroup.frag.out
@@ -24,6 +24,7 @@
                               Decorate 13(gl_SubgroupInvocationID) Flat
                               Decorate 13(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.subgroup.geom.out b/Test/baseResults/spv.subgroup.geom.out
index c866f8e..27f05b2 100644
--- a/Test/baseResults/spv.subgroup.geom.out
+++ b/Test/baseResults/spv.subgroup.geom.out
@@ -33,6 +33,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.subgroup.tesc.out b/Test/baseResults/spv.subgroup.tesc.out
index ed6b5c1..8322a4a 100644
--- a/Test/baseResults/spv.subgroup.tesc.out
+++ b/Test/baseResults/spv.subgroup.tesc.out
@@ -30,6 +30,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.subgroup.tese.out b/Test/baseResults/spv.subgroup.tese.out
index 70cdc96..360f98b 100644
--- a/Test/baseResults/spv.subgroup.tese.out
+++ b/Test/baseResults/spv.subgroup.tese.out
@@ -32,6 +32,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.subgroup.vert.out b/Test/baseResults/spv.subgroup.vert.out
index 34b090d..6de8a0a 100644
--- a/Test/baseResults/spv.subgroup.vert.out
+++ b/Test/baseResults/spv.subgroup.vert.out
@@ -29,6 +29,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/Test/baseResults/spv.uint.frag.out b/Test/baseResults/spv.uint.frag.out
index c19064d..7dbc3b3 100644
--- a/Test/baseResults/spv.uint.frag.out
+++ b/Test/baseResults/spv.uint.frag.out
@@ -75,6 +75,7 @@
                               Decorate 90 RelaxedPrecision
                               Decorate 91 RelaxedPrecision
                               Decorate 92 RelaxedPrecision
+                              Decorate 93 RelaxedPrecision
                               Decorate 97 RelaxedPrecision
                               Decorate 98 RelaxedPrecision
                               Decorate 101 RelaxedPrecision
diff --git a/Test/baseResults/uint.frag.out b/Test/baseResults/uint.frag.out
index 3a12d6b..ce6d02d 100644
--- a/Test/baseResults/uint.frag.out
+++ b/Test/baseResults/uint.frag.out
@@ -134,7 +134,7 @@
 0:59        Condition
 0:59        Compare Equal ( temp bool)
 0:59          'shiftedii' ( temp mediump int)
-0:59          Convert uint to int ( temp int)
+0:59          Convert uint to int ( temp mediump int)
 0:59            'shiftedui' ( temp mediump uint)
 0:59        true case
 0:60        move second child to first child ( temp mediump 4-component vector of uint)
@@ -433,7 +433,7 @@
 0:59        Condition
 0:59        Compare Equal ( temp bool)
 0:59          'shiftedii' ( temp mediump int)
-0:59          Convert uint to int ( temp int)
+0:59          Convert uint to int ( temp mediump int)
 0:59            'shiftedui' ( temp mediump uint)
 0:59        true case
 0:60        move second child to first child ( temp mediump 4-component vector of uint)
diff --git a/Test/baseResults/vulkan.ast.vert.out b/Test/baseResults/vulkan.ast.vert.out
index 05a6355..68e892b 100644
--- a/Test/baseResults/vulkan.ast.vert.out
+++ b/Test/baseResults/vulkan.ast.vert.out
@@ -19,10 +19,10 @@
 0:14      Convert bool to float ( temp float)
 0:14        'scbt' ( specialization-constant const bool)
 0:14          true (const bool)
-0:15      Convert int to float ( temp float)
+0:15      Convert int to float ( temp highp float)
 0:15        'sci2' ( specialization-constant const highp int)
 0:15          2 (const int)
-0:17      Convert float to int ( temp int)
+0:17      Convert float to int ( temp highp int)
 0:17        'scf1' ( specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int ( specialization-constant const int)
@@ -86,34 +86,34 @@
 0:35          2 (const int)
 0:35        'sci2' ( specialization-constant const highp int)
 0:35          2 (const int)
-0:37      Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:37      Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
-0:38      Construct ivec2 ( temp 2-element array of 2-component vector of int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38      Construct ivec2 ( temp 2-element array of highp 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:40      Construct vec2 ( specialization-constant const 2-component vector of float)
+0:40      Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
-0:41      Construct vec2 ( temp 2-element array of 2-component vector of float)
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41      Construct vec2 ( temp 2-element array of highp 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
@@ -150,10 +150,10 @@
 0:14      Convert bool to float ( temp float)
 0:14        'scbt' ( specialization-constant const bool)
 0:14          true (const bool)
-0:15      Convert int to float ( temp float)
+0:15      Convert int to float ( temp highp float)
 0:15        'sci2' ( specialization-constant const highp int)
 0:15          2 (const int)
-0:17      Convert float to int ( temp int)
+0:17      Convert float to int ( temp highp int)
 0:17        'scf1' ( specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int ( specialization-constant const int)
@@ -217,34 +217,34 @@
 0:35          2 (const int)
 0:35        'sci2' ( specialization-constant const highp int)
 0:35          2 (const int)
-0:37      Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:37      Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
-0:38      Construct ivec2 ( temp 2-element array of 2-component vector of int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38      Construct ivec2 ( temp 2-element array of highp 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:40      Construct vec2 ( specialization-constant const 2-component vector of float)
+0:40      Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
-0:41      Construct vec2 ( temp 2-element array of 2-component vector of float)
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41      Construct vec2 ( temp 2-element array of highp 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 1e6ab4a..595bd62 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -1643,6 +1643,7 @@
     ~TIntermAggregate() { delete pragmaTable; }
     virtual       TIntermAggregate* getAsAggregate()       { return this; }
     virtual const TIntermAggregate* getAsAggregate() const { return this; }
+    virtual void updatePrecision();
     virtual void setOperator(TOperator o) { op = o; }
     virtual       TIntermSequence& getSequence()       { return sequence; }
     virtual const TIntermSequence& getSequence() const { return sequence; }
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 0278445..1283f44 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -416,20 +416,24 @@
     // TODO: but, did this bypass constant folding?
     //
     switch (op) {
-    case EOpConstructInt8:
-    case EOpConstructUint8:
-    case EOpConstructInt16:
-    case EOpConstructUint16:
-    case EOpConstructInt:
-    case EOpConstructUint:
-    case EOpConstructInt64:
-    case EOpConstructUint64:
-    case EOpConstructBool:
-    case EOpConstructFloat:
-    case EOpConstructDouble:
-    case EOpConstructFloat16:
-        return child;
-    default: break; // some compilers want this
+        case EOpConstructInt8:
+        case EOpConstructUint8:
+        case EOpConstructInt16:
+        case EOpConstructUint16:
+        case EOpConstructInt:
+        case EOpConstructUint:
+        case EOpConstructInt64:
+        case EOpConstructUint64:
+        case EOpConstructBool:
+        case EOpConstructFloat:
+        case EOpConstructDouble:
+        case EOpConstructFloat16: {
+            TIntermUnary* unary_node = child->getAsUnaryNode();
+            if (unary_node != nullptr)
+                unary_node->updatePrecision();
+            return child;
+        }
+        default: break; // some compilers want this
     }
 
     //
@@ -3778,6 +3782,28 @@
 
 // Propagate precision qualifiers *up* from children to parent, and then
 // back *down* again to the children's subtrees.
+void TIntermAggregate::updatePrecision()
+{
+    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+        TPrecisionQualifier maxPrecision = EpqNone;
+        TIntermSequence operands = getSequence();
+        for (unsigned int i = 0; i < operands.size(); ++i) {
+            TIntermTyped* typedNode = operands[i]->getAsTyped();
+            assert(typedNode);
+            maxPrecision = std::max(maxPrecision, typedNode->getQualifier().precision);
+        }
+        getQualifier().precision = maxPrecision;
+        for (unsigned int i = 0; i < operands.size(); ++i) {
+          TIntermTyped* typedNode = operands[i]->getAsTyped();
+          assert(typedNode);
+          typedNode->propagatePrecision(maxPrecision);
+        }
+    }
+}
+
+// Propagate precision qualifiers *up* from children to parent, and then
+// back *down* again to the children's subtrees.
 void TIntermBinary::updatePrecision()
 {
      if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index b957bb8..a2dd5a6 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -7691,7 +7691,13 @@
             return nullptr;
     }
 
-    return intermediate.setAggregateOperator(aggrNode, op, type, loc);
+    TIntermTyped *ret_node = intermediate.setAggregateOperator(aggrNode, op, type, loc);
+
+    TIntermAggregate *agg_node = ret_node->getAsAggregate();
+    if (agg_node && agg_node->isVector()) 
+        agg_node->updatePrecision();
+
+    return ret_node;
 }
 
 // Function for constructor implementation. Calls addUnaryMath with appropriate EOp value