[CodeGenPrep]No negative cost in the ExtLd promotion

Summary: This change prevent the signed value of cost from being negative as the value is passed as an unsigned argument.

Reviewers: mcrosier, jmolloy, qcolombet, javed.absar

Reviewed By: mcrosier, qcolombet

Subscribers: llvm-commits

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

llvm-svn: 293307
This commit is contained in:
Jun Bum Lim 2017-01-27 17:16:37 +00:00
parent 091f1b6ef3
commit b99a06b7c9
2 changed files with 25 additions and 1 deletions

View File

@ -4297,7 +4297,10 @@ bool CodeGenPrepare::extLdPromotion(TypePromotionTransaction &TPT,
// one extension but leave one. However, we optimistically keep going,
// because the new extension may be removed too.
long long TotalCreatedInstsCost = CreatedInstsCost + NewCreatedInstsCost;
TotalCreatedInstsCost -= ExtCost;
// FIXME: It would be possible to propagate a negative value instead of
// conservatively ceiling it to 0.
TotalCreatedInstsCost =
std::max((long long)0, (TotalCreatedInstsCost - ExtCost));
if (!StressExtLdPromotion &&
(TotalCreatedInstsCost > 1 ||
!isPromotedInstructionLegal(*TLI, *DL, PromotedVal))) {

View File

@ -636,3 +636,24 @@ define i64 @doNotPromoteBecauseOfPairedLoad(i32* %p, i32 %cst) {
%final = add i64 %sextres, %zextLd0
ret i64 %final
}
define i64 @promoteZextShl(i1 %c, i16* %P) {
entry:
; OPTALL-LABEL: promoteZextShl
; OPTALL-LABEL: entry:
; OPT: %[[LD:.*]] = load i16, i16* %P
; OPT: %[[EXT:.*]] = zext i16 %[[LD]] to i64
; OPT-LABEL: if.then:
; OPT: shl nsw i64 %[[EXT]], 1
; DISABLE-LABEL: if.then:
; DISABLE: %r = sext i32 %shl2 to i64
%ld = load i16, i16* %P
br i1 %c, label %end, label %if.then
if.then:
%z = zext i16 %ld to i32
%shl2 = shl nsw i32 %z, 1
%r = sext i32 %shl2 to i64
ret i64 %r
end:
ret i64 0
}