44define i64 @align_deref_align (i1 %c , ptr %p ) {
55; CHECK-LABEL: define i64 @align_deref_align(
66; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
7- ; CHECK-NEXT: [[ENTRY:.*:]]
7+ ; CHECK-NEXT: [[ENTRY:.*]]:
88; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 8), "align"(ptr [[P]], i64 8) ]
9+ ; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[EXIT:.*]]
10+ ; CHECK: [[IF]]:
911; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[P]], align 8
10- ; CHECK-NEXT: [[RES:%.*]] = select i1 [[C]], i64 [[V]], i64 0
12+ ; CHECK-NEXT: br label %[[EXIT]]
13+ ; CHECK: [[EXIT]]:
14+ ; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[V]], %[[IF]] ], [ 0, %[[ENTRY]] ]
1115; CHECK-NEXT: ret i64 [[RES]]
1216;
1317entry:
2327 ret i64 %res
2428}
2529
30+ define i64 @align_deref_align_nofree_nosync (i1 %c , ptr %p ) nofree nosync {
31+ ; CHECK-LABEL: define i64 @align_deref_align_nofree_nosync(
32+ ; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
33+ ; CHECK-NEXT: [[ENTRY:.*:]]
34+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 8), "align"(ptr [[P]], i64 8) ]
35+ ; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[P]], align 8
36+ ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C]], i64 [[V]], i64 0
37+ ; CHECK-NEXT: ret i64 [[SPEC_SELECT]]
38+ ;
39+ entry:
40+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %p , i64 8 ), "align" (ptr %p , i64 8 ) ]
41+ br i1 %c , label %if , label %exit
42+
43+ if:
44+ %v = load i64 , ptr %p , align 8
45+ br label %exit
46+
47+ exit:
48+ %res = phi i64 [ %v , %if ], [ 0 , %entry ]
49+ ret i64 %res
50+ }
51+
2652define i64 @assume_deref_align2 (i1 %c1 , i32 %x , ptr %p ) {
2753; CHECK-LABEL: define i64 @assume_deref_align2(
2854; CHECK-SAME: i1 [[C1:%.*]], i32 [[X:%.*]], ptr [[P:%.*]]) {
55+ ; CHECK-NEXT: [[ENTRY:.*]]:
56+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 8), "align"(ptr [[P]], i64 8) ]
57+ ; CHECK-NEXT: br i1 [[C1]], label %[[IF1:.*]], label %[[EXIT:.*]]
58+ ; CHECK: [[IF1]]:
59+ ; CHECK-NEXT: [[C2:%.*]] = icmp ugt i32 [[X]], 10
60+ ; CHECK-NEXT: br i1 [[C2]], label %[[IF2:.*]], label %[[EXIT]]
61+ ; CHECK: [[IF2]]:
62+ ; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[P]], align 8
63+ ; CHECK-NEXT: br label %[[EXIT]]
64+ ; CHECK: [[EXIT]]:
65+ ; CHECK-NEXT: [[RES:%.*]] = phi i64 [ [[V]], %[[IF2]] ], [ 1, %[[IF1]] ], [ 0, %[[ENTRY]] ]
66+ ; CHECK-NEXT: ret i64 [[RES]]
67+ ;
68+ entry:
69+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %p , i64 8 ), "align" (ptr %p , i64 8 ) ]
70+ br i1 %c1 , label %if1 , label %exit
71+
72+ if1:
73+ %c2 = icmp ugt i32 %x , 10
74+ br i1 %c2 , label %if2 , label %exit
75+
76+ if2:
77+ %v = load i64 , ptr %p , align 8
78+ br label %exit
79+
80+ exit:
81+ %res = phi i64 [ %v , %if2 ], [ 1 , %if1 ], [ 0 , %entry ]
82+ ret i64 %res
83+ }
84+
85+ define i64 @assume_deref_align2_nofree_nosync (i1 %c1 , i32 %x , ptr %p ) nofree nosync {
86+ ; CHECK-LABEL: define i64 @assume_deref_align2_nofree_nosync(
87+ ; CHECK-SAME: i1 [[C1:%.*]], i32 [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
2988; CHECK-NEXT: [[ENTRY:.*:]]
3089; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 8), "align"(ptr [[P]], i64 8) ]
3190; CHECK-NEXT: [[C2:%.*]] = icmp ugt i32 [[X]], 10
@@ -51,9 +110,10 @@ exit:
51110 ret i64 %res
52111}
53112
54- define i64 @assume_deref_align_not_dominating (i1 %c , ptr %p ) {
113+
114+ define i64 @assume_deref_align_not_dominating (i1 %c , ptr %p ) nofree nosync {
55115; CHECK-LABEL: define i64 @assume_deref_align_not_dominating(
56- ; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
116+ ; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
57117; CHECK-NEXT: [[ENTRY:.*]]:
58118; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[EXIT:.*]]
59119; CHECK: [[IF]]:
0 commit comments