; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --include-generated-funcs ; RUN: opt -S -iroutliner -ir-outlining-no-cost < %s | FileCheck %s ; This is a test to ensure that when the first instruction is a commutative ; instruction, but the order of operands is reversed, we pass the arguments ; in the correct order, such that we do not use the wrong arguments ; later on in the computation. define void @fish(i32 %0, i32 %1, i32 %2) { entry: %3 = add nsw i32 %0, %1 %4 = sub nsw i32 %1, %2 %5 = sub nsw i32 %0, %2 ret void } define void @turtle(i32 %0, i32 %1, i32 %2) { %4 = add nsw i32 %1, %0 %5 = sub nsw i32 %1, %2 %6 = sub nsw i32 %0, %2 ret void } ; CHECK-LABEL: @fish( ; CHECK-NEXT: entry: ; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]]) ; CHECK-NEXT: ret void ; ; ; CHECK-LABEL: @turtle( ; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]]) ; CHECK-NEXT: ret void ; ; ; CHECK: @outlined_ir_func_0(i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]]) ; CHECK: entry_to_outline: ; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP0]], [[TMP1]] ; CHECK-NEXT: [[TMP4:%.*]] = sub nsw i32 [[TMP1]], [[TMP2]] ; CHECK-NEXT: [[TMP5:%.*]] = sub nsw i32 [[TMP0]], [[TMP2]] ; CHECK-NEXT: br label [[ENTRY_AFTER_OUTLINE_EXITSTUB:%.*]] ;