; ModuleID = 'a.c'
source_filename = "a.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define dso_local zeroext i16 @a() #0 {
%1 = alloca i16, align 2
%2 = alloca i32, align 4
%3 = alloca i8, align 1
%4 = alloca [3 x [4 x [8 x i32]]], align 16
%5 = alloca i8, align 1
%6 = alloca i16, align 2
%7 = alloca i32, align 4
call void @llvm.lifetime.start.p0(i64 4, ptr %2) #2
store i32 0, ptr %2, align 4, !tbaa !5
br label %8
8: ; preds = %39, %0
call void @llvm.lifetime.start.p0(i64 1, ptr %3) #2
call void @llvm.lifetime.start.p0(i64 384, ptr %4) #2
call void @llvm.lifetime.start.p0(i64 1, ptr %5) #2
%9 = load i32, ptr %2, align 4, !tbaa !5
%10 = trunc i32 %9 to i16
%11 = call zeroext i16 @safe_mod_func_uint16_t_u_u(i16 noundef zeroext 0, i16 noundef zeroext %10)
%12 = icmp ne i16 %11, 0
br i1 %12, label %13, label %27
13: ; preds = %8
br label %14
14: ; preds = %13
call void @llvm.lifetime.start.p0(i64 2, ptr %6) #2
%15 = getelementptr inbounds [3 x [4 x [8 x i32]]], ptr %4, i64 0, i64 1
%16 = getelementptr inbounds [4 x [8 x i32]], ptr %15, i64 0, i64 0
%17 = getelementptr inbounds [8 x i32], ptr %16, i64 0, i64 3
%18 = load i32, ptr %17, align 4, !tbaa !5
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %21
20: ; preds = %14
store i32 5, ptr %7, align 4
br label %24
21: ; preds = %14
%22 = load i8, ptr %3, align 1, !tbaa !9
%23 = sext i8 %22 to i16
store i16 %23, ptr %1, align 2
store i32 1, ptr %7, align 4
br label %24
24: ; preds = %21, %20
call void @llvm.lifetime.end.p0(i64 2, ptr %6) #2
%25 = load i32, ptr %7, align 4
switch i32 %25, label %36 [
i32 5, label %26
]
26: ; preds = %24
br label %27
27: ; preds = %26, %8
br label %28
28: ; preds = %34, %27
%29 = load i8, ptr %5, align 1, !tbaa !9
%30 = icmp ne i8 %29, 0
br i1 %30, label %31, label %35
31: ; preds = %28
%32 = load i32, ptr %2, align 4, !tbaa !5
%33 = trunc i32 %32 to i16
store i16 %33, ptr %1, align 2
store i32 1, ptr %7, align 4
br label %36
34: ; No predecessors!
br label %28, !llvm.loop !10
35: ; preds = %28
store i32 0, ptr %7, align 4
br label %36
36: ; preds = %35, %31, %24
call void @llvm.lifetime.end.p0(i64 1, ptr %5) #2
call void @llvm.lifetime.end.p0(i64 384, ptr %4) #2
call void @llvm.lifetime.end.p0(i64 1, ptr %3) #2
%37 = load i32, ptr %7, align 4
switch i32 %37, label %42 [
i32 0, label %38
]
38: ; preds = %36
br label %39
39: ; preds = %38
%40 = load i32, ptr %2, align 4, !tbaa !5
%41 = add nsw i32 %40, -1
store i32 %41, ptr %2, align 4, !tbaa !5
br label %8
42: ; preds = %36
call void @llvm.lifetime.end.p0(i64 4, ptr %2) #2
%43 = load i16, ptr %1, align 2
ret i16 %43
}
; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
; Function Attrs: nounwind uwtable
define internal zeroext i16 @safe_mod_func_uint16_t_u_u(i16 noundef zeroext %0, i16 noundef zeroext %1) #0 {
%3 = alloca i16, align 2
%4 = alloca i16, align 2
store i16 %0, ptr %3, align 2, !tbaa !12
store i16 %1, ptr %4, align 2, !tbaa !12
%5 = load i16, ptr %4, align 2, !tbaa !12
%6 = zext i16 %5 to i32
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %11
8: ; preds = %2
%9 = load i16, ptr %3, align 2, !tbaa !12
%10 = zext i16 %9 to i32
br label %17
11: ; preds = %2
%12 = load i16, ptr %3, align 2, !tbaa !12
%13 = zext i16 %12 to i32
%14 = load i16, ptr %4, align 2, !tbaa !12
%15 = zext i16 %14 to i32
%16 = srem i32 %13, %15
br label %17
17: ; preds = %11, %8
%18 = phi i32 [ %10, %8 ], [ %16, %11 ]
%19 = trunc i32 %18 to i16
ret i16 %19
}
; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1
; Function Attrs: nounwind uwtable
define dso_local i32 @main() #0 {
ret i32 0
}
attributes #0 = { nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { argmemonly nocallback nofree nosync nounwind willreturn }
attributes #2 = { nounwind }
!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 7, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"BiSheng Enterprise 3.1.0.B006 clang version 15.0.4 (721bae198ed1)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = distinct !{!10, !11}
!11 = !{!"llvm.loop.mustprogress"}
!12 = !{!13, !13, i64 0}
!13 = !{!"short", !7, i64 0}
毕昇3.1.0的opt在通过优化"-passes=mem2reg,newgvn,jump-threading,sink"编译特定代码时会crash
Version:
CommandLines:
Code:
; ModuleID = 'a.c' source_filename = "a.c" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" ; Function Attrs: nounwind uwtable define dso_local zeroext i16 @a() #0 { %1 = alloca i16, align 2 %2 = alloca i32, align 4 %3 = alloca i8, align 1 %4 = alloca [3 x [4 x [8 x i32]]], align 16 %5 = alloca i8, align 1 %6 = alloca i16, align 2 %7 = alloca i32, align 4 call void @llvm.lifetime.start.p0(i64 4, ptr %2) #2 store i32 0, ptr %2, align 4, !tbaa !5 br label %8 8: ; preds = %39, %0 call void @llvm.lifetime.start.p0(i64 1, ptr %3) #2 call void @llvm.lifetime.start.p0(i64 384, ptr %4) #2 call void @llvm.lifetime.start.p0(i64 1, ptr %5) #2 %9 = load i32, ptr %2, align 4, !tbaa !5 %10 = trunc i32 %9 to i16 %11 = call zeroext i16 @safe_mod_func_uint16_t_u_u(i16 noundef zeroext 0, i16 noundef zeroext %10) %12 = icmp ne i16 %11, 0 br i1 %12, label %13, label %27 13: ; preds = %8 br label %14 14: ; preds = %13 call void @llvm.lifetime.start.p0(i64 2, ptr %6) #2 %15 = getelementptr inbounds [3 x [4 x [8 x i32]]], ptr %4, i64 0, i64 1 %16 = getelementptr inbounds [4 x [8 x i32]], ptr %15, i64 0, i64 0 %17 = getelementptr inbounds [8 x i32], ptr %16, i64 0, i64 3 %18 = load i32, ptr %17, align 4, !tbaa !5 %19 = icmp ne i32 %18, 0 br i1 %19, label %20, label %21 20: ; preds = %14 store i32 5, ptr %7, align 4 br label %24 21: ; preds = %14 %22 = load i8, ptr %3, align 1, !tbaa !9 %23 = sext i8 %22 to i16 store i16 %23, ptr %1, align 2 store i32 1, ptr %7, align 4 br label %24 24: ; preds = %21, %20 call void @llvm.lifetime.end.p0(i64 2, ptr %6) #2 %25 = load i32, ptr %7, align 4 switch i32 %25, label %36 [ i32 5, label %26 ] 26: ; preds = %24 br label %27 27: ; preds = %26, %8 br label %28 28: ; preds = %34, %27 %29 = load i8, ptr %5, align 1, !tbaa !9 %30 = icmp ne i8 %29, 0 br i1 %30, label %31, label %35 31: ; preds = %28 %32 = load i32, ptr %2, align 4, !tbaa !5 %33 = trunc i32 %32 to i16 store i16 %33, ptr %1, align 2 store i32 1, ptr %7, align 4 br label %36 34: ; No predecessors! br label %28, !llvm.loop !10 35: ; preds = %28 store i32 0, ptr %7, align 4 br label %36 36: ; preds = %35, %31, %24 call void @llvm.lifetime.end.p0(i64 1, ptr %5) #2 call void @llvm.lifetime.end.p0(i64 384, ptr %4) #2 call void @llvm.lifetime.end.p0(i64 1, ptr %3) #2 %37 = load i32, ptr %7, align 4 switch i32 %37, label %42 [ i32 0, label %38 ] 38: ; preds = %36 br label %39 39: ; preds = %38 %40 = load i32, ptr %2, align 4, !tbaa !5 %41 = add nsw i32 %40, -1 store i32 %41, ptr %2, align 4, !tbaa !5 br label %8 42: ; preds = %36 call void @llvm.lifetime.end.p0(i64 4, ptr %2) #2 %43 = load i16, ptr %1, align 2 ret i16 %43 } ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1 ; Function Attrs: nounwind uwtable define internal zeroext i16 @safe_mod_func_uint16_t_u_u(i16 noundef zeroext %0, i16 noundef zeroext %1) #0 { %3 = alloca i16, align 2 %4 = alloca i16, align 2 store i16 %0, ptr %3, align 2, !tbaa !12 store i16 %1, ptr %4, align 2, !tbaa !12 %5 = load i16, ptr %4, align 2, !tbaa !12 %6 = zext i16 %5 to i32 %7 = icmp eq i32 %6, 0 br i1 %7, label %8, label %11 8: ; preds = %2 %9 = load i16, ptr %3, align 2, !tbaa !12 %10 = zext i16 %9 to i32 br label %17 11: ; preds = %2 %12 = load i16, ptr %3, align 2, !tbaa !12 %13 = zext i16 %12 to i32 %14 = load i16, ptr %4, align 2, !tbaa !12 %15 = zext i16 %14 to i32 %16 = srem i32 %13, %15 br label %17 17: ; preds = %11, %8 %18 = phi i32 [ %10, %8 ], [ %16, %11 ] %19 = trunc i32 %18 to i16 ret i16 %19 } ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1 ; Function Attrs: nounwind uwtable define dso_local i32 @main() #0 { ret i32 0 } attributes #0 = { nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } attributes #1 = { argmemonly nocallback nofree nosync nounwind willreturn } attributes #2 = { nounwind } !llvm.module.flags = !{!0, !1, !2, !3} !llvm.ident = !{!4} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 7, !"PIC Level", i32 2} !2 = !{i32 7, !"PIE Level", i32 2} !3 = !{i32 7, !"uwtable", i32 2} !4 = !{!"BiSheng Enterprise 3.1.0.B006 clang version 15.0.4 (721bae198ed1)"} !5 = !{!6, !6, i64 0} !6 = !{!"int", !7, i64 0} !7 = !{!"omnipotent char", !8, i64 0} !8 = !{!"Simple C/C++ TBAA"} !9 = !{!7, !7, i64 0} !10 = distinct !{!10, !11} !11 = !{!"llvm.loop.mustprogress"} !12 = !{!13, !13, i64 0} !13 = !{!"short", !7, i64 0}