Files
llvm-project/llvm/test/Transforms/HotColdSplit/duplicate-phi-preds-crash.ll
Shimin Cui 66f0da7388 [Extractor] Use function return for the one and only output (#191824)
Currently code extractor uses parameters to pass outputs.
Alloca/store/load instructions are used to get the output value in the
parent functions.

When there is only one output from the extracted code (this is one of
the most common cases), using the function return for the only one
output can facilitate the other transformations (eg, tail call opt).
This is to modify the code for the extracted function to return the
output value if there is only one output for the extracted region.
2026-04-20 16:55:50 -04:00

55 lines
1.7 KiB
LLVM

; RUN: opt -S -passes=hotcoldsplit -hotcoldsplit-threshold=0 < %s | FileCheck %s
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.14.0"
declare void @sideeffect(i64)
declare ptr @realloc(ptr %ptr, i64 %size)
declare void @free(ptr %ptr)
declare void @sink() cold
; CHECK-LABEL: define {{.*}}@realloc2(
; CHECK: call {{.*}}@sideeffect(
; CHECK: call {{.*}}@realloc(
; CHECK-LABEL: codeRepl:
; CHECK: %2 = call {{.*}}@realloc2.cold.1(i64 %size, ptr %ptr)
; CHECK-LABEL: cleanup:
; CHECK-NEXT: phi ptr [ null, %if.then ], [ %call, %if.end ], [ %2, %codeRepl ]
define ptr @realloc2(ptr %ptr, i64 %size) {
entry:
%0 = add i64 %size, -1
%1 = icmp ugt i64 %0, 184549375
br i1 %1, label %if.then, label %if.end
if.then: ; preds = %entry
call void @sideeffect(i64 %size)
br label %cleanup
if.end: ; preds = %entry
%call = call ptr @realloc(ptr %ptr, i64 %size)
%tobool1 = icmp eq ptr %call, null
br i1 %tobool1, label %if.then2, label %cleanup
if.then2: ; preds = %if.end
call void @sideeffect(i64 %size)
call void @sink()
%tobool3 = icmp eq ptr %ptr, null
br i1 %tobool3, label %cleanup, label %if.then4
if.then4: ; preds = %if.then2
call void @free(ptr %ptr)
br label %cleanup
cleanup: ; preds = %if.end, %if.then4, %if.then2, %if.then
%retval.0 = phi ptr [ null, %if.then ], [ null, %if.then2 ], [ null, %if.then4 ], [ %call, %if.end ]
ret ptr %retval.0
}
; CHECK-LABEL: define {{.*}}@realloc2.cold.1(
; CHECK: call {{.*}}@sideeffect
; CHECK: call {{.*}}@sink
; CHECK: call {{.*}}@free