forked from OSchip/llvm-project
[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:
parent
091f1b6ef3
commit
b99a06b7c9
|
@ -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))) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue