1; RUN: opt -S -hotcoldsplit < %s | FileCheck %s 2 3; Source: 4; 5; extern void sideeffect(int); 6; extern void __attribute__((cold)) sink(); 7; void foo(int cond) { 8; if (cond) { //< Start outlining here. 9; while (cond > 10) { 10; --cond; 11; sideeffect(0); 12; } 13; sink(); 14; } 15; sideeffect(1); 16; } 17 18target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 19target triple = "x86_64-apple-macosx10.14.0" 20 21; CHECK-LABEL: define {{.*}}@foo( 22; CHECK: br i1 {{.*}}, label %if.end, label %codeRepl 23; CHECK-LABEL: codeRepl: 24; CHECK-NEXT: call void @foo.cold.1 25; CHECK-LABEL: if.end: 26; CHECK: call void @sideeffect(i32 1) 27define void @foo(i32 %cond) { 28entry: 29 %tobool = icmp eq i32 %cond, 0 30 br i1 %tobool, label %if.end, label %while.cond.preheader 31 32while.cond.preheader: ; preds = %entry 33 %cmp3 = icmp sgt i32 %cond, 10 34 br i1 %cmp3, label %while.body.preheader, label %while.end 35 36while.body.preheader: ; preds = %while.cond.preheader 37 br label %while.body 38 39while.body: ; preds = %while.body.preheader, %while.body 40 %cond.addr.04 = phi i32 [ %dec, %while.body ], [ %cond, %while.body.preheader ] 41 %dec = add nsw i32 %cond.addr.04, -1 42 tail call void @sideeffect(i32 0) #3 43 %cmp = icmp sgt i32 %dec, 10 44 br i1 %cmp, label %while.body, label %while.end.loopexit 45 46while.end.loopexit: ; preds = %while.body 47 br label %while.end 48 49while.end: ; preds = %while.end.loopexit, %while.cond.preheader 50 tail call void (...) @sink() 51 ret void 52 53if.end: ; preds = %entry 54 tail call void @sideeffect(i32 1) 55 ret void 56} 57 58; CHECK-LABEL: define {{.*}}@foo.cold.1 59; CHECK: phi i32 60; CHECK-NEXT: add nsw i32 61; CHECK-NEXT: call {{.*}}@sideeffect 62; CHECK-NEXT: icmp 63; CHECK-NEXT: br 64 65declare void @sideeffect(i32) 66 67declare void @sink(...) cold 68