diff --git a/Test/450.vert b/Test/450.vert
index 801f1c5041b7530901b984190e6b69490678211c..51e9b100430fd2879141ddad920baaa1d932d1e6 100644
--- a/Test/450.vert
+++ b/Test/450.vert
@@ -39,5 +39,10 @@ void foo()
     atomicCounterCompSwap(aui, ui, ui);  // ERROR, need 4.6
 
     int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6
+
+    bool b1;
+    anyInvocation(b1);        // ERROR, need 4.6
+    allInvocations(b1);       // ERROR, need 4.6
+    allInvocationsEqual(b1);  // ERROR, need 4.6
 }
 ; // ERROR: no extraneous semicolons
diff --git a/Test/460.frag b/Test/460.frag
index 3c32bc6f964398f7eb93a30421acdb1b3fa44bb7..43a7c3b389476b1b0e804891c31873ce650f1e7b 100644
--- a/Test/460.frag
+++ b/Test/460.frag
@@ -10,4 +10,8 @@ in S s;
 void main()
 {
     interpolateAtCentroid(s.v);
+    bool b1;
+    b1 = anyInvocation(b1);
+    b1 = allInvocations(b1);
+    b1 = allInvocationsEqual(b1);
 }
diff --git a/Test/460.vert b/Test/460.vert
index 17a916b4f610d781d7106216e6e6a16322c1bd51..fd87d8b1177d4b61a2f84daf53923c4ebd65eea9 100644
--- a/Test/460.vert
+++ b/Test/460.vert
@@ -6,6 +6,10 @@ float f;;;
 
 void main()
 {
+    bool b1;
+    b1 = anyInvocation(b1);
+    b1 = allInvocations(b1);
+    b1 = allInvocationsEqual(b1);
 }
 ;
 ;
diff --git a/Test/baseResults/450.vert.out b/Test/baseResults/450.vert.out
index b05a9a0dd4e2c1a3ff2894169cb5a4935a814631..64143de566024b5fb9c770e5eb808629c07fc840 100644
--- a/Test/baseResults/450.vert.out
+++ b/Test/baseResults/450.vert.out
@@ -15,8 +15,11 @@ ERROR: 0:41: 'gl_BaseVertex' : undeclared identifier
 ERROR: 0:41: 'gl_BaseInstance' : undeclared identifier 
 ERROR: 0:41: 'gl_DrawID' : undeclared identifier 
 ERROR: 0:41: '=' :  cannot convert from ' temp float' to ' temp int'
-ERROR: 0:43: 'extraneous semicolon' : not supported for this version or the enabled extensions 
-ERROR: 17 compilation errors.  No code generated.
+ERROR: 0:44: 'anyInvocation' : no matching overloaded function found 
+ERROR: 0:45: 'allInvocations' : no matching overloaded function found 
+ERROR: 0:46: 'allInvocationsEqual' : no matching overloaded function found 
+ERROR: 0:48: 'extraneous semicolon' : not supported for this version or the enabled extensions 
+ERROR: 20 compilation errors.  No code generated.
 
 
 Shader version: 450
@@ -55,6 +58,12 @@ ERROR: node is still EOpNull!
 0:38        0.000000
 0:39      Constant:
 0:39        0.000000
+0:44      Constant:
+0:44        0.000000
+0:45      Constant:
+0:45        0.000000
+0:46      Constant:
+0:46        0.000000
 0:?   Linker Objects
 0:?     'anon@0' ( out block{ out 3-element array of float CullDistance gl_CullDistance})
 0:?     'outb' ( smooth out bool)
diff --git a/Test/baseResults/460.frag.out b/Test/baseResults/460.frag.out
index cf4d5e2c746eae1c045595b6a921eb18f469fbcc..883d949b23c3bedd2cd833d2e95a9212fdffdb77 100755
--- a/Test/baseResults/460.frag.out
+++ b/Test/baseResults/460.frag.out
@@ -9,6 +9,18 @@ Shader version: 460
 0:12          's' ( smooth in structure{ global float f,  global 4-component vector of float v})
 0:12          Constant:
 0:12            1 (const int)
+0:14      move second child to first child ( temp bool)
+0:14        'b1' ( temp bool)
+0:14        anyInvocation ( global bool)
+0:14          'b1' ( temp bool)
+0:15      move second child to first child ( temp bool)
+0:15        'b1' ( temp bool)
+0:15        allInvocations ( global bool)
+0:15          'b1' ( temp bool)
+0:16      move second child to first child ( temp bool)
+0:16        'b1' ( temp bool)
+0:16        allInvocationsEqual ( global bool)
+0:16          'b1' ( temp bool)
 0:?   Linker Objects
 0:?     's' ( smooth in structure{ global float f,  global 4-component vector of float v})
 
@@ -26,6 +38,18 @@ Shader version: 460
 0:12          's' ( smooth in structure{ global float f,  global 4-component vector of float v})
 0:12          Constant:
 0:12            1 (const int)
+0:14      move second child to first child ( temp bool)
+0:14        'b1' ( temp bool)
+0:14        anyInvocation ( global bool)
+0:14          'b1' ( temp bool)
+0:15      move second child to first child ( temp bool)
+0:15        'b1' ( temp bool)
+0:15        allInvocations ( global bool)
+0:15          'b1' ( temp bool)
+0:16      move second child to first child ( temp bool)
+0:16        'b1' ( temp bool)
+0:16        allInvocationsEqual ( global bool)
+0:16          'b1' ( temp bool)
 0:?   Linker Objects
 0:?     's' ( smooth in structure{ global float f,  global 4-component vector of float v})
 
diff --git a/Test/baseResults/460.vert.out b/Test/baseResults/460.vert.out
index 63d75f3a551013bd5ad8de0d9b45dbbcb7e7e9ca..8fa659b307a3b1e37dbdb20bbb0a150608ed8bad 100755
--- a/Test/baseResults/460.vert.out
+++ b/Test/baseResults/460.vert.out
@@ -3,6 +3,19 @@ Shader version: 460
 0:? Sequence
 0:7  Function Definition: main( ( global void)
 0:7    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp bool)
+0:10        'b1' ( temp bool)
+0:10        anyInvocation ( global bool)
+0:10          'b1' ( temp bool)
+0:11      move second child to first child ( temp bool)
+0:11        'b1' ( temp bool)
+0:11        allInvocations ( global bool)
+0:11          'b1' ( temp bool)
+0:12      move second child to first child ( temp bool)
+0:12        'b1' ( temp bool)
+0:12        allInvocationsEqual ( global bool)
+0:12          'b1' ( temp bool)
 0:?   Linker Objects
 0:?     'i' ( global int)
 0:?     'f' ( global float)
@@ -17,6 +30,19 @@ Shader version: 460
 0:? Sequence
 0:7  Function Definition: main( ( global void)
 0:7    Function Parameters: 
+0:?     Sequence
+0:10      move second child to first child ( temp bool)
+0:10        'b1' ( temp bool)
+0:10        anyInvocation ( global bool)
+0:10          'b1' ( temp bool)
+0:11      move second child to first child ( temp bool)
+0:11        'b1' ( temp bool)
+0:11        allInvocations ( global bool)
+0:11          'b1' ( temp bool)
+0:12      move second child to first child ( temp bool)
+0:12        'b1' ( temp bool)
+0:12        allInvocationsEqual ( global bool)
+0:12          'b1' ( temp bool)
 0:?   Linker Objects
 0:?     'i' ( global int)
 0:?     'f' ( global float)
diff --git a/Test/baseResults/spv.460.comp.out b/Test/baseResults/spv.460.comp.out
new file mode 100755
index 0000000000000000000000000000000000000000..b9037b97c267d9fe9afd9a2cefa92013094aafff
--- /dev/null
+++ b/Test/baseResults/spv.460.comp.out
@@ -0,0 +1,33 @@
+spv.460.comp
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 15
+
+                              Capability Shader
+                              Capability SubgroupVoteKHR
+                              Extension  "SPV_KHR_subgroup_vote"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "b1"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeBool
+               7:             TypePointer Function 6(bool)
+         4(main):           2 Function None 3
+               5:             Label
+           8(b1):      7(ptr) Variable Function
+               9:     6(bool) Load 8(b1)
+              10:     6(bool) SubgroupAnyKHR 9
+                              Store 8(b1) 10
+              11:     6(bool) Load 8(b1)
+              12:     6(bool) SubgroupAllKHR 11
+                              Store 8(b1) 12
+              13:     6(bool) Load 8(b1)
+              14:     6(bool) SubgroupAllEqualKHR 13
+                              Store 8(b1) 14
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.460.comp b/Test/spv.460.comp
new file mode 100644
index 0000000000000000000000000000000000000000..eb671a38b3d773b85947e03c3b85ff76fab17961
--- /dev/null
+++ b/Test/spv.460.comp
@@ -0,0 +1,9 @@
+#version 460
+
+void main()
+{
+    bool b1;
+    b1 = anyInvocation(b1);
+    b1 = allInvocations(b1);
+    b1 = allInvocationsEqual(b1);
+}
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 885be687f465f4d6eef925a2aac2f4f02062d6a3..1beff771313efbf7347b011f09ddbf925768cca1 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1576,7 +1576,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
-        // GL_ARB_shader_group_vote
+    // GL_ARB_shader_group_vote
     if (profile != EEsProfile && version >= 430) {
         commonBuiltins.append(
             "bool anyInvocationARB(bool);"
@@ -1586,6 +1586,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
+    if (profile != EEsProfile && version >= 460) {
+        commonBuiltins.append(
+            "bool anyInvocation(bool);"
+            "bool allInvocations(bool);"
+            "bool allInvocationsEqual(bool);"
+
+            "\n");
+    }
+
 #ifdef AMD_EXTENSIONS
     // GL_AMD_shader_ballot
     if (profile != EEsProfile && version >= 450) {
@@ -5273,9 +5282,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
                 // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
                 SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
 
-            symbolTable.setFunctionExtensions("anyInvocationARB",       1, &E_GL_ARB_shader_group_vote);
-            symbolTable.setFunctionExtensions("allInvocationsARB",      1, &E_GL_ARB_shader_group_vote);
-            symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
+            if (version >= 430) {
+                symbolTable.setFunctionExtensions("anyInvocationARB",       1, &E_GL_ARB_shader_group_vote);
+                symbolTable.setFunctionExtensions("allInvocationsARB",      1, &E_GL_ARB_shader_group_vote);
+                symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
+            }
         }
 
 #ifdef AMD_EXTENSIONS
@@ -6087,10 +6098,16 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
             symbolTable.relateToOperator("readInvocationARB",               EOpReadInvocation);
             symbolTable.relateToOperator("readFirstInvocationARB",          EOpReadFirstInvocation);
 
-            symbolTable.relateToOperator("anyInvocationARB",                EOpAnyInvocation);
-            symbolTable.relateToOperator("allInvocationsARB",               EOpAllInvocations);
-            symbolTable.relateToOperator("allInvocationsEqualARB",          EOpAllInvocationsEqual);
-
+            if (version >= 430) {
+                symbolTable.relateToOperator("anyInvocationARB",            EOpAnyInvocation);
+                symbolTable.relateToOperator("allInvocationsARB",           EOpAllInvocations);
+                symbolTable.relateToOperator("allInvocationsEqualARB",      EOpAllInvocationsEqual);
+            }
+            if (version >= 460) {
+                symbolTable.relateToOperator("anyInvocation",               EOpAnyInvocation);
+                symbolTable.relateToOperator("allInvocations",              EOpAllInvocations);
+                symbolTable.relateToOperator("allInvocationsEqual",         EOpAllInvocationsEqual);
+            }
 #ifdef AMD_EXTENSIONS
             symbolTable.relateToOperator("minInvocationsAMD",                           EOpMinInvocations);
             symbolTable.relateToOperator("maxInvocationsAMD",                           EOpMaxInvocations);
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index a0d042c85e38ece02b64d39f75ef324033af11ff..86d5bbab10b904e0c5df891f4a4a44a9ceba1b32 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -362,6 +362,7 @@ INSTANTIATE_TEST_CASE_P(
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.460.frag",
         "spv.460.vert",
+        "spv.460.comp",
         "spv.atomic.comp",
         "spv.glFragColor.frag",
         "spv.specConst.vert",