@@ -11,10 +11,18 @@ declare void @llvm.assume(i1) #1
1111; Check that the assume has not been removed:
1212
1313define i32 @align_to_bundle (ptr %a ) #0 {
14- ; CHECK-LABEL: @align_to_bundle(
15- ; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
16- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
17- ; CHECK-NEXT: ret i32 [[T0]]
14+ ; DEFAULT-LABEL: @align_to_bundle(
15+ ; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
16+ ; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
17+ ; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
18+ ; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
19+ ; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
20+ ; DEFAULT-NEXT: ret i32 [[T0]]
21+ ;
22+ ; BUNDLES-LABEL: @align_to_bundle(
23+ ; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
24+ ; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
25+ ; BUNDLES-NEXT: ret i32 [[T0]]
1826;
1927 %t0 = load i32 , ptr %a , align 4
2028 %ptrint = ptrtoint ptr %a to i64
@@ -25,10 +33,18 @@ define i32 @align_to_bundle(ptr %a) #0 {
2533}
2634
2735define i32 @align_to_bundle_ptrtoaddr (ptr %a ) #0 {
28- ; CHECK-LABEL: @align_to_bundle_ptrtoaddr(
29- ; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
30- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
31- ; CHECK-NEXT: ret i32 [[T0]]
36+ ; DEFAULT-LABEL: @align_to_bundle_ptrtoaddr(
37+ ; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
38+ ; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoaddr ptr [[A]] to i64
39+ ; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
40+ ; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
41+ ; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
42+ ; DEFAULT-NEXT: ret i32 [[T0]]
43+ ;
44+ ; BUNDLES-LABEL: @align_to_bundle_ptrtoaddr(
45+ ; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
46+ ; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
47+ ; BUNDLES-NEXT: ret i32 [[T0]]
3248;
3349 %t0 = load i32 , ptr %a , align 4
3450 %ptrint = ptr toaddr ptr %a to i64
@@ -39,10 +55,18 @@ define i32 @align_to_bundle_ptrtoaddr(ptr %a) #0 {
3955}
4056
4157define i32 @align_assume_trunc_cond (ptr %a ) #0 {
42- ; CHECK-LABEL: @align_assume_trunc_cond(
43- ; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
44- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
45- ; CHECK-NEXT: ret i32 [[T0]]
58+ ; DEFAULT-LABEL: @align_assume_trunc_cond(
59+ ; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
60+ ; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
61+ ; DEFAULT-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
62+ ; DEFAULT-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
63+ ; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
64+ ; DEFAULT-NEXT: ret i32 [[T0]]
65+ ;
66+ ; BUNDLES-LABEL: @align_assume_trunc_cond(
67+ ; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
68+ ; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
69+ ; BUNDLES-NEXT: ret i32 [[T0]]
4670;
4771 %t0 = load i32 , ptr %a , align 4
4872 %ptrint = ptrtoint ptr %a to i64
@@ -55,10 +79,18 @@ define i32 @align_assume_trunc_cond(ptr %a) #0 {
5579; Same check as in @foo1, but make sure it works if the assume is first too.
5680
5781define i32 @foo2 (ptr %a ) #0 {
58- ; CHECK-LABEL: @foo2(
59- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ]
60- ; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
61- ; CHECK-NEXT: ret i32 [[T0]]
82+ ; DEFAULT-LABEL: @foo2(
83+ ; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A:%.*]] to i64
84+ ; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
85+ ; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
86+ ; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
87+ ; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
88+ ; DEFAULT-NEXT: ret i32 [[T0]]
89+ ;
90+ ; BUNDLES-LABEL: @foo2(
91+ ; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ]
92+ ; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
93+ ; BUNDLES-NEXT: ret i32 [[T0]]
6294;
6395 %ptrint = ptrtoint ptr %a to i64
6496 %maskedptr = and i64 %ptrint , 31
0 commit comments