| ; 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 = !{} |