Skip to content

Failed to deduce type of memcpy despite TT available #138

Closed
@ZuseZ4

Description

@ZuseZ4
error: src/lib.rs:135:12: in function preprocess__ZN5piprx4dist17h657d2c8133076679E void (ptr, ptr): Enzyme: Cannot deduce type of copy   call void @llvm.memcpy.p0.p0.i64(ptr align 8 "enzyme_type"="{[-1]:Pointer, [-1,0]:Float@double, [-1,8]:Float@double, [-1,16]:Float@double, [-1,24]:Float@double, [-1,32]:Float@double, [-1,40]:Float@double, [-1,48]:Float@double, [-1,56]:Float@double, [-1,64]:Float@double, [-1,72]:Float@double}" %0, ptr align 8 "enzyme_type"="{[-1]:Pointer, [-1,0]:Float@double, [-1,8]:Float@double, [-1,16]:Float@double, [-1,24]:Float@double, [-1,32]:Float@double, [-1,40]:Float@double, [-1,48]:Float@double, [-1,56]:Float@double, [-1,64]:Float@double, [-1,72]:Float@double}" %5, i64 80, i1 false) #119, !dbg !3164
; Function Attrs: mustprogress nonlazybind sanitize_hwaddress willreturn uwtable
define internal void @preprocess__ZN5piprx4dist17h657d2c8133076679E(ptr sret([10 x double]) align 8 %0, ptr align 8 %1) unnamed_addr #113 !dbg !190156 {
  %3 = tail call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) ptr @malloc(i64 16), !enzyme_fromstack !3202
  %4 = tail call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) ptr @malloc(i64 16), !enzyme_fromstack !3202
  %5 = tail call noalias nonnull dereferenceable(80) dereferenceable_or_null(80) ptr @malloc(i64 80), !enzyme_fromstack !3202
  call void @llvm.dbg.value(metadata ptr %1, metadata !190158, metadata !DIExpression()), !dbg !190171
  call void @llvm.dbg.declare(metadata ptr %5, metadata !190159, metadata !DIExpression()) #119, !dbg !190172
  call void @llvm.dbg.declare(metadata ptr %3, metadata !190163, metadata !DIExpression()) #119, !dbg !190173
  call void @llvm.dbg.declare(metadata ptr %4, metadata !190167, metadata !DIExpression()) #119, !dbg !190174
  %6 = icmp ne ptr %1, null
  call void @llvm.assume(i1 %6)
  %7 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 0, !dbg !190175
  br label %8, !dbg !190175

8:                                                ; preds = %12, %2
  %9 = phi i64 [ %10, %12 ], [ 0, %2 ]
  %10 = add nuw nsw i64 %9, 1
  %11 = icmp ult i64 %9, 10
  br i1 %11, label %12, label %14

12:                                               ; preds = %8
  %13 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 %9
  store double 0.000000e+00, ptr %13, align 8
  br label %8

14:                                               ; preds = %8
  call void @llvm.dbg.value(metadata i64 0, metadata !190161, metadata !DIExpression()), !dbg !190176
  %15 = call { i64, i64 } @"_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hd81a812a0bda06d9E"(i64 0, i64 5) #119, !dbg !190177
  %16 = extractvalue { i64, i64 } %15, 0, !dbg !190177
  %17 = extractvalue { i64, i64 } %15, 1, !dbg !190177
  %18 = getelementptr inbounds { i64, i64 }, ptr %3, i32 0, i32 0, !dbg !190177
  store i64 %16, ptr %18, align 8, !dbg !190177
  %19 = getelementptr inbounds { i64, i64 }, ptr %3, i32 0, i32 1, !dbg !190177
  store i64 %17, ptr %19, align 8, !dbg !190177
  br label %21, !dbg !190178

20:                                               ; preds = %42
  br label %21, !dbg !190173

21:                                               ; preds = %20, %14
  %22 = phi i64 [ %24, %20 ], [ 0, %14 ], !dbg !190179
  %23 = phi i64 [ 0, %14 ], [ %44, %20 ], !dbg !190179
  call void @llvm.dbg.value(metadata i64 %23, metadata !190161, metadata !DIExpression()), !dbg !190176
  %24 = add nuw nsw i64 %22, 1, !dbg !190173
  %25 = call { i64, i64 } @"_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h234b36616e4ca986E"(ptr align 8 %3) #119, !dbg !190173
  %26 = extractvalue { i64, i64 } %25, 0, !dbg !190173
  %27 = extractvalue { i64, i64 } %25, 1, !dbg !190173
  %28 = icmp eq i64 %26, 0, !dbg !190173
  br i1 %28, label %29, label %30, !dbg !190173

29:                                               ; preds = %21
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 "enzyme_type"="{[-1]:Pointer, [-1,0]:Float@double, [-1,8]:Float@double, [-1,16]:Float@double, [-1,24]:Float@double, [-1,32]:Float@double, [-1,40]:Float@double, [-1,48]:Float@double, [-1,56]:Float@double, [-1,64]:Float@double, [-1,72]:Float@double}" %0, ptr align 8 "enzyme_type"="{[-1]:Pointer, [-1,0]:Float@double, [-1,8]:Float@double, [-1,16]:Float@double, [-1,24]:Float@double, [-1,32]:Float@double, [-1,40]:Float@double, [-1,48]:Float@double, [-1,56]:Float@double, [-1,64]:Float@double, [-1,72]:Float@double}" %5, i64 80, i1 false) #119, !dbg !190180
  ret void, !dbg !190181

30:                                               ; preds = %21
  call void @llvm.dbg.value(metadata i64 %27, metadata !190165, metadata !DIExpression()), !dbg !190182
  %31 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %27, i64 1) #119, !dbg !190183
  %32 = extractvalue { i64, i1 } %31, 0, !dbg !190183
  %33 = extractvalue { i64, i1 } %31, 1, !dbg !190183
  %34 = call i1 @llvm.expect.i1(i1 %33, i1 false) #119, !dbg !190183
  br i1 %34, label %41, label %35, !dbg !190183

35:                                               ; preds = %30
  %36 = call { i64, i64 } @"_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hd81a812a0bda06d9E"(i64 %32, i64 5) #119, !dbg !190183
  %37 = extractvalue { i64, i64 } %36, 0, !dbg !190183
  %38 = extractvalue { i64, i64 } %36, 1, !dbg !190183
  %39 = getelementptr inbounds { i64, i64 }, ptr %4, i32 0, i32 0, !dbg !190183
  store i64 %37, ptr %39, align 8, !dbg !190183
  %40 = getelementptr inbounds { i64, i64 }, ptr %4, i32 0, i32 1, !dbg !190183
  store i64 %38, ptr %40, align 8, !dbg !190183
  br label %42, !dbg !190184

41:                                               ; preds = %30
  call void @_ZN4core9panicking5panic17hf6199135677a2fddE(ptr align 1 @str.0.978, i64 28, ptr align 8 @anon.ff61d960785f6488f4b9f526694dd4fc.11) #120, !dbg !190183
  unreachable, !dbg !190183

42:                                               ; preds = %67, %35
  %43 = phi i64 [ %45, %67 ], [ 0, %35 ], !dbg !190185
  %44 = add i64 %23, %43, !dbg !190176
  %45 = add nuw nsw i64 %43, 1, !dbg !190174
  call void @llvm.dbg.value(metadata i64 %44, metadata !190161, metadata !DIExpression()), !dbg !190176
  %46 = call { i64, i64 } @"_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h234b36616e4ca986E"(ptr align 8 %4) #119, !dbg !190174
  %47 = extractvalue { i64, i64 } %46, 0, !dbg !190174
  %48 = extractvalue { i64, i64 } %46, 1, !dbg !190174
  %49 = icmp eq i64 %47, 0, !dbg !190174
  br i1 %49, label %20, label %50, !dbg !190174

50:                                               ; preds = %42
  call void @llvm.dbg.value(metadata i64 %48, metadata !190169, metadata !DIExpression()), !dbg !190186
  %51 = icmp ne ptr %1, null
  call void @llvm.assume(i1 %51)
  %52 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 3, i64 %27) #119, !dbg !190187
  %53 = extractvalue { i64, i1 } %52, 0, !dbg !190187
  %54 = extractvalue { i64, i1 } %52, 1, !dbg !190187
  %55 = call i1 @llvm.expect.i1(i1 %54, i1 false) #119, !dbg !190187
  br i1 %55, label %61, label %56, !dbg !190187

56:                                               ; preds = %50
  %57 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 3, i64 %48) #119, !dbg !190188
  %58 = extractvalue { i64, i1 } %57, 0, !dbg !190188
  %59 = extractvalue { i64, i1 } %57, 1, !dbg !190188
  %60 = call i1 @llvm.expect.i1(i1 %59, i1 false) #119, !dbg !190188
  br i1 %60, label %66, label %62, !dbg !190188

61:                                               ; preds = %50
  call void @_ZN4core9panicking5panic17hf6199135677a2fddE(ptr align 1 @str.1.979, i64 33, ptr align 8 @anon.ff61d960785f6488f4b9f526694dd4fc.12) #120, !dbg !190187
  unreachable, !dbg !190187

62:                                               ; preds = %56
  %63 = call double @_ZN5piprx10point_dist17h3c858950b64dd638E(ptr align 8 %1, i64 %53, i64 %58) #119, !dbg !190189
  %64 = icmp ult i64 %44, 10, !dbg !190190
  %65 = call i1 @llvm.expect.i1(i1 %64, i1 true) #119, !dbg !190190
  br i1 %65, label %67, label %73, !dbg !190190

66:                                               ; preds = %56
  call void @_ZN4core9panicking5panic17hf6199135677a2fddE(ptr align 1 @str.1.979, i64 33, ptr align 8 @anon.ff61d960785f6488f4b9f526694dd4fc.13) #120, !dbg !190188
  unreachable, !dbg !190188

67:                                               ; preds = %62
  %68 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 %44, !dbg !190190
  store double %63, ptr %68, align 8, !dbg !190190
  %69 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %44, i64 1) #119, !dbg !190191
  %70 = extractvalue { i64, i1 } %69, 0, !dbg !190191
  %71 = extractvalue { i64, i1 } %69, 1, !dbg !190191
  %72 = call i1 @llvm.expect.i1(i1 %71, i1 false) #119, !dbg !190191
  br i1 %72, label %74, label %42, !dbg !190191

73:                                               ; preds = %62
  call void @_ZN4core9panicking18panic_bounds_check17hd24c5614210bdda4E(i64 %44, i64 10, ptr align 8 @anon.ff61d960785f6488f4b9f526694dd4fc.14) #120, !dbg !190190
  unreachable, !dbg !190190

74:                                               ; preds = %67
  call void @_ZN4core9panicking5panic17hf6199135677a2fddE(ptr align 1 @str.0.978, i64 28, ptr align 8 @anon.ff61d960785f6488f4b9f526694dd4fc.15) #120, !dbg !190191
  unreachable, !dbg !190191
}

<analysis>
  %51 = icmp ne ptr %1, null: {[-1]:Integer}, intvals: {}
  %24 = add nuw nsw i64 %22, 1, !dbg !3157: {[-1]:Integer}, intvals: {1,}
  %7 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 0, !dbg !3159: {[-1]:Pointer}, intvals: {}
  %25 = call { i64, i64 } @"_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h234b36616e4ca986E"(ptr align 8 %3) #119, !dbg !3157: {}, intvals: {}
  %10 = add nuw nsw i64 %9, 1: {[-1]:Integer}, intvals: {1,2,3,4,5,6,7,8,9,10,11,}
  %48 = extractvalue { i64, i64 } %46, 1, !dbg !3158: {}, intvals: {}
ptr %0: {[-1]:Pointer}, intvals: {}
ptr %1: {[-1]:Pointer}, intvals: {}
  %31 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %27, i64 1) #119, !dbg !3167: {[8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
  %32 = extractvalue { i64, i1 } %31, 0, !dbg !3167: {}, intvals: {}
  %33 = extractvalue { i64, i1 } %31, 1, !dbg !3167: {}, intvals: {}
  %47 = extractvalue { i64, i64 } %46, 0, !dbg !3158: {}, intvals: {}
  %22 = phi i64 [ %24, %20 ], [ 0, %14 ], !dbg !3163: {[-1]:Integer}, intvals: {0,}
  %3 = tail call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) ptr @malloc(i64 16), !enzyme_fromstack !3154: {[-1]:Pointer, [-1,-1]:Integer}, intvals: {}
  %44 = add i64 %23, %43, !dbg !3160: {[-1]:Integer}, intvals: {0,}
  %68 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 %44, !dbg !3174: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {}
  %69 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %44, i64 1) #119, !dbg !3175: {[-1]:Integer}, intvals: {}
  %70 = extractvalue { i64, i1 } %69, 0, !dbg !3175: {[-1]:Integer}, intvals: {}
  %71 = extractvalue { i64, i1 } %69, 1, !dbg !3175: {}, intvals: {}
  %28 = icmp eq i64 %26, 0, !dbg !3157: {[-1]:Integer}, intvals: {}
  %9 = phi i64 [ %10, %12 ], [ 0, %2 ]: {[-1]:Integer}, intvals: {0,1,2,3,4,5,6,7,8,9,10,}
  %11 = icmp ult i64 %9, 10: {[-1]:Integer}, intvals: {}
  %15 = call { i64, i64 } @"_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hd81a812a0bda06d9E"(i64 0, i64 5) #119, !dbg !3161: {[0]:Anything, [1]:Anything, [2]:Anything, [3]:Anything, [4]:Anything, [5]:Anything, [6]:Anything, [7]:Anything, [8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
  %16 = extractvalue { i64, i64 } %15, 0, !dbg !3161: {[-1]:Anything}, intvals: {}
  %23 = phi i64 [ 0, %14 ], [ %44, %20 ], !dbg !3163: {[-1]:Integer}, intvals: {0,}
  %6 = icmp ne ptr %1, null: {[-1]:Integer}, intvals: {}
  %4 = tail call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) ptr @malloc(i64 16), !enzyme_fromstack !3154: {[-1]:Pointer}, intvals: {}
  %46 = call { i64, i64 } @"_ZN4core4iter5range101_$LT$impl$u20$core..iter..traits..iterator..Iterator$u20$for$u20$core..ops..range..Range$LT$A$GT$$GT$4next17h234b36616e4ca986E"(ptr align 8 %4) #119, !dbg !3158: {}, intvals: {}
  %17 = extractvalue { i64, i64 } %15, 1, !dbg !3161: {[-1]:Integer}, intvals: {}
  %18 = getelementptr inbounds { i64, i64 }, ptr %3, i32 0, i32 0, !dbg !3161: {[-1]:Pointer, [-1,-1]:Integer}, intvals: {}
  %19 = getelementptr inbounds { i64, i64 }, ptr %3, i32 0, i32 1, !dbg !3161: {[-1]:Pointer, [-1,-1]:Integer}, intvals: {}
  %5 = tail call noalias nonnull dereferenceable(80) dereferenceable_or_null(80) ptr @malloc(i64 80), !enzyme_fromstack !3154: {[-1]:Pointer}, intvals: {}
  %52 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 3, i64 %27) #119, !dbg !3171: {[8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
  %53 = extractvalue { i64, i1 } %52, 0, !dbg !3171: {}, intvals: {}
  %54 = extractvalue { i64, i1 } %52, 1, !dbg !3171: {}, intvals: {}
  %57 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 3, i64 %48) #119, !dbg !3172: {[8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
  %58 = extractvalue { i64, i1 } %57, 0, !dbg !3172: {}, intvals: {}
  %59 = extractvalue { i64, i1 } %57, 1, !dbg !3172: {}, intvals: {}
  %63 = call double @_ZN5piprx10point_dist17h3c858950b64dd638E(ptr align 8 %1, i64 %53, i64 %58) #119, !dbg !3173: {[-1]:Float@double}, intvals: {}
  %36 = call { i64, i64 } @"_ZN63_$LT$I$u20$as$u20$core..iter..traits..collect..IntoIterator$GT$9into_iter17hd81a812a0bda06d9E"(i64 %32, i64 5) #119, !dbg !3167: {[8]:Integer, [9]:Integer, [10]:Integer, [11]:Integer, [12]:Integer, [13]:Integer, [14]:Integer, [15]:Integer}, intvals: {}
  %37 = extractvalue { i64, i64 } %36, 0, !dbg !3167: {}, intvals: {}
  %38 = extractvalue { i64, i64 } %36, 1, !dbg !3167: {[-1]:Integer}, intvals: {}
  %39 = getelementptr inbounds { i64, i64 }, ptr %4, i32 0, i32 0, !dbg !3167: {[-1]:Pointer}, intvals: {}
  %40 = getelementptr inbounds { i64, i64 }, ptr %4, i32 0, i32 1, !dbg !3167: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {}
  %26 = extractvalue { i64, i64 } %25, 0, !dbg !3157: {}, intvals: {}
  %45 = add nuw nsw i64 %43, 1, !dbg !3158: {[-1]:Integer}, intvals: {1,}
  %49 = icmp eq i64 %47, 0, !dbg !3158: {[-1]:Integer}, intvals: {}
  %64 = icmp ult i64 %44, 10, !dbg !3174: {[-1]:Integer}, intvals: {}
  %27 = extractvalue { i64, i64 } %25, 1, !dbg !3157: {}, intvals: {}
  %13 = getelementptr inbounds [10 x double], ptr %5, i64 0, i64 %9: {[-1]:Pointer}, intvals: {}
  %43 = phi i64 [ %45, %67 ], [ 0, %35 ], !dbg !3169: {[-1]:Integer}, intvals: {0,}
i64 10: {[-1]:Integer}, intvals: {10,}
ptr null: {[-1]:Pointer, [-1,-1]:Anything}, intvals: {0,}
i64 3: {[-1]:Integer}, intvals: {3,}
i64 5: {[-1]:Integer}, intvals: {5,}
i64 0: {[-1]:Anything}, intvals: {0,}
i64 1: {[-1]:Integer}, intvals: {1,}
double 0.000000e+00: {[-1]:Anything}, intvals: {}
</analysis>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions