[IndVar] Don't widen loop compare unless IV user is sign extended.

PR21030

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier 2014-09-26 20:05:35 +00:00
parent 07b7c98d61
commit 4150a8de76
2 changed files with 32 additions and 2 deletions

View File

@ -650,7 +650,7 @@ namespace {
struct WideIVInfo {
PHINode *NarrowIV;
Type *WidestNativeType; // Widest integer type created [sz]ext
bool IsSigned; // Was an sext user seen before a zext?
bool IsSigned; // Was a sext user seen before a zext?
WideIVInfo() : NarrowIV(nullptr), WidestNativeType(nullptr),
IsSigned(false) {}
@ -936,7 +936,11 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) {
if (!Cmp)
return false;
bool IsSigned = CmpInst::isSigned(Cmp->getPredicate());
// Must be a signed compare.
if (!CmpInst::isSigned(Cmp->getPredicate()))
return false;
// Must be a signed IV user.
if (!IsSigned)
return false;

View File

@ -136,3 +136,29 @@ for.body:
for.end:
ret i32 %sum.0
}
declare i32 @fn1(i8 signext)
; PR21030
; CHECK-LABEL: @test4
; CHECK: for.body:
; CHECK: phi i32
; CHECK: icmp sgt i8
define i32 @test4(i32 %a) {
entry:
br label %for.body
for.body:
%c.07 = phi i8 [ -3, %entry ], [ %dec, %for.body ]
%conv6 = zext i8 %c.07 to i32
%or = or i32 %a, %conv6
%conv3 = trunc i32 %or to i8
%call = call i32 @fn1(i8 signext %conv3)
%dec = add i8 %c.07, -1
%cmp = icmp sgt i8 %dec, -14
br i1 %cmp, label %for.body, label %for.end
for.end:
ret i32 0
}