forked from OSchip/llvm-project
InstCombine: FoldGEPICmp shouldn't change sign of base pointer comparison
Changing the sign when comparing the base pointer would introduce all sorts of unexpected things like: %gep.i = getelementptr inbounds [1 x i8]* %a, i32 0, i32 0 %gep2.i = getelementptr inbounds [1 x i8]* %b, i32 0, i32 0 %cmp.i = icmp ult i8* %gep.i, %gep2.i %cmp.i1 = icmp ult [1 x i8]* %a, %b %cmp = icmp ne i1 %cmp.i, %cmp.i1 ret i1 %cmp into: %cmp.i = icmp slt [1 x i8]* %a, %b %cmp.i1 = icmp ult [1 x i8]* %a, %b %cmp = xor i1 %cmp.i, %cmp.i1 ret i1 %cmp By preserving the original sign, we now get: ret i1 false This fixes PR16483. llvm-svn: 185259
This commit is contained in:
parent
92a8a7d45a
commit
5953d3712a
|
@ -647,8 +647,7 @@ Instruction *InstCombiner::FoldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||||
|
|
||||||
// If all indices are the same, just compare the base pointers.
|
// If all indices are the same, just compare the base pointers.
|
||||||
if (IndicesTheSame)
|
if (IndicesTheSame)
|
||||||
return new ICmpInst(ICmpInst::getSignedPredicate(Cond),
|
return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
|
||||||
GEPLHS->getOperand(0), GEPRHS->getOperand(0));
|
|
||||||
|
|
||||||
// If we're comparing GEPs with two base pointers that only differ in type
|
// If we're comparing GEPs with two base pointers that only differ in type
|
||||||
// and both GEPs have only constant indices or just one use, then fold
|
// and both GEPs have only constant indices or just one use, then fold
|
||||||
|
|
|
@ -509,4 +509,14 @@ define void @test39(%struct.ham* %arg, i8 %arg1) nounwind {
|
||||||
; CHECK: getelementptr inbounds i8* %tmp3, i64 -8
|
; CHECK: getelementptr inbounds i8* %tmp3, i64 -8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i1 @pr16483([1 x i8]* %a, [1 x i8]* %b) {
|
||||||
|
%c = getelementptr [1 x i8]* %a, i32 0, i32 0
|
||||||
|
%d = getelementptr [1 x i8]* %b, i32 0, i32 0
|
||||||
|
%cmp = icmp ult i8* %c, %d
|
||||||
|
ret i1 %cmp
|
||||||
|
|
||||||
|
; CHECK: @pr16483
|
||||||
|
; CHECK-NEXT: icmp ult [1 x i8]* %a, %b
|
||||||
|
}
|
||||||
|
|
||||||
; CHECK: attributes [[NUW]] = { nounwind }
|
; CHECK: attributes [[NUW]] = { nounwind }
|
||||||
|
|
Loading…
Reference in New Issue