bytedance / byteir

A model compilation solution for various hardware
https://byteir.ai
Apache License 2.0
379 stars 42 forks source link

[Compiler GPU] LLVM ERROR: operation destroyed but still has uses #41

Closed zhekunz2 closed 1 year ago

zhekunz2 commented 1 year ago

I'm getting LLVM ERROR: operation destroyed but still has uses when running gpu-opt pipeline. The erroring pass is ConvertFuncToGPUPass.

error msg:

../test.mlir:374:13: error: 'scf.for' op operation destroyed but still has uses
    %0:28 = scf.for %arg75 = %c0 to %c256 step %c1 iter_args(%arg76 = %alloc_0, %arg77 = %alloc_3, %arg78 = %alloc_4, %arg79 = %alloc_5, %arg80 = %alloc_6, %arg81 = %alloc_7, %arg82 = %alloc_8, %arg83 = %alloc_9, %arg84 = %alloc_10, %arg85 = %alloc_11, %arg86 = %alloc_12, %arg87 = %alloc_13, %arg88 = %alloc_14, %arg89 = %alloc_15, %arg90 = %alloc_16, %arg91 = %alloc_17, %arg92 = %alloc_18, %arg93 = %alloc_19, %arg94 = %alloc_20, %arg95 = %alloc_21, %arg96 = %alloc_22, %arg97 = %alloc_23, %arg98 = %alloc_24, %arg99 = %alloc_25, %arg100 = %alloc_26, %arg101 = %alloc_27, %arg102 = %alloc_28, %arg103 = %alloc_29) -> (memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>) {
            ^
../test.mlir:374:13: note: see current operation: 
%0:28 = "scf.for"(<<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>) ({
^bb0(%arg0: index, %arg1: memref<1x256x1024xf32>, %arg2: memref<1x256x1024xf32>, %arg3: memref<1x256x1024xf32>, %arg4: memref<1x256x1024xf32>, %arg5: memref<1x256x1024xf32>, %arg6: memref<1x256x1024xf32>, %arg7: memref<1x256x1024xf32>, %arg8: memref<1x256x1024xf32>, %arg9: memref<1x256x1024xf32>, %arg10: memref<1x256x1024xf32>, %arg11: memref<1x256x1024xf32>, %arg12: memref<1x256x1024xf32>, %arg13: memref<1x256x1024xf32>, %arg14: memref<1x256x1024xf32>, %arg15: memref<1x256x1024xf32>, %arg16: memref<1x256x1024xf32>, %arg17: memref<1x256x1024xf32>, %arg18: memref<1x256x1024xf32>, %arg19: memref<1x256x1024xf32>, %arg20: memref<1x256x1024xf32>, %arg21: memref<1x256x1024xf32>, %arg22: memref<1x256x1024xf32>, %arg23: memref<1x256x1024xf32>, %arg24: memref<1x256x1024xf32>, %arg25: memref<1x256x1024xf32>, %arg26: memref<1x256x1024xf32>, %arg27: memref<1x256x1024xf32>, %arg28: memref<1x256x1024xf32>):
...

LLVM ERROR: operation destroyed but still has uses

cmd to reproduce: byteir-opt --convert-func-to-gpu input.mlir

Input mlir:

func.func private @Unknown0(%arg0: memref<1x256x1024xf32>, %arg1: memref<256x1024xf16>, %arg2: memref<256x1024xf16>, %arg3: memref<256x1024xf16>, %arg4: memref<256x1024xf16>, %arg5: memref<256x1024xf16>, %arg6: memref<256x1024xf16>, %arg7: memref<256x1024xf16>, %arg8: memref<256x1024xf16>, %arg9: memref<256x1024xf16>, %arg10: memref<256x1024xf16>, %arg11: memref<256x1024xf16>, %arg12: memref<256x1024xf16>, %arg13: memref<256x1024xf16>, %arg14: memref<256x1024xf16>, %arg15: memref<256x1024xf16>, %arg16: memref<256x1024xf16>, %arg17: memref<256x1024xf16>, %arg18: memref<256x1024xf16>, %arg19: memref<256x1024xf16>, %arg20: memref<256x1024xf16>, %arg21: memref<256x1024xf16>, %arg22: memref<256x1024xf16>, %arg23: memref<256x1024xf16>, %arg24: memref<256x1024xf16>, %arg25: memref<256x1024xf16>, %arg26: memref<1x256x1xf32>, %arg27: memref<1x256x1xf32>, %arg28: memref<1024xf32>, %arg29: memref<256x1xf32>, %arg30: memref<256x1xf32>, %arg31: memref<1x256x1xf32>, %arg32: memref<1x256x1xf32>, %arg33: memref<256x1xf32>, %arg34: memref<256x1xf32>, %arg35: memref<1x256x1xf32>, %arg36: memref<1x256x1xf32>, %arg37: memref<256x1xf32>, %arg38: memref<256x1xf32>, %arg39: memref<1x256x1xf32>, %arg40: memref<1x256x1xf32>, %arg41: memref<256x1xf32>, %arg42: memref<256x1xf32>, %arg43: memref<1x256x1xf32>, %arg44: memref<1x256x1xf32>, %arg45: memref<256x1xf32>, %arg46: memref<256x1xf32>, %arg47: memref<1x256x1xf32>, %arg48: memref<1x256x1xf32>, %arg49: memref<256x1xf32>, %arg50: memref<256x1xf32>, %arg51: memref<1x256x1xf32>, %arg52: memref<1x256x1xf32>, %arg53: memref<256x1xf32>, %arg54: memref<256x1xf32>, %arg55: memref<1x256x1xf32>, %arg56: memref<1x256x1xf32>, %arg57: memref<256x1xf32>, %arg58: memref<256x1xf32>, %arg59: memref<1x256x1xf32>, %arg60: memref<1x256x1xf32>, %arg61: memref<256x1xf32>, %arg62: memref<256x1xf32>, %arg63: memref<1x256x1xf32>, %arg64: memref<1x256x1xf32>, %arg65: memref<256x1xf32>, %arg66: memref<256x1xf32>, %arg67: memref<1x256x1xf32>, %arg68: memref<1x256x1xf32>, %arg69: memref<256x1xf32>, %arg70: memref<256x1xf32>, %arg71: memref<1x256x1xf32>, %arg72: memref<1x256x1xf32>, %arg73: memref<256x1xf32>, %arg74: memref<256x1xf32>) -> (memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>) attributes {__byteir_elementwise_fusion__, __byteir_to_gpu__} {
  %cst = arith.constant 1.024000e+03 : f32
  %c1 = arith.constant 1 : index
  %c0 = arith.constant 0 : index
  %c256 = arith.constant 256 : index
  %c1024 = arith.constant 1024 : index
  %c262144 = arith.constant 262144 : index
  %alloc = memref.alloc() : memref<1x256x1024xf32>
  %alloca = memref.alloca() : memref<1x256x1024xf32>
  %alloc_0 = memref.alloc() : memref<256x1024xf32>
  memref.copy %alloca, %alloc : memref<1x256x1024xf32> to memref<1x256x1024xf32>
  %alloc_1 = memref.alloc() : memref<256x1024xf32>
  %alloca_2 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_3 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_4 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_5 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_6 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_7 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_8 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_9 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_10 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_11 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_12 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_13 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_14 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_15 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_16 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_17 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_18 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_19 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_20 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_21 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_22 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_23 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_24 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_25 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_26 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_27 = memref.alloca() : memref<1x256x1024xf32>
  %alloca_28 = memref.alloca() : memref<1x256x1024xf32>
  %0:28 = scf.for %arg75 = %c0 to %c256 step %c1 iter_args(%arg76 = %alloca, %arg77 = %alloca_2, %arg78 = %alloca_3, %arg79 = %alloca_4, %arg80 = %alloca_5, %arg81 = %alloca_6, %arg82 = %alloca_7, %arg83 = %alloca_8, %arg84 = %alloca_9, %arg85 = %alloca_10, %arg86 = %alloca_11, %arg87 = %alloca_12, %arg88 = %alloca_13, %arg89 = %alloca_14, %arg90 = %alloca_15, %arg91 = %alloca_16, %arg92 = %alloca_17, %arg93 = %alloca_18, %arg94 = %alloca_19, %arg95 = %alloca_20, %arg96 = %alloca_21, %arg97 = %alloca_22, %arg98 = %alloca_23, %arg99 = %alloca_24, %arg100 = %alloca_25, %arg101 = %alloca_26, %arg102 = %alloca_27, %arg103 = %alloca_28) -> (memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>) {
    %alloca_39 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_40 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_41 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_42 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_43 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_44 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_45 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_46 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_47 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_48 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_49 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_50 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_51 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_52 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_53 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_54 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_55 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_56 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_57 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_58 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_59 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_60 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_61 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_62 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_63 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_64 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_65 = memref.alloca() : memref<1x256x1024xf32>
    %alloca_66 = memref.alloca() : memref<1x256x1024xf32>
    %1:28 = scf.for %arg104 = %c0 to %c1024 step %c1 iter_args(%arg105 = %alloca_39, %arg106 = %alloca_40, %arg107 = %alloca_41, %arg108 = %alloca_42, %arg109 = %alloca_43, %arg110 = %alloca_44, %arg111 = %alloca_45, %arg112 = %alloca_46, %arg113 = %alloca_47, %arg114 = %alloca_48, %arg115 = %alloca_49, %arg116 = %alloca_50, %arg117 = %alloca_51, %arg118 = %alloca_52, %arg119 = %alloca_53, %arg120 = %alloca_54, %arg121 = %alloca_55, %arg122 = %alloca_56, %arg123 = %alloca_57, %arg124 = %alloca_58, %arg125 = %alloca_59, %arg126 = %alloca_60, %arg127 = %alloca_61, %arg128 = %alloca_62, %arg129 = %alloca_63, %arg130 = %alloca_64, %arg131 = %alloca_65, %arg132 = %alloca_66) -> (memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>) {
      %2 = arith.remsi %arg75, %c256 : index
      %3 = arith.cmpi slt, %2, %c0 : index
      %4 = arith.addi %2, %c256 : index
      %5 = arith.select %3, %4, %2 : index
      %6 = arith.cmpi slt, %arg104, %c0 : index
      %7 = arith.addi %arg104, %c1024 : index
      %8 = arith.select %6, %7, %arg104 : index
      %subview = memref.subview %alloc[0, %5, %8] [1, 1, 1] [1, 1, 1] : memref<1x256x1024xf32> to memref<f32, strided<[], offset: ?>>
      %alloca_67 = memref.alloca() : memref<f32>
      %alloca_68 = memref.alloca() : memref<f32>
      %alloca_69 = memref.alloca() : memref<f32>
      %alloca_70 = memref.alloca() : memref<f32>
      %alloca_71 = memref.alloca() : memref<f32>
      %alloca_72 = memref.alloca() : memref<f32>
      %alloca_73 = memref.alloca() : memref<f32>
      %alloca_74 = memref.alloca() : memref<f32>
      %alloca_75 = memref.alloca() : memref<f32>
      %alloca_76 = memref.alloca() : memref<f32>
      %alloca_77 = memref.alloca() : memref<f32>
      %alloca_78 = memref.alloca() : memref<f32>
      %alloca_79 = memref.alloca() : memref<f32>
      %alloca_80 = memref.alloca() : memref<f32>
      %alloca_81 = memref.alloca() : memref<f32>
      %alloca_82 = memref.alloca() : memref<f32>
      %alloca_83 = memref.alloca() : memref<f32>
      %alloca_84 = memref.alloca() : memref<f32>
      %alloca_85 = memref.alloca() : memref<f32>
      %alloca_86 = memref.alloca() : memref<f32>
      %alloca_87 = memref.alloca() : memref<f32>
      %alloca_88 = memref.alloca() : memref<f32>
      %alloca_89 = memref.alloca() : memref<f32>
      %alloca_90 = memref.alloca() : memref<f32>
      %alloca_91 = memref.alloca() : memref<f32>
      %alloca_92 = memref.alloca() : memref<f32>
      %alloca_93 = memref.alloca() : memref<f32>
      %9 = memref.load %arg25[%5, %8] : memref<256x1024xf16>
      %10 = memref.load %arg28[%8] : memref<1024xf32>
      %11 = memref.load %arg0[%c0, %5, %8] : memref<1x256x1024xf32>
      %12 = memref.load %arg1[%5, %8] : memref<256x1024xf16>
      %13 = memref.load %arg2[%5, %8] : memref<256x1024xf16>
      %14 = memref.load %arg3[%5, %8] : memref<256x1024xf16>
      %15 = memref.load %arg4[%5, %8] : memref<256x1024xf16>
      %16 = memref.load %arg5[%5, %8] : memref<256x1024xf16>
      %17 = memref.load %arg6[%5, %8] : memref<256x1024xf16>
      %18 = memref.load %arg7[%5, %8] : memref<256x1024xf16>
      %19 = memref.load %arg8[%5, %8] : memref<256x1024xf16>
      %20 = memref.load %arg9[%5, %8] : memref<256x1024xf16>
      %21 = memref.load %arg10[%5, %8] : memref<256x1024xf16>
      %22 = memref.load %arg11[%5, %8] : memref<256x1024xf16>
      %23 = memref.load %arg12[%5, %8] : memref<256x1024xf16>
      %24 = memref.load %arg13[%5, %8] : memref<256x1024xf16>
      %25 = memref.load %arg14[%5, %8] : memref<256x1024xf16>
      %26 = memref.load %arg15[%5, %8] : memref<256x1024xf16>
      %27 = memref.load %arg16[%5, %8] : memref<256x1024xf16>
      %28 = memref.load %arg17[%5, %8] : memref<256x1024xf16>
      %29 = memref.load %arg18[%5, %8] : memref<256x1024xf16>
      %30 = memref.load %arg19[%5, %8] : memref<256x1024xf16>
      %31 = memref.load %arg20[%5, %8] : memref<256x1024xf16>
      %32 = memref.load %arg21[%5, %8] : memref<256x1024xf16>
      %33 = memref.load %arg22[%5, %8] : memref<256x1024xf16>
      %34 = memref.load %arg23[%5, %8] : memref<256x1024xf16>
      %35 = memref.load %arg24[%5, %8] : memref<256x1024xf16>
      %36 = memref.load %arg26[%c0, %5, %c0] : memref<1x256x1xf32>
      %37 = memref.load %arg27[%c0, %5, %c0] : memref<1x256x1xf32>
      %38 = memref.load %arg31[%c0, %5, %c0] : memref<1x256x1xf32>
      %39 = memref.load %arg32[%c0, %5, %c0] : memref<1x256x1xf32>
      %40 = memref.load %arg35[%c0, %5, %c0] : memref<1x256x1xf32>
      %41 = memref.load %arg36[%c0, %5, %c0] : memref<1x256x1xf32>
      %42 = memref.load %arg39[%c0, %5, %c0] : memref<1x256x1xf32>
      %43 = memref.load %arg40[%c0, %5, %c0] : memref<1x256x1xf32>
      %44 = memref.load %arg43[%c0, %5, %c0] : memref<1x256x1xf32>
      %45 = memref.load %arg44[%c0, %5, %c0] : memref<1x256x1xf32>
      %46 = memref.load %arg47[%c0, %5, %c0] : memref<1x256x1xf32>
      %47 = memref.load %arg48[%c0, %5, %c0] : memref<1x256x1xf32>
      %48 = memref.load %arg51[%c0, %5, %c0] : memref<1x256x1xf32>
      %49 = memref.load %arg52[%c0, %5, %c0] : memref<1x256x1xf32>
      %50 = memref.load %arg55[%c0, %5, %c0] : memref<1x256x1xf32>
      %51 = memref.load %arg56[%c0, %5, %c0] : memref<1x256x1xf32>
      %52 = memref.load %arg59[%c0, %5, %c0] : memref<1x256x1xf32>
      %53 = memref.load %arg60[%c0, %5, %c0] : memref<1x256x1xf32>
      %54 = memref.load %arg63[%c0, %5, %c0] : memref<1x256x1xf32>
      %55 = memref.load %arg64[%c0, %5, %c0] : memref<1x256x1xf32>
      %56 = memref.load %arg67[%c0, %5, %c0] : memref<1x256x1xf32>
      %57 = memref.load %arg68[%c0, %5, %c0] : memref<1x256x1xf32>
      %58 = memref.load %arg71[%c0, %5, %c0] : memref<1x256x1xf32>
      %59 = memref.load %arg72[%c0, %5, %c0] : memref<1x256x1xf32>
      %60 = memref.load %arg73[%arg75, %c0] : memref<256x1xf32>
      %61 = memref.load %arg74[%arg75, %c0] : memref<256x1xf32>
      %62 = arith.extf %34 : f16 to f32
      %63 = arith.extf %32 : f16 to f32
      %64 = arith.extf %30 : f16 to f32
      %65 = arith.extf %28 : f16 to f32
      %66 = arith.extf %26 : f16 to f32
      %67 = arith.extf %24 : f16 to f32
      %68 = arith.extf %22 : f16 to f32
      %69 = arith.extf %20 : f16 to f32
      %70 = arith.extf %18 : f16 to f32
      %71 = arith.extf %16 : f16 to f32
      %72 = arith.extf %14 : f16 to f32
      %73 = arith.extf %12 : f16 to f32
      %74 = arith.addf %11, %73 : f32
      %75 = arith.extf %13 : f16 to f32
      %76 = arith.addf %74, %75 : f32
      %77 = arith.addf %76, %72 : f32
      %78 = arith.extf %15 : f16 to f32
      %79 = arith.addf %77, %78 : f32
      %80 = arith.addf %79, %71 : f32
      %81 = arith.extf %17 : f16 to f32
      %82 = arith.addf %80, %81 : f32
      %83 = arith.addf %82, %70 : f32
      %84 = arith.extf %19 : f16 to f32
      %85 = arith.addf %83, %84 : f32
      %86 = arith.addf %85, %69 : f32
      %87 = arith.extf %21 : f16 to f32
      %88 = arith.addf %86, %87 : f32
      %89 = arith.addf %88, %68 : f32
      %90 = arith.extf %23 : f16 to f32
      %91 = arith.addf %89, %90 : f32
      %92 = arith.addf %91, %67 : f32
      %93 = arith.extf %25 : f16 to f32
      %94 = arith.addf %92, %93 : f32
      %95 = arith.addf %94, %66 : f32
      %96 = arith.extf %27 : f16 to f32
      %97 = arith.addf %95, %96 : f32
      %98 = arith.addf %97, %65 : f32
      %99 = arith.extf %29 : f16 to f32
      %100 = arith.addf %98, %99 : f32
      %101 = arith.addf %100, %64 : f32
      %102 = arith.extf %31 : f16 to f32
      %103 = arith.addf %101, %102 : f32
      %104 = arith.addf %103, %63 : f32
      %105 = arith.extf %33 : f16 to f32
      %106 = arith.addf %104, %105 : f32
      %107 = arith.addf %106, %62 : f32
      %108 = arith.extf %35 : f16 to f32
      %109 = arith.addf %107, %108 : f32
      %110 = arith.subf %109, %36 : f32
      %111 = arith.mulf %110, %37 : f32
      %112 = arith.extf %9 : f16 to f32
      %113 = arith.mulf %112, %10 : f32
      %114 = arith.mulf %113, %cst : f32
      %115 = arith.mulf %113, %111 : f32
      %116 = arith.mulf %112, %111 : f32
      %117 = arith.subf %106, %38 : f32
      %118 = arith.mulf %117, %39 : f32
      %119 = arith.subf %103, %40 : f32
      %120 = arith.mulf %119, %41 : f32
      %121 = arith.subf %100, %42 : f32
      %122 = arith.mulf %121, %43 : f32
      %123 = arith.subf %97, %44 : f32
      %124 = arith.mulf %123, %45 : f32
      %125 = arith.subf %94, %46 : f32
      %126 = arith.mulf %125, %47 : f32
      %127 = arith.subf %91, %48 : f32
      %128 = arith.mulf %127, %49 : f32
      %129 = arith.subf %88, %50 : f32
      %130 = arith.mulf %129, %51 : f32
      %131 = arith.subf %85, %52 : f32
      %132 = arith.mulf %131, %53 : f32
      %133 = arith.subf %82, %54 : f32
      %134 = arith.mulf %133, %55 : f32
      %135 = arith.subf %79, %56 : f32
      %136 = arith.mulf %135, %57 : f32
      %137 = arith.subf %76, %58 : f32
      %138 = arith.mulf %137, %59 : f32
      %139 = arith.subf %74, %60 : f32
      %140 = arith.mulf %139, %61 : f32
      memref.store %111, %alloc[%c0, %5, %8] : memref<1x256x1024xf32>
      memref.store %77, %alloca_67[] : memref<f32>
      memref.store %80, %alloca_68[] : memref<f32>
      memref.store %83, %alloca_69[] : memref<f32>
      memref.store %86, %alloca_70[] : memref<f32>
      memref.store %89, %alloca_71[] : memref<f32>
      memref.store %92, %alloca_72[] : memref<f32>
      memref.store %95, %alloca_73[] : memref<f32>
      memref.store %98, %alloca_74[] : memref<f32>
      memref.store %101, %alloca_75[] : memref<f32>
      memref.store %104, %alloca_76[] : memref<f32>
      memref.store %107, %alloca_77[] : memref<f32>
      memref.store %112, %alloca_78[] : memref<f32>
      memref.store %113, %alloca_79[] : memref<f32>
      memref.store %114, %alloca_80[] : memref<f32>
      memref.store %115, %alloca_81[] : memref<f32>
      memref.store %116, %alloca_82[] : memref<f32>
      memref.store %118, %alloca_83[] : memref<f32>
      memref.store %120, %alloca_84[] : memref<f32>
      memref.store %122, %alloca_85[] : memref<f32>
      memref.store %124, %alloca_86[] : memref<f32>
      memref.store %126, %alloca_87[] : memref<f32>
      memref.store %128, %alloca_88[] : memref<f32>
      memref.store %130, %alloca_89[] : memref<f32>
      memref.store %132, %alloca_90[] : memref<f32>
      memref.store %134, %alloca_91[] : memref<f32>
      memref.store %136, %alloca_92[] : memref<f32>
      memref.store %138, %alloca_93[] : memref<f32>
      memref.store %140, %alloc_1[%arg75, %arg104] : memref<256x1024xf32>
      memref.copy %alloca_67, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_68, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_69, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_70, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_71, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_72, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_73, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_74, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_75, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_76, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_77, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_78, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_79, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_80, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_81, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_82, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_83, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_84, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_85, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_86, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_87, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_88, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_89, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_90, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_91, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_92, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      memref.copy %alloca_93, %subview : memref<f32> to memref<f32, strided<[], offset: ?>>
      scf.yield %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc, %alloc : memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>
    }
    scf.yield %1#0, %1#1, %1#2, %1#3, %1#4, %1#5, %1#6, %1#7, %1#8, %1#9, %1#10, %1#11, %1#12, %1#13, %1#14, %1#15, %1#16, %1#17, %1#18, %1#19, %1#20, %1#21, %1#22, %1#23, %1#24, %1#25, %1#26, %1#27 : memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_29 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#1[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg69[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg70[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_29[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_30 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#2[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg65[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg66[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_30[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_31 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#3[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg61[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg62[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_31[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_32 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#4[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg57[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg58[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_32[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_33 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#5[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg53[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg54[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_33[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_34 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#6[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg49[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg50[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_34[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_35 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#7[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg45[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg46[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_35[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_36 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#8[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg41[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg42[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_36[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_37 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#9[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg37[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg38[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_37[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  %alloc_38 = memref.alloc() : memref<256x1024xf32>
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#10[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg33[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg34[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_38[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  scf.for %arg75 = %c0 to %c262144 step %c1 {
    %1 = arith.remsi %arg75, %c1024 : index
    %2 = arith.divsi %arg75, %c1024 : index
    %3 = arith.remsi %2, %c256 : index
    %4 = arith.remsi %1, %c1024 : index
    %5 = memref.load %0#11[%c0, %3, %4] : memref<1x256x1024xf32>
    %6 = memref.load %arg29[%2, %c0] : memref<256x1xf32>
    %7 = memref.load %arg30[%2, %c0] : memref<256x1xf32>
    %8 = arith.subf %5, %6 : f32
    %9 = arith.mulf %8, %7 : f32
    memref.store %9, %alloc_0[%2, %1] : memref<256x1024xf32>
  } {__byteir_coarsen_simt__, __byteir_loop_to_simt__ = "linear_id.x"}
  return %0#12, %0#0, %0#13, %0#14, %0#15, %0#16, %alloc_0, %0#17, %alloc_38, %0#18, %alloc_37, %0#19, %alloc_36, %0#20, %alloc_35, %0#21, %alloc_34, %0#22, %alloc_33, %0#23, %alloc_32, %0#24, %alloc_31, %0#25, %alloc_30, %0#26, %alloc_29, %0#27, %alloc_1 : memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>, memref<1x256x1024xf32>, memref<256x1024xf32>
}

cc: @liwenchangbdbz @yaochengji

yaochengji commented 1 year ago

I temporarily disabled the op erasion here, And then I found a new error, which is because the argument of the func is set to a new memspace, a SubViewOp uses it as an operand but its result type doesn't change.

I'm not familiar with this pass, @xrzhang111 you might have more knowledge about it.

yaochengji commented 1 year ago

It is because there's a bug in a previous pass, fixed

yaochengji commented 1 year ago

@zhekunz2 Could you use the branch locally first to see whether this can solve your problem?

zhekunz2 commented 1 year ago

@yaochengji Hitting CUDA_ERROR_INVALID_VALUE during runtime with the fix.

zhekunz2 commented 1 year ago

problem solved by https://github.com/bytedance/byteir/pull/48