[llvm] 7eaf92b - Sink/test: increase coverage of invariant-load (#112690)

via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 18 01:47:24 PDT 2024


Author: Ramkumar Ramachandra
Date: 2024-10-18T09:47:20+01:00
New Revision: 7eaf92b3e4db5e3be9e9ee137866090d66dd08fb

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

LOG: Sink/test: increase coverage of invariant-load (#112690)

Tests adapted from:

https://discourse.llvm.org/t/sinking-does-any-llvm-pass-currently-handle-load-sinking-for-invariant-loads/79643

We don't add tests for llvm.invariant.{start,end} though, as these are
very difficult to support architecturally.

Added: 
    

Modified: 
    llvm/test/Transforms/Sink/invariant-load.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/Sink/invariant-load.ll b/llvm/test/Transforms/Sink/invariant-load.ll
index 1aab4a96963230..c8fb119acd30a8 100644
--- a/llvm/test/Transforms/Sink/invariant-load.ll
+++ b/llvm/test/Transforms/Sink/invariant-load.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -passes=sink -S < %s | FileCheck %s
 
-; Loads marked invariant can be sunk across critical edges
+; Loads marked invariant can be sunk across critical edges.
 
 define <4 x float> @invariant_load(ptr %in, i32 %s) {
 ; CHECK-LABEL: @invariant_load(
@@ -12,7 +12,7 @@ define <4 x float> @invariant_load(ptr %in, i32 %s) {
 ; CHECK-NEXT:    [[Z:%.*]] = add i32 [[S]], 1
 ; CHECK-NEXT:    br label [[END]]
 ; CHECK:       end:
-; CHECK-NEXT:    [[V:%.*]] = load <4 x float>, ptr [[IN:%.*]], align 16, !invariant.load !0
+; CHECK-NEXT:    [[V:%.*]] = load <4 x float>, ptr [[IN:%.*]], align 16, !invariant.load [[META0:![0-9]+]]
 ; CHECK-NEXT:    ret <4 x float> [[V]]
 ;
 main_body:
@@ -26,4 +26,67 @@ end:
   ret <4 x float> %v
 }
 
+; Loads that aren't marked invariant but used in one branch
+; can be sunk to that branch.
+
+define void @invariant_load_use_in_br(ptr %p, i1 %cond) {
+; CHECK-LABEL: @invariant_load_use_in_br(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
+; CHECK:       true.br:
+; CHECK-NEXT:    call void @fn()
+; CHECK-NEXT:    br label [[EXIT:%.*]]
+; CHECK:       false.br:
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-NEXT:    call void @fn(i32 [[VAL]])
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %val = load i32, ptr %p
+  br i1 %cond, label %true.br, label %false.br
+true.br:
+  call void @fn()
+  br label %exit
+false.br:
+  call void @fn(i32 %val)
+  br label %exit
+exit:
+  ret void
+}
+
+; TODO: Invariant loads marked with metadata can be sunk past calls.
+
+define void @invariant_load_metadata_call(ptr %p, i1 %cond) {
+; CHECK-LABEL: @invariant_load_metadata_call(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[P:%.*]], align 4, !invariant.load [[META0]]
+; CHECK-NEXT:    call void @fn()
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[TRUE_BR:%.*]], label [[FALSE_BR:%.*]]
+; CHECK:       true.br:
+; CHECK-NEXT:    call void @fn()
+; CHECK-NEXT:    br label [[EXIT:%.*]]
+; CHECK:       false.br:
+; CHECK-NEXT:    call void @fn(i32 [[VAL]])
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %val = load i32, ptr %p, !invariant.load !0
+  call void @fn()
+  br i1 %cond, label %true.br, label %false.br
+true.br:
+  call void @fn()
+  br label %exit
+false.br:
+  call void @fn(i32 %val)
+  br label %exit
+exit:
+  ret void
+}
+
+declare void @fn()
+
 !0 = !{}


        


More information about the llvm-commits mailing list