Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/IROutliner/outlining-constants-vs-registers.ll
Show All 9 Lines | |||||
; constant is seen first. | ; constant is seen first. | ||||
define void @function_registers_first(i32 %0, i32 %1, i32 %2) { | define void @function_registers_first(i32 %0, i32 %1, i32 %2) { | ||||
; CHECK-LABEL: @function_registers_first( | ; CHECK-LABEL: @function_registers_first( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: store i32 [[TMP0:%.*]], i32* [[A]], align 4 | ; CHECK-NEXT: call void @outlined_ir_func_1(i32 [[TMP0:%.*]], i32* [[A]], i32 [[TMP1:%.*]], i32* [[B]], i32 [[TMP2:%.*]], i32* [[C]]) | ||||
; CHECK-NEXT: store i32 [[TMP1:%.*]], i32* [[B]], align 4 | |||||
; CHECK-NEXT: store i32 [[TMP2:%.*]], i32* [[C]], align 4 | |||||
; CHECK-NEXT: ret void | ; CHECK-NEXT: ret void | ||||
; CHECK: next: | ; CHECK: next: | ||||
; CHECK-NEXT: store i32 2, i32* [[A]], align 4 | ; CHECK-NEXT: call void @outlined_ir_func_1(i32 2, i32* [[A]], i32 3, i32* [[B]], i32 4, i32* [[C]]) | ||||
; CHECK-NEXT: store i32 3, i32* [[B]], align 4 | |||||
; CHECK-NEXT: store i32 4, i32* [[C]], align 4 | |||||
; CHECK-NEXT: ret void | ; CHECK-NEXT: ret void | ||||
; | ; | ||||
entry: | entry: | ||||
%a = alloca i32, align 4 | %a = alloca i32, align 4 | ||||
%b = alloca i32, align 4 | %b = alloca i32, align 4 | ||||
%c = alloca i32, align 4 | %c = alloca i32, align 4 | ||||
store i32 %0, i32* %a, align 4 | store i32 %0, i32* %a, align 4 | ||||
store i32 %1, i32* %b, align 4 | store i32 %1, i32* %b, align 4 | ||||
store i32 %2, i32* %c, align 4 | store i32 %2, i32* %c, align 4 | ||||
ret void | ret void | ||||
next: | next: | ||||
store i32 2, i32* %a, align 4 | store i32 2, i32* %a, align 4 | ||||
store i32 3, i32* %b, align 4 | store i32 3, i32* %b, align 4 | ||||
store i32 4, i32* %c, align 4 | store i32 4, i32* %c, align 4 | ||||
ret void | ret void | ||||
} | } | ||||
define void @function_with_constants_first() { | define void @function_with_constants_first(i32 %0, i32 %1, i32 %2) { | ||||
; CHECK-LABEL: @function_with_constants_first( | ; CHECK-LABEL: @function_with_constants_first( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 | ; CHECK-NEXT: [[C:%.*]] = alloca i32, align 4 | ||||
; CHECK-NEXT: [[AL:%.*]] = load i32, i32* [[A]], align 4 | ; CHECK-NEXT: [[AL:%.*]] = load i32, i32* [[A]], align 4 | ||||
; CHECK-NEXT: [[BL:%.*]] = load i32, i32* [[B]], align 4 | ; CHECK-NEXT: [[BL:%.*]] = load i32, i32* [[B]], align 4 | ||||
; CHECK-NEXT: [[CL:%.*]] = load i32, i32* [[C]], align 4 | ; CHECK-NEXT: [[CL:%.*]] = load i32, i32* [[C]], align 4 | ||||
; CHECK-NEXT: [[TMP0:%.*]] = add i32 2, [[AL]] | ; CHECK-NEXT: call void @outlined_ir_func_0(i32 2, i32 [[AL]], i32 3, i32 [[BL]], i32 4, i32 [[CL]]) | ||||
; CHECK-NEXT: [[TMP1:%.*]] = add i32 3, [[BL]] | |||||
; CHECK-NEXT: [[TMP2:%.*]] = add i32 4, [[CL]] | |||||
; CHECK-NEXT: ret void | ; CHECK-NEXT: ret void | ||||
; CHECK: next: | ; CHECK: next: | ||||
; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP0]], [[AL]] | ; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[TMP0:%.*]], i32 [[AL]], i32 [[TMP1:%.*]], i32 [[BL]], i32 [[TMP2:%.*]], i32 [[CL]]) | ||||
; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[TMP1]], [[BL]] | |||||
; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[TMP2]], [[CL]] | |||||
; CHECK-NEXT: ret void | ; CHECK-NEXT: ret void | ||||
; | ; | ||||
entry: | entry: | ||||
%a = alloca i32, align 4 | %a = alloca i32, align 4 | ||||
%b = alloca i32, align 4 | %b = alloca i32, align 4 | ||||
%c = alloca i32, align 4 | %c = alloca i32, align 4 | ||||
%al = load i32, i32* %a | %al = load i32, i32* %a | ||||
%bl = load i32, i32* %b | %bl = load i32, i32* %b | ||||
%cl = load i32, i32* %c | %cl = load i32, i32* %c | ||||
%0 = add i32 2, %al | %3 = add i32 2, %al | ||||
%1 = add i32 3, %bl | %4 = add i32 3, %bl | ||||
%2 = add i32 4, %cl | %5 = add i32 4, %cl | ||||
ret void | ret void | ||||
next: | next: | ||||
%3 = add i32 %0, %al | %6 = add i32 %0, %al | ||||
%4 = add i32 %1, %bl | %7 = add i32 %1, %bl | ||||
%5 = add i32 %2, %cl | %8 = add i32 %2, %cl | ||||
ret void | ret void | ||||
} | } | ||||
; CHECK: define internal void @outlined_ir_func_0(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]], i32 [[ARG3:%.*]], i32 [[ARG4:%.*]], i32 [[ARG5:%.*]]) | |||||
; CHECK: entry_to_outline: | |||||
; CHECK-NEXT: add i32 [[ARG0]], [[ARG1]] | |||||
; CHECK-NEXT: add i32 [[ARG2]], [[ARG3]] | |||||
; CHECK-NEXT: add i32 [[ARG4]], [[ARG5]] | |||||
; CHECK: define internal void @outlined_ir_func_1(i32 [[ARG0:%.*]], i32* [[ARG1:%.*]], i32 [[ARG2:%.*]], i32* [[ARG3:%.*]], i32 [[ARG4:%.*]], i32* [[ARG5:%.*]]) | |||||
; CHECK: entry_to_outline: | |||||
; CHECK-NEXT: store i32 [[ARG0]], i32* [[ARG1]] | |||||
; CHECK-NEXT: store i32 [[ARG2]], i32* [[ARG3]] | |||||
; CHECK-NEXT: store i32 [[ARG4]], i32* [[ARG5]] |