[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