Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

don't know how to handle operand with try_repeat. #909

Open
vext01 opened this issue Nov 20, 2023 · 3 comments
Open

don't know how to handle operand with try_repeat. #909

vext01 opened this issue Nov 20, 2023 · 3 comments
Assignees

Comments

@vext01
Copy link
Contributor

vext01 commented Nov 20, 2023

Shook this out with try_repeat:

---- lang_tests::unroll_safe_implies_noinline.c status ----
Error

---- lang_tests::unroll_safe_implies_noinline.c stderr ----

--- Begin aot ---
source_filename = "ld-temp.o"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%YkCtrlPointVars = type { ptr, ptr, ptr, ptr, ptr }
%struct.YkLocation = type { i64 }

@shadowstack_0 = global ptr null

; Function Attrs: noinline nounwind optnone uwtable
define dso_local void @never_aot_inline(i32 noundef %0) #0 {
  %2 = load ptr, ptr @shadowstack_0, align 8
  %3 = getelementptr i8, ptr %2, i32 0
  store i32 %0, ptr %3, align 4
  br label %4

4:                                                ; preds = %8, %1
  %5 = load i32, ptr %3, align 4
  %6 = add nsw i32 %5, -1
  store i32 %6, ptr %3, align 4
  %7 = icmp eq i32 %5, 0
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4, i32 0, ptr %2, ptr %3, i1 %7)
  br i1 %7, label %12, label %8

8:                                                ; preds = %4
  %9 = load i32, ptr %3, align 4
  %10 = getelementptr i8, ptr %2, i32 16
  store ptr %10, ptr @shadowstack_0, align 8
  %11 = call i32 @call_me(i32 noundef %9) #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 3, i32 0, ptr %2, ptr %3, i32 %9)
  store ptr %2, ptr @shadowstack_0, align 8
  br label %4, !llvm.loop !6

12:                                               ; preds = %4
  br label %14

13:                                               ; preds = %14
  ret void

14:                                               ; preds = %12
  br label %13
}

declare dso_local i32 @call_me(i32 noundef) #1

; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) #2 {
  %3 = alloca %YkCtrlPointVars, align 8
  %4 = call ptr @malloc(i64 1000000)
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 9, i32 0, ptr %3)
  store ptr %4, ptr @shadowstack_0, align 8
  %5 = alloca ptr, align 8
  %6 = alloca %struct.YkLocation, align 8
  %7 = getelementptr i8, ptr %4, i32 0
  %8 = getelementptr i8, ptr %4, i32 16
  store ptr %8, ptr @shadowstack_0, align 8
  %9 = call ptr @yk_mt_new(ptr noundef null) #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7)
  store ptr %4, ptr @shadowstack_0, align 8
  store ptr %9, ptr %5, align 8
  %10 = getelementptr i8, ptr %4, i32 16
  store ptr %10, ptr @shadowstack_0, align 8
  call void @yk_mt_hot_threshold_set(ptr noundef %9, i32 noundef 0) #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %9)
  store ptr %4, ptr @shadowstack_0, align 8
  %11 = getelementptr i8, ptr %4, i32 16
  store ptr %11, ptr @shadowstack_0, align 8
  %12 = call i64 @yk_location_new() #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 2, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7)
  store ptr %4, ptr @shadowstack_0, align 8
  store i64 %12, ptr %6, align 8
  store i32 4, ptr %7, align 4
  call void asm sideeffect "", "=*r|m,0,~{memory},~{dirflag},~{fpsr},~{flags}"(ptr nonnull elementtype(%struct.YkLocation) %6, i64 %12) #5, !srcloc !8
  %13 = load i32, ptr %7, align 4
  call void asm sideeffect "", "=*r|m,0,~{memory},~{dirflag},~{fpsr},~{flags}"(ptr nonnull elementtype(i32) %7, i32 %13) #5, !srcloc !9
  br label %14

14:                                               ; preds = %17, %2
  %15 = load i32, ptr %7, align 4
  %16 = icmp sgt i32 %15, 0
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 5, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, i1 %16)
  br i1 %16, label %17, label %30

17:                                               ; preds = %14
  %18 = load ptr, ptr %5, align 8
  %19 = getelementptr i8, ptr %4, i32 16
  store ptr %19, ptr @shadowstack_0, align 8
  %20 = getelementptr %YkCtrlPointVars, ptr %3, i32 0, i32 0
  store ptr %4, ptr %20, align 8
  %21 = getelementptr %YkCtrlPointVars, ptr %3, i32 0, i32 1
  store ptr %5, ptr %21, align 8
  %22 = getelementptr %YkCtrlPointVars, ptr %3, i32 0, i32 2
  store ptr %6, ptr %22, align 8
  %23 = getelementptr %YkCtrlPointVars, ptr %3, i32 0, i32 3
  store ptr %7, ptr %23, align 8
  %24 = getelementptr %YkCtrlPointVars, ptr %3, i32 0, i32 4
  store ptr %18, ptr %24, align 8
  %25 = call ptr @llvm.frameaddress.p0(i32 0)
  call void @__ykrt_control_point(ptr %18, ptr %6, ptr %3, ptr %25)
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 10, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %18, ptr %25)
  store ptr %4, ptr @shadowstack_0, align 8
  %26 = load i32, ptr %7, align 4
  %27 = getelementptr i8, ptr %4, i32 16
  store ptr %27, ptr @shadowstack_0, align 8
  call void @never_aot_inline(i32 noundef %26)
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 6, i32 0, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, i32 %26)
  store ptr %4, ptr @shadowstack_0, align 8
  %28 = load i32, ptr %7, align 4
  %29 = add nsw i32 %28, -1
  store i32 %29, ptr %7, align 4
  br label %14, !llvm.loop !10

30:                                               ; preds = %14
  %31 = load i64, ptr %6, align 8
  %32 = getelementptr i8, ptr %4, i32 16
  store ptr %32, ptr @shadowstack_0, align 8
  call void @yk_location_drop(i64 %31) #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 7, i32 0, ptr %4, ptr %5, i64 %31)
  store ptr %4, ptr @shadowstack_0, align 8
  %33 = load ptr, ptr %5, align 8
  %34 = getelementptr i8, ptr %4, i32 16
  store ptr %34, ptr @shadowstack_0, align 8
  call void @yk_mt_drop(ptr noundef %33) #5
  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 8, i32 0, ptr %4, ptr %33)
  store ptr %4, ptr @shadowstack_0, align 8
  br label %36

35:                                               ; preds = %36
  ret i32 0

36:                                               ; preds = %30
  br label %35
}

declare dso_local ptr @yk_mt_new(ptr noundef) #1

declare dso_local void @yk_mt_hot_threshold_set(ptr noundef, i32 noundef) #1

declare dso_local i64 @yk_location_new() #1

declare dso_local void @yk_mt_control_point(ptr noundef, ptr noundef) #1

declare dso_local void @yk_location_drop(i64) #1

declare dso_local void @yk_mt_drop(ptr noundef) #1

declare ptr @malloc(i64)

declare void @__ykrt_control_point(ptr, ptr, ptr, ptr)

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare ptr @llvm.frameaddress.p0(i32 immarg) #3

; Function Attrs: nocallback nofree nosync willreturn
declare void @llvm.experimental.stackmap(i64, i32, ...) #4

attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" "yk_outline" }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #4 = { nocallback nofree nosync willreturn }
attributes #5 = { nounwind }

!llvm.ident = !{!0}
!llvm.module.flags = !{!1, !2, !3, !4, !5}

!0 = !{!"clang version 18.0.0 (https://github.com/ykjit/ykllvm c21b1be7d845af8283ac4750d8e7e6c408daf84b)"}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 7, !"uwtable", i32 2}
!3 = !{i32 7, !"frame-pointer", i32 2}
!4 = !{i32 1, !"ThinLTO", i32 0}
!5 = !{i32 1, !"EnableSplitLTOUnit", i32 1}
!6 = distinct !{!6, !7}
!7 = !{!"llvm.loop.mustprogress"}
!8 = !{i64 2147966671}
!9 = !{i64 2147966718}
!10 = distinct !{!10, !7}
--- End aot ---
don't know how to handle operand:   %3 = getelementptr i8, ptr %2, i32 0

---- lang_tests::unroll_safe_implies_noinline.c stdout ----
@vext01 vext01 self-assigned this Nov 20, 2023
@vext01
Copy link
Contributor Author

vext01 commented Nov 20, 2023

@ptersilie something to do with the shadow stack.

Non-deterministic though.... odd.

@ltratt
Copy link
Contributor

ltratt commented Jan 24, 2024

@ptersilie @Pavel-Durov I wonder if this could be related to the issue @Pavel-Durov is seeing in his PR?

@ptersilie
Copy link
Contributor

@ptersilie @Pavel-Durov I wonder if this could be related to the issue @Pavel-Durov is seeing in his PR?

I don't think so. But we will know more once we debug the software tracer properly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants