Skip to content

Commit

Permalink
Returning poison from a function w/ noundef return attribute is UB
Browse files Browse the repository at this point in the history
This does for readability of returns within said function as what we do for the caller side when reasoning about what might be poison.

Differential Revision: https://reviews.llvm.org/D111180
  • Loading branch information
preames committed Oct 6, 2021
1 parent f53d051 commit 67896f4
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 18 deletions.
5 changes: 4 additions & 1 deletion llvm/lib/Analysis/ValueTracking.cpp
Expand Up @@ -5418,7 +5418,10 @@ void llvm::getGuaranteedWellDefinedOps(
}
break;
}

case Instruction::Ret:
if (I->getFunction()->hasRetAttribute(Attribute::NoUndef))
Operands.insert(I->getOperand(0));
break;
default:
break;
}
Expand Down
22 changes: 5 additions & 17 deletions llvm/test/Analysis/ScalarEvolution/flags-from-poison.ll
Expand Up @@ -1621,49 +1621,37 @@ cont6: ; preds = %cont1, %if.then
br label %for.cond
}

; TODO: once D111180 lands, remove the udiv from these *-basic tests.
; noundef really should be enough

define noundef i32 @add-basic(i32 %a, i32 %b) {
; CHECK-LABEL: 'add-basic'
; CHECK-NEXT: Classifying expressions for: @add-basic
; CHECK-NEXT: %res = add nuw nsw i32 %a, %b
; CHECK-NEXT: --> (%a + %b)<nuw><nsw> U: full-set S: full-set
; CHECK-NEXT: %res2 = udiv i32 255, %res
; CHECK-NEXT: --> (255 /u (%a + %b)<nuw><nsw>) U: [0,256) S: [0,256)
; CHECK-NEXT: Determining loop execution counts for: @add-basic
;
%res = add nuw nsw i32 %a, %b
%res2 = udiv i32 255, %res
ret i32 %res2
ret i32 %res
}

define noundef i32 @sub-basic(i32 %a, i32 %b) {
; CHECK-LABEL: 'sub-basic'
; CHECK-NEXT: Classifying expressions for: @sub-basic
; CHECK-NEXT: %res = sub nuw nsw i32 %a, %b
; CHECK-NEXT: --> ((-1 * %b) + %a) U: full-set S: full-set
; CHECK-NEXT: %res2 = udiv i32 255, %res
; CHECK-NEXT: --> (255 /u ((-1 * %b) + %a)) U: [0,256) S: [0,256)
; CHECK-NEXT: Determining loop execution counts for: @sub-basic
;
%res = sub nuw nsw i32 %a, %b
%res2 = udiv i32 255, %res
ret i32 %res2
ret i32 %res
}

define noundef i32 @mul-basic(i32 %a, i32 %b) {
; CHECK-LABEL: 'mul-basic'
; CHECK-NEXT: Classifying expressions for: @mul-basic
; CHECK-NEXT: %res = mul nuw nsw i32 %a, %b
; CHECK-NEXT: --> (%a * %b)<nuw><nsw> U: full-set S: full-set
; CHECK-NEXT: %res2 = udiv i32 255, %res
; CHECK-NEXT: --> (255 /u (%a * %b)<nuw><nsw>) U: [0,256) S: [0,256)
; CHECK-NEXT: Determining loop execution counts for: @mul-basic
;
%res = mul nuw nsw i32 %a, %b
%res2 = udiv i32 255, %res
ret i32 %res2
ret i32 %res
}

@gA = external global i32
Expand Down Expand Up @@ -1746,9 +1734,9 @@ define noundef i32 @mul-recurse() {
; CHECK-NEXT: %d = load i32, i32* @gD, align 4
; CHECK-NEXT: --> %d U: full-set S: full-set
; CHECK-NEXT: %x = mul nuw i32 %a, %b
; CHECK-NEXT: --> (%a * %b) U: full-set S: full-set
; CHECK-NEXT: --> (%a * %b)<nuw> U: full-set S: full-set
; CHECK-NEXT: %y = mul nuw i32 %c, %d
; CHECK-NEXT: --> (%c * %d) U: full-set S: full-set
; CHECK-NEXT: --> (%c * %d)<nuw> U: full-set S: full-set
; CHECK-NEXT: %res = mul nuw i32 %x, %y
; CHECK-NEXT: --> (%a * %b * %c * %d) U: full-set S: full-set
; CHECK-NEXT: Determining loop execution counts for: @mul-recurse
Expand Down

0 comments on commit 67896f4

Please sign in to comment.