[llvm] bd5fbab - [SimplifyCFG] Add tests for sinking with multiple uses (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 14 02:00:55 PDT 2024


Author: Nikita Popov
Date: 2024-06-14T11:00:45+02:00
New Revision: bd5fbab38f200c09eb5bc727b56812e53a3e9f00

URL: https://github.com/llvm/llvm-project/commit/bd5fbab38f200c09eb5bc727b56812e53a3e9f00
DIFF: https://github.com/llvm/llvm-project/commit/bd5fbab38f200c09eb5bc727b56812e53a3e9f00.diff

LOG: [SimplifyCFG] Add tests for sinking with multiple uses (NFC)

Added: 
    

Modified: 
    llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll b/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll
index b67ee63036848..7b2161351a794 100644
--- a/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll
+++ b/llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll
@@ -1702,4 +1702,165 @@ return:
   ret void
 }
 
+define ptr @multi_use_in_phi(i1 %cond, ptr %p, i64 %a, i64 %b) {
+; CHECK-LABEL: @multi_use_in_phi(
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @dummy()
+; CHECK-NEXT:    [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
+; CHECK-NEXT:    br label [[JOIN:%.*]]
+; CHECK:       else:
+; CHECK-NEXT:    [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
+; CHECK-NEXT:    br label [[JOIN]]
+; CHECK:       join:
+; CHECK-NEXT:    [[GEP1_B_SINK:%.*]] = phi ptr [ [[GEP1_B]], [[ELSE]] ], [ [[GEP1_A]], [[IF]] ]
+; CHECK-NEXT:    [[PHI1:%.*]] = phi ptr [ [[GEP1_A]], [[IF]] ], [ [[GEP1_B]], [[ELSE]] ]
+; CHECK-NEXT:    [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B_SINK]], i64 [[B:%.*]]
+; CHECK-NEXT:    call void @use.ptr(ptr [[PHI1]])
+; CHECK-NEXT:    ret ptr [[GEP2_B]]
+;
+  br i1 %cond, label %if, label %else
+
+if:
+  call void @dummy()
+  %gep1.a = getelementptr i8, ptr %p, i64 %a
+  %gep2.a = getelementptr i8, ptr %gep1.a, i64 %b
+  br label %join
+
+else:
+  %gep1.b = getelementptr i8, ptr %p, i64 %a
+  %gep2.b = getelementptr i8, ptr %gep1.b, i64 %b
+  br label %join
+
+join:
+  %phi1 = phi ptr [ %gep1.a, %if ], [ %gep1.b, %else ]
+  %phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
+  call void @use.ptr(ptr %phi1)
+  ret ptr %phi2
+}
+
+define ptr @multi_use_in_phi_inconsistent(i1 %cond, ptr %p, i64 %a, i64 %b) {
+; CHECK-LABEL: @multi_use_in_phi_inconsistent(
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @dummy()
+; CHECK-NEXT:    [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
+; CHECK-NEXT:    br label [[JOIN:%.*]]
+; CHECK:       else:
+; CHECK-NEXT:    [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
+; CHECK-NEXT:    br label [[JOIN]]
+; CHECK:       join:
+; CHECK-NEXT:    [[GEP1_B_SINK:%.*]] = phi ptr [ [[GEP1_B]], [[ELSE]] ], [ [[GEP1_A]], [[IF]] ]
+; CHECK-NEXT:    [[PHI1:%.*]] = phi ptr [ [[GEP1_A]], [[IF]] ], [ [[P]], [[ELSE]] ]
+; CHECK-NEXT:    [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B_SINK]], i64 [[B:%.*]]
+; CHECK-NEXT:    call void @use.ptr(ptr [[PHI1]])
+; CHECK-NEXT:    ret ptr [[GEP2_B]]
+;
+  br i1 %cond, label %if, label %else
+
+if:
+  call void @dummy()
+  %gep1.a = getelementptr i8, ptr %p, i64 %a
+  %gep2.a = getelementptr i8, ptr %gep1.a, i64 %b
+  br label %join
+
+else:
+  %gep1.b = getelementptr i8, ptr %p, i64 %a
+  %gep2.b = getelementptr i8, ptr %gep1.b, i64 %b
+  br label %join
+
+join:
+  %phi1 = phi ptr [ %gep1.a, %if ], [ %p, %else ]
+  %phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
+  call void @use.ptr(ptr %phi1)
+  ret ptr %phi2
+}
+
+define i64 @multi_use_in_block(i1 %cond, ptr %p, i64 %a, i64 %b) {
+; CHECK-LABEL: @multi_use_in_block(
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @dummy()
+; CHECK-NEXT:    [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
+; CHECK-NEXT:    [[V_A:%.*]] = load i64, ptr [[GEP1_A]], align 8
+; CHECK-NEXT:    [[GEP2_A:%.*]] = getelementptr i8, ptr [[GEP1_A]], i64 [[V_A]]
+; CHECK-NEXT:    br label [[JOIN:%.*]]
+; CHECK:       else:
+; CHECK-NEXT:    [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
+; CHECK-NEXT:    [[V_B:%.*]] = load i64, ptr [[GEP1_B]], align 8
+; CHECK-NEXT:    [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B]], i64 [[V_B]]
+; CHECK-NEXT:    br label [[JOIN]]
+; CHECK:       join:
+; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ [[V_A]], [[IF]] ], [ [[V_B]], [[ELSE]] ]
+; CHECK-NEXT:    [[PHI2:%.*]] = phi ptr [ [[GEP2_A]], [[IF]] ], [ [[GEP2_B]], [[ELSE]] ]
+; CHECK-NEXT:    call void @use.ptr(ptr [[PHI2]])
+; CHECK-NEXT:    ret i64 [[PHI1]]
+;
+  br i1 %cond, label %if, label %else
+
+if:
+  call void @dummy()
+  %gep1.a = getelementptr i8, ptr %p, i64 %a
+  %v.a = load i64, ptr %gep1.a
+  %gep2.a = getelementptr i8, ptr %gep1.a, i64 %v.a
+  br label %join
+
+else:
+  %gep1.b = getelementptr i8, ptr %p, i64 %a
+  %v.b = load i64, ptr %gep1.b
+  %gep2.b = getelementptr i8, ptr %gep1.b, i64 %v.b
+  br label %join
+
+join:
+  %phi1 = phi i64 [ %v.a, %if ], [ %v.b, %else ]
+  %phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
+  call void @use.ptr(ptr %phi2)
+  ret i64 %phi1
+}
+
+define i64 @multi_use_in_block_inconsistent(i1 %cond, ptr %p, i64 %a, i64 %b) {
+; CHECK-LABEL: @multi_use_in_block_inconsistent(
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @dummy()
+; CHECK-NEXT:    [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
+; CHECK-NEXT:    [[V_A:%.*]] = load i64, ptr [[GEP1_A]], align 8
+; CHECK-NEXT:    [[GEP2_A:%.*]] = getelementptr i8, ptr [[GEP1_A]], i64 [[V_A]]
+; CHECK-NEXT:    br label [[JOIN:%.*]]
+; CHECK:       else:
+; CHECK-NEXT:    [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
+; CHECK-NEXT:    [[V_B:%.*]] = load i64, ptr [[P]], align 8
+; CHECK-NEXT:    [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B]], i64 [[V_B]]
+; CHECK-NEXT:    br label [[JOIN]]
+; CHECK:       join:
+; CHECK-NEXT:    [[PHI1:%.*]] = phi i64 [ [[V_A]], [[IF]] ], [ [[V_B]], [[ELSE]] ]
+; CHECK-NEXT:    [[PHI2:%.*]] = phi ptr [ [[GEP2_A]], [[IF]] ], [ [[GEP2_B]], [[ELSE]] ]
+; CHECK-NEXT:    call void @use.ptr(ptr [[PHI2]])
+; CHECK-NEXT:    ret i64 [[PHI1]]
+;
+  br i1 %cond, label %if, label %else
+
+if:
+  call void @dummy()
+  %gep1.a = getelementptr i8, ptr %p, i64 %a
+  %v.a = load i64, ptr %gep1.a
+  %gep2.a = getelementptr i8, ptr %gep1.a, i64 %v.a
+  br label %join
+
+else:
+  %gep1.b = getelementptr i8, ptr %p, i64 %a
+  %v.b = load i64, ptr %p
+  %gep2.b = getelementptr i8, ptr %gep1.b, i64 %v.b
+  br label %join
+
+join:
+  %phi1 = phi i64 [ %v.a, %if ], [ %v.b, %else ]
+  %phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
+  call void @use.ptr(ptr %phi2)
+  ret i64 %phi1
+}
+
+declare void @dummy()
+declare void @use.ptr(ptr)
+
 !12 = !{i32 1}


        


More information about the llvm-commits mailing list