[llvm] [InstCombine] ptrmask of gep for dynamic pointer aligment (PR #80002)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 30 05:47:07 PST 2024
================
@@ -287,6 +287,90 @@ define ptr addrspace(1) @ptrmask_maintain_provenance_i32(ptr addrspace(1) %p0) {
ret ptr addrspace(1) %r
}
+define ptr @ptrmask_is_nop0(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_is_nop0
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: ret ptr [[P]]
+;
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -8)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_is_nop1(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_is_nop1
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: ret ptr [[P]]
+;
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -4)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep0(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep0
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: [[PM:%.*]] = call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -16)
+; CHECK-NEXT: ret ptr [[PM]]
+;
+ %gep = getelementptr i8, ptr %p, i32 5
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %gep, i64 -16)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep1(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep1
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: ret ptr [[P]]
+;
+ %gep = getelementptr i8, ptr %p, i32 6
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %gep, i64 -8)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep2(ptr align 16 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep2
+; CHECK-SAME: (ptr align 16 [[P:%.*]]) {
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 12
+; CHECK-NEXT: ret ptr [[GEP1]]
+;
+ %gep = getelementptr i8, ptr %p, i32 15
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %gep, i64 -4)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep4(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep4
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 24
+; CHECK-NEXT: [[PM:%.*]] = call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[GEP1]], i64 -16)
+; CHECK-NEXT: ret ptr [[PM]]
+;
+ %gep = getelementptr i8, ptr %p, i32 29
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %gep, i64 -16)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep5(ptr align 8 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep5
+; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 24
+; CHECK-NEXT: ret ptr [[GEP1]]
+;
+ %gep = getelementptr i8, ptr %p, i32 30
+ %pm = call ptr @llvm.ptrmask.p0.i64(ptr %gep, i64 -8)
+ ret ptr %pm
+}
+
+define ptr @ptrmask_to_modified_gep6(ptr align 16 %p) {
+; CHECK-LABEL: define ptr @ptrmask_to_modified_gep6
+; CHECK-SAME: (ptr align 16 [[P:%.*]]) {
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 28
+; CHECK-NEXT: ret ptr [[GEP1]]
+;
+ %gep = getelementptr i8, ptr %p, i32 31
----------------
arsenm wrote:
Negative test with non-i8 types?
https://github.com/llvm/llvm-project/pull/80002
More information about the llvm-commits
mailing list