1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00
Matthias Braun 4f8d8e1f44 X86/TargetTransformInfo: Report div/rem constant immediate costs as TCC_Free
DIV/REM by constants should always be expanded into mul/shift/etc.
patterns. Unfortunately the ConstantHoisting pass runs too early at a
point where the pattern isn't expanded yet. However after
ConstantHoisting hoisted some immediate the result may not expand
anymore. Also the hoisting typically doesn't make sense because it
operates on immediates that will change completely during the expansion.

Report DIV/REM as TCC_Free so ConstantHoisting will not touch them.

Differential Revision: https://reviews.llvm.org/D53174

llvm-svn: 344315
2018-10-11 23:14:35 +00:00

48 lines
1.3 KiB
LLVM

; RUN: opt -consthoist -S < %s | FileCheck %s
target triple = "x86_64--"
; We don't want to convert constant divides because the benefit from converting
; them to a mul in the backend is larget than constant materialization savings.
define void @signed_const_division(i64 %in1, i64 %in2, i64* %addr) {
; CHECK-LABEL: @signed_const_division
; CHECK: %res1 = sdiv i64 %l1, 4294967296
; CHECK: %res2 = srem i64 %l2, 4294967296
entry:
br label %loop
loop:
%l1 = phi i64 [%res1, %loop], [%in1, %entry]
%l2 = phi i64 [%res2, %loop], [%in2, %entry]
%res1 = sdiv i64 %l1, 4294967296
store volatile i64 %res1, i64* %addr
%res2 = srem i64 %l2, 4294967296
store volatile i64 %res2, i64* %addr
%again = icmp eq i64 %res1, %res2
br i1 %again, label %loop, label %end
end:
ret void
}
define void @unsigned_const_division(i64 %in1, i64 %in2, i64* %addr) {
; CHECK-LABEL: @unsigned_const_division
; CHECK: %res1 = udiv i64 %l1, 4294967296
; CHECK: %res2 = urem i64 %l2, 4294967296
entry:
br label %loop
loop:
%l1 = phi i64 [%res1, %loop], [%in1, %entry]
%l2 = phi i64 [%res2, %loop], [%in2, %entry]
%res1 = udiv i64 %l1, 4294967296
store volatile i64 %res1, i64* %addr
%res2 = urem i64 %l2, 4294967296
store volatile i64 %res2, i64* %addr
%again = icmp eq i64 %res1, %res2
br i1 %again, label %loop, label %end
end:
ret void
}