| ; 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 |