| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes=hotcoldsplit -hotcoldsplit-threshold=0 < %s | FileCheck %s |
| |
| define void @two_phis_consume_cold_value(ptr %ctx, i1 %cond) { |
| ; CHECK-LABEL: define void @two_phis_consume_cold_value( |
| ; CHECK-SAME: ptr [[CTX:%.*]], i1 [[COND:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: br i1 [[COND]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] |
| ; CHECK: [[CODEREPL]]: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call ptr @two_phis_consume_cold_value.cold.1() #[[ATTR2:[0-9]+]] |
| ; CHECK-NEXT: br label %[[EXIT]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: [[A:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ poison, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[B:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ null, %[[ENTRY]] ] |
| ; CHECK-NEXT: [[FP:%.*]] = load ptr, ptr [[CTX]], align 8 |
| ; CHECK-NEXT: [[R:%.*]] = tail call i32 [[FP]](ptr [[B]], ptr null) |
| ; CHECK-NEXT: store volatile i32 0, ptr [[A]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br i1 %cond, label %cold, label %exit |
| |
| cold: |
| call void @sink() |
| %v = load volatile ptr, ptr null, align 8 |
| br label %exit |
| |
| exit: |
| %a = phi ptr [ %v, %cold ], [ poison, %entry ] |
| %b = phi ptr [ %v, %cold ], [ null, %entry ] |
| %fp = load ptr, ptr %ctx, align 8 |
| %r = tail call i32 %fp(ptr %b, ptr null) |
| store volatile i32 0, ptr %a, align 4 |
| ret void |
| } |
| |
| declare void @sink() cold |