@@ -666,3 +666,80 @@ func.func @unrolled(%arg0: memref<2x4xf32>, %arg1: memref<1x2x4xf32>) {
666666 // PRODUCER-CONSUMER-MAXIMAL: affine.load %{{.*}}[0, %{{.*}}, %{{.*}}]
667667 return
668668}
669+
670+ // -----
671+
672+ // Exercises fix for crash reported at https://github.com/llvm/llvm-project/issues/139231
673+
674+ #map = affine_map <(d0 , d1 ) -> (d0 + d1 )>
675+ #map1 = affine_map <(d0 , d1 ) -> (d0 * 2 + d1 * 2 )>
676+ module {
677+ func.func @zero_candidates () {
678+ %cst = arith.constant 2.221140e+03 : f32
679+ %cst_0 = arith.constant 2.606200e+03 : f32
680+ %cst_1 = arith.constant 3.224000e+03 : f32
681+ %cst_2 = arith.constant 0.000000e+00 : f32
682+ %alloc = memref.alloc () {alignment = 64 : i64 } : memref <3 x7 x5 x6 xf32 >
683+ affine.for %arg0 = 0 to 3 {
684+ affine.for %arg1 = 0 to 7 {
685+ affine.for %arg2 = 0 to 5 {
686+ affine.for %arg3 = 0 to 6 {
687+ affine.store %cst_1 , %alloc [%arg0 , %arg1 , %arg2 , %arg3 ] : memref <3 x7 x5 x6 xf32 >
688+ }
689+ }
690+ }
691+ }
692+ %alloc_3 = memref.alloc () {alignment = 64 : i64 } : memref <3 x10 x7 x6 xf32 >
693+ %subview = memref.subview %alloc_3 [0 , 2 , 1 , 0 ] [3 , 7 , 5 , 6 ] [1 , 1 , 1 , 1 ] : memref <3 x10 x7 x6 xf32 > to memref <3 x7 x5 x6 xf32 , strided <[420 , 42 , 6 , 1 ], offset : 90 >>
694+ memref.copy %alloc , %subview : memref <3 x7 x5 x6 xf32 > to memref <3 x7 x5 x6 xf32 , strided <[420 , 42 , 6 , 1 ], offset : 90 >>
695+ %alloc_4 = memref.alloc () {alignment = 64 : i64 } : memref <3 x10 x3 x6 x1 xf32 >
696+ affine.for %arg0 = 0 to 3 {
697+ affine.for %arg1 = 0 to 10 {
698+ affine.for %arg2 = 0 to 3 {
699+ affine.for %arg3 = 0 to 6 {
700+ affine.for %arg4 = 0 to 1 {
701+ affine.store %cst_2 , %alloc_4 [%arg0 , %arg1 , %arg2 , %arg3 , %arg4 ] : memref <3 x10 x3 x6 x1 xf32 >
702+ }
703+ }
704+ }
705+ }
706+ }
707+ affine.for %arg0 = 0 to 3 {
708+ affine.for %arg1 = 0 to 10 {
709+ affine.for %arg2 = 0 to 3 {
710+ affine.for %arg3 = 0 to 6 {
711+ affine.for %arg4 = 0 to 1 {
712+ affine.for %arg5 = 0 to 1 {
713+ affine.for %arg6 = 0 to 2 {
714+ %0 = affine.apply #map (%arg1 , %arg5 )
715+ %1 = affine.apply #map1 (%arg2 , %arg6 )
716+ %2 = affine.load %alloc_3 [%arg0 , %0 , %1 , %arg3 ] : memref <3 x10 x7 x6 xf32 >
717+ %3 = affine.load %alloc_4 [%arg0 , %arg1 , %arg2 , %arg3 , %arg4 ] : memref <3 x10 x3 x6 x1 xf32 >
718+ %4 = arith.mulf %2 , %cst_0 : f32
719+ %5 = arith.addf %3 , %4 : f32
720+ affine.store %5 , %alloc_4 [%arg0 , %arg1 , %arg2 , %arg3 , %arg4 ] : memref <3 x10 x3 x6 x1 xf32 >
721+ }
722+ }
723+ }
724+ }
725+ }
726+ }
727+ }
728+ %alloc_5 = memref.alloc () {alignment = 64 : i64 } : memref <3 x10 x3 x6 xf32 >
729+ %expand_shape = memref.expand_shape %alloc_5 [[0 ], [1 ], [2 ], [3 , 4 ]] output_shape [3 , 10 , 3 , 6 , 1 ] : memref <3 x10 x3 x6 xf32 > into memref <3 x10 x3 x6 x1 xf32 >
730+ affine.for %arg0 = 0 to 3 {
731+ affine.for %arg1 = 0 to 10 {
732+ affine.for %arg2 = 0 to 3 {
733+ affine.for %arg3 = 0 to 6 {
734+ affine.for %arg4 = 0 to 1 {
735+ %0 = affine.load %alloc_4 [%arg0 , %arg1 , %arg2 , %arg3 , %arg4 ] : memref <3 x10 x3 x6 x1 xf32 >
736+ %1 = arith.addf %0 , %cst : f32
737+ affine.store %1 , %expand_shape [%arg0 , %arg1 , %arg2 , %arg3 , %arg4 ] : memref <3 x10 x3 x6 x1 xf32 >
738+ }
739+ }
740+ }
741+ }
742+ }
743+ return
744+ }
745+ }
0 commit comments