; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -mtriple=systemz-unknown -mcpu=z13 \
; RUN: | FileCheck %s -check-prefixes=CHECK,Z13
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -mtriple=systemz-unknown -mcpu=z14 \
; RUN: | FileCheck %s -check-prefixes=CHECK,Z14
;
; Test that loads into operations that can fold one memory operand get zero
; cost. In the case that both operands are loaded, one load should get a cost
; value.
define void @add() {
%li32 = load i32, ptr undef
add i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
add i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
add i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
add i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
add i32 %tr, undef
; Sign-extended loads
%li16_0 = load i16, ptr undef
%sext_0 = sext i16 %li16_0 to i32
add i32 %sext_0, undef
%li16_1 = load i16, ptr undef
%sext_1 = sext i16 %li16_1 to i64
add i64 %sext_1, undef
%li32_2 = load i32, ptr undef
%sext_2 = sext i32 %li32_2 to i64
add i64 %sext_2, undef
; Zero-extended loads
%li32_3 = load i32, ptr undef
%zext_0 = zext i32 %li32_3 to i64
add i64 %zext_0, undef
; Loads with multiple uses are *not* folded
%li16_3 = load i16, ptr undef
%sext_3 = sext i16 %li16_3 to i32
%sext_4 = sext i16 %li16_3 to i32
add i32 %sext_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = add i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = add i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = add i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = add i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = add i32 %tr, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = add i32 %sext_0, undef
; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, ptr undef
; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = add i64 %sext_1, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = add i64 %sext_2, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = add i64 %zext_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = add i32 %sext_3, undef
}
define void @add_i16_mem16(i16 %Arg, ptr %Src1, ptr %Src2, ptr %Dst, ptr %Src32) {
%L1 = load i16, ptr %Src1
%S0 = add i16 %L1, %Arg
store volatile i16 %S0, ptr %Dst
%L2 = load i16, ptr %Src1
%L3 = load i16, ptr %Src2
%S1 = add i16 %L2, %L3
store volatile i16 %S1, ptr %Dst
; Truncated load
%L32 = load i32, ptr %Src32
%tr = trunc i32 %L32 to i16
%S2 = add i16 %tr, %Arg
store volatile i16 %S2, ptr %Dst
ret void
; CHECK: function 'add_i16_mem16'
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S0 = add i16 %L1, %Arg
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S0, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L2 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L3 = load i16, ptr %Src2
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S1 = add i16 %L2, %L3
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S1, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, ptr %Src32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S2 = add i16 %tr, %Arg
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S2, ptr %Dst
}
define void @sub_lhs_mem() {
%li32 = load i32, ptr undef
sub i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
sub i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
sub i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
sub i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
sub i32 %tr, undef
; Sign-extended loads
%li16_0 = load i16, ptr undef
%sext_0 = sext i16 %li16_0 to i32
sub i32 %sext_0, undef
%li16_1 = load i16, ptr undef
%sext_1 = sext i16 %li16_1 to i64
sub i64 %sext_1, undef
%li32_2 = load i32, ptr undef
%sext_2 = sext i32 %li32_2 to i64
sub i64 %sext_2, undef
; Zero-extended loads
%li32_3 = load i32, ptr undef
%zext_0 = zext i32 %li32_3 to i64
sub i64 %zext_0, undef
; Loads with multiple uses are *not* folded
%li16_3 = load i16, ptr undef
%sext_3 = sext i16 %li16_3 to i32
%sext_4 = sext i16 %li16_3 to i32
sub i32 %sext_3, undef
ret void;
; A sub LHS loaded operand is *not* foldable.
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = sub i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = sub i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = sub i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = sub i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = sub i32 %tr, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_0 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = sub i32 %sext_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = sub i64 %sext_1, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = sub i64 %sext_2, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = sub i64 %zext_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = sub i32 %sext_3, undef
}
define void @sub_rhs_mem() {
%li32 = load i32, ptr undef
sub i32 undef, %li32
%li64 = load i64, ptr undef
sub i64 undef, %li64
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
sub i32 undef, %tr
; Sign-extended loads
%li16_0 = load i16, ptr undef
%sext_0 = sext i16 %li16_0 to i32
sub i32 undef, %sext_0
%li16_1 = load i16, ptr undef
%sext_1 = sext i16 %li16_1 to i64
sub i64 undef, %sext_1
%li32_2 = load i32, ptr undef
%sext_2 = sext i32 %li32_2 to i64
sub i64 undef, %sext_2
; Zero-extended loads
%li32_3 = load i32, ptr undef
%zext_0 = zext i32 %li32_3 to i64
sub i64 undef, %zext_0
; Loads with multiple uses are *not* folded
%li16_3 = load i16, ptr undef
%sext_3 = sext i16 %li16_3 to i32
%sext_4 = sext i16 %li16_3 to i32
sub i32 undef, %sext_3
ret void;
; A sub RHS loaded operand is foldable.
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = sub i32 undef, %li32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = sub i64 undef, %li64
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = sub i32 undef, %tr
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = sub i32 undef, %sext_0
; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, ptr undef
; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = sub i64 undef, %sext_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = sub i64 undef, %sext_2
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = sub i64 undef, %zext_0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = sub i32 undef, %sext_3
}
define void @sub_i16_mem16(i16 %Arg, ptr %Src1, ptr %Src2, ptr %Dst, ptr %Src32) {
%L1 = load i16, ptr %Src1
%D0 = sub i16 %Arg, %L1
store volatile i16 %D0, ptr %Dst
%L2 = load i16, ptr %Src1
%L3 = load i16, ptr %Src2
%D1 = sub i16 %L2, %L3
store volatile i16 %D1, ptr %Dst
; Truncated load
%L32 = load i32, ptr %Src32
%tr = trunc i32 %L32 to i16
%D2 = sub i16 %Arg, %tr
store volatile i16 %D2, ptr %Dst
ret void
; CHECK: function 'sub_i16_mem16'
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D0 = sub i16 %Arg, %L1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D0, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L2 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L3 = load i16, ptr %Src2
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D1 = sub i16 %L2, %L3
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D1, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, ptr %Src32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D2 = sub i16 %Arg, %tr
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D2, ptr %Dst
}
define void @mul() {
%li32 = load i32, ptr undef
mul i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
mul i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
mul i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
mul i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
mul i32 %tr, undef
; Sign-extended loads
%li16_0 = load i16, ptr undef
%sext_0 = sext i16 %li16_0 to i32
mul i32 %sext_0, undef
%li16_1 = load i16, ptr undef
%sext_1 = sext i16 %li16_1 to i64
mul i64 %sext_1, undef
%li32_2 = load i32, ptr undef
%sext_2 = sext i32 %li32_2 to i64
mul i64 %sext_2, undef
; Zero-extended loads are *not* folded
%li16_2 = load i16, ptr undef
%zext_0 = zext i16 %li16_2 to i32
mul i32 %zext_0, undef
; Loads with multiple uses are *not* folded
%li16_3 = load i16, ptr undef
%sext_3 = sext i16 %li16_3 to i32
%sext_4 = sext i16 %li16_3 to i32
mul i32 %sext_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = mul i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = mul i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = mul i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = mul i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = mul i32 %tr, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = mul i32 %sext_0, undef
; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, ptr undef
; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = mul i64 %sext_1, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = mul i64 %sext_2, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_2 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i16 %li16_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = mul i32 %zext_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = mul i32 %sext_3, undef
}
define void @mul_i16_mem16(i16 %Arg, ptr %Src1, ptr %Src2, ptr %Dst, ptr %Src32) {
%L1 = load i16, ptr %Src1
%P0 = mul i16 %Arg, %L1
store volatile i16 %P0, ptr %Dst
%L2 = load i16, ptr %Src1
%L3 = load i16, ptr %Src2
%P1 = mul i16 %L2, %L3
store volatile i16 %P1, ptr %Dst
; Truncated load
%L32 = load i32, ptr %Src32
%tr = trunc i32 %L32 to i16
%P2 = mul i16 %Arg, %tr
store volatile i16 %P2, ptr %Dst
ret void
; CHECK: function 'mul_i16_mem16'
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P0 = mul i16 %Arg, %L1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P0, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L2 = load i16, ptr %Src1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L3 = load i16, ptr %Src2
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P1 = mul i16 %L2, %L3
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P1, ptr %Dst
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, ptr %Src32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P2 = mul i16 %Arg, %tr
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P2, ptr %Dst
}
define void @sdiv_lhs(i32 %arg32, i64 %arg64) {
%li32 = load i32, ptr undef
sdiv i32 %li32, %arg32
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
sdiv i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
sdiv i64 %li64, %arg64
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
sdiv i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
sdiv i32 %tr, undef
; Sign-extended loads
%li32_2 = load i32, ptr undef
%sext_0 = sext i32 %li32_2 to i64
sdiv i64 %sext_0, undef
; Loads with multiple uses are *not* folded
%li32_3 = load i32, ptr undef
%sext_1 = sext i32 %li32_3 to i64
%sext_2 = sext i32 %li32_3 to i64
sdiv i64 %sext_1, undef
ret void;
; An sdiv loaded dividend (lhs) operand is *not* foldable.
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = sdiv i32 %li32, %arg32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = sdiv i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = sdiv i64 %li64, %arg64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = sdiv i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %5 = sdiv i32 %tr, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %6 = sdiv i64 %sext_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %7 = sdiv i64 %sext_1, undef
}
define void @sdiv_rhs(i32 %arg32, i64 %arg64) {
%li32 = load i32, ptr undef
sdiv i32 %arg32, %li32
%li64 = load i64, ptr undef
sdiv i64 %arg64, %li64
; Truncated load
%li64_2 = load i64, ptr undef
%tr = trunc i64 %li64_2 to i32
sdiv i32 undef, %tr
; Sign-extended loads
%li32_2 = load i32, ptr undef
%sext_0 = sext i32 %li32_2 to i64
sdiv i64 undef, %sext_0
; Loads with multiple uses are *not* folded
%li32_3 = load i32, ptr undef
%sext_1 = sext i32 %li32_3 to i64
%sext_2 = sext i32 %li32_3 to i64
sdiv i64 undef, %sext_1
ret void;
; An sdiv loaded divisor (rhs) operand is foldable.
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = sdiv i32 %arg32, %li32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = sdiv i64 %arg64, %li64
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = sdiv i32 undef, %tr
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = sdiv i64 undef, %sext_0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %5 = sdiv i64 undef, %sext_1
}
define void @udiv_lhs(i32 %arg32, i64 %arg64) {
%li32 = load i32, ptr undef
udiv i32 %li32, %arg32
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
udiv i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
udiv i64 %li64, %arg64
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
udiv i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
udiv i32 %tr_0, undef
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
udiv i64 %li64_3, undef
ret void;
; An udiv loaded dividend (lhs) operand is *not* foldable.
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = udiv i32 %li32, %arg32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = udiv i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = udiv i64 %li64, %arg64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = udiv i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %5 = udiv i32 %tr_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %6 = udiv i64 %li64_3, undef
}
define void @udiv_rhs(i32 %arg32, i64 %arg64) {
%li32 = load i32, ptr undef
udiv i32 %arg32, %li32
%li64 = load i64, ptr undef
udiv i64 %arg64, %li64
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
udiv i32 undef, %tr_0
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
udiv i64 undef, %li64_3
ret void;
; An udiv loaded divisor (rhs) operand is foldable.
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = udiv i32 %arg32, %li32
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = udiv i64 %arg64, %li64
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = udiv i32 undef, %tr_0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = udiv i64 undef, %li64_3
}
define void @and() {
%li32 = load i32, ptr undef
and i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
and i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
and i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
and i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
and i32 %tr_0, undef
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
and i64 %li64_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = and i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = and i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = and i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = and i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = and i32 %tr_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = and i64 %li64_3, undef
}
define void @or() {
%li32 = load i32, ptr undef
or i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
or i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
or i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
or i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
or i32 %tr_0, undef
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
or i64 %li64_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = or i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = or i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = or i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = or i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = or i32 %tr_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = or i64 %li64_3, undef
}
define void @xor() {
%li32 = load i32, ptr undef
xor i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
xor i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
xor i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
xor i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
xor i32 %tr_0, undef
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
xor i64 %li64_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = xor i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = xor i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = xor i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = xor i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = xor i32 %tr_0, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = xor i64 %li64_3, undef
}
define void @icmp() {
%li32 = load i32, ptr undef
icmp eq i32 %li32, undef
%li32_0 = load i32, ptr undef
%li32_1 = load i32, ptr undef
icmp eq i32 %li32_0, %li32_1
%li64 = load i64, ptr undef
icmp eq i64 %li64, undef
%li64_0 = load i64, ptr undef
%li64_1 = load i64, ptr undef
icmp eq i64 %li64_0, %li64_1
; Truncated load
%li64_2 = load i64, ptr undef
%tr_0 = trunc i64 %li64_2 to i32
icmp eq i32 %tr_0, undef
; Sign-extended load
%li32_2 = load i32, ptr undef
%sext = sext i32 %li32_2 to i64
icmp eq i64 %sext, undef
; Zero-extended load
%li32_3 = load i32, ptr undef
%zext = zext i32 %li32_3 to i64
icmp eq i64 %zext, undef
; Loads with multiple uses are *not* folded
%li64_3 = load i64, ptr undef
%tr_1 = trunc i64 %li64_3 to i32
icmp eq i64 %li64_3, undef
ret void;
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = icmp eq i32 %li32, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = icmp eq i32 %li32_0, %li32_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = icmp eq i64 %li64, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = icmp eq i64 %li64_0, %li64_1
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = icmp eq i32 %tr_0, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext = sext i32 %li32_2 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = icmp eq i64 %sext, undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext = zext i32 %li32_3 to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = icmp eq i64 %zext, undef
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, ptr undef
; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = icmp eq i64 %li64_3, undef
}