30 lines
880 B
LLVM
30 lines
880 B
LLVM
; 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
|
|
|
|
define <4 x float> @invariant_load(ptr %in, i32 %s) {
|
|
; CHECK-LABEL: @invariant_load(
|
|
; CHECK-NEXT: main_body:
|
|
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[S:%.*]], 0
|
|
; CHECK-NEXT: br i1 [[C]], label [[BLOCK:%.*]], label [[END:%.*]]
|
|
; CHECK: block:
|
|
; 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: ret <4 x float> [[V]]
|
|
;
|
|
main_body:
|
|
%v = load <4 x float>, ptr %in, !invariant.load !0
|
|
%c = icmp eq i32 %s, 0
|
|
br i1 %c, label %block, label %end
|
|
block:
|
|
%z = add i32 %s, 1
|
|
br label %end
|
|
end:
|
|
ret <4 x float> %v
|
|
}
|
|
|
|
!0 = !{}
|