Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
X86/TargetTransformInfo: Report div/rem constant immediate costs as T…
…CC_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
- Loading branch information
Showing
2 changed files
with
52 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
; 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 | ||
} |