Skip to content

Commit 2f43dba

Browse files
committed
Guard VecShuffle identity rules with VecSize to prevent cross-size unification
VecShuffle2(Vec4, _, 0, 1) is a truncation to Vec2, not an identity. Without the guard, the egraph incorrectly unions Vec2 and Vec4 values into the same e-class, causing OpStore type mismatches when extraction picks the wrong-sized vector as canonical representative.
1 parent 73d87ab commit 2f43dba

1 file changed

Lines changed: 8 additions & 6 deletions

File tree

rust/spirv-tools-opt/src/rules/vector.egg

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -550,20 +550,22 @@
550550

551551
; -----------------------------------------------------------------------------
552552
; Identity shuffles - ONE-DIRECTIONAL to prevent explosion
553+
; Guard on VecSize to avoid incorrectly unifying vectors of different sizes.
554+
; VecShuffle2(Vec4, _, 0, 1) is a truncation to Vec2, NOT an identity.
553555
; -----------------------------------------------------------------------------
554-
(rule ((= e (VecShuffle2 v _ 0 1)))
556+
(rule ((= e (VecShuffle2 v _ 0 1)) (= 2 (VecSize v)))
555557
((union e v)))
556-
(rule ((= e (VecShuffle3 v _ 0 1 2)))
558+
(rule ((= e (VecShuffle3 v _ 0 1 2)) (= 3 (VecSize v)))
557559
((union e v)))
558-
(rule ((= e (VecShuffle4 v _ 0 1 2 3)))
560+
(rule ((= e (VecShuffle4 v _ 0 1 2 3)) (= 4 (VecSize v)))
559561
((union e v)))
560562

561563
; Same operand identity - ONE-DIRECTIONAL
562-
(rule ((= e (VecShuffle2 v v 0 1)))
564+
(rule ((= e (VecShuffle2 v v 0 1)) (= 2 (VecSize v)))
563565
((union e v)))
564-
(rule ((= e (VecShuffle3 v v 0 1 2)))
566+
(rule ((= e (VecShuffle3 v v 0 1 2)) (= 3 (VecSize v)))
565567
((union e v)))
566-
(rule ((= e (VecShuffle4 v v 0 1 2 3)))
568+
(rule ((= e (VecShuffle4 v v 0 1 2 3)) (= 4 (VecSize v)))
567569
((union e v)))
568570

569571
; -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)