Skip to content

Commit

Permalink
[SCCP] Use poison instead of undef when zapping returns
Browse files Browse the repository at this point in the history
  • Loading branch information
nikic committed Jun 25, 2024
1 parent 4acc8ee commit 16bb8c1
Show file tree
Hide file tree
Showing 23 changed files with 69 additions and 69 deletions.
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/SCCP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ static bool runIPSCCP(
SmallSetVector<Function *, 8> FuncZappedReturn;
for (ReturnInst *RI : ReturnsToZap) {
Function *F = RI->getParent()->getParent();
RI->setOperand(0, UndefValue::get(F->getReturnType()));
RI->setOperand(0, PoisonValue::get(F->getReturnType()));
// Record all functions that are zapped.
FuncZappedReturn.insert(F);
}
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/Transforms/FunctionSpecialization/track-return.ll
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ define internal i64 @foo(i1 %flag, i64 %m, i64 %n) {
; CHECK-NEXT: [[RES0:%.*]] = call i64 @bar.specialized.6(i64 4)
; CHECK-NEXT: br label %merge
; CHECK: merge:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
; CHECK: define internal i64 @foo.specialized.2
; CHECK-NEXT: entry:
Expand All @@ -34,7 +34,7 @@ define internal i64 @foo(i1 %flag, i64 %m, i64 %n) {
; CHECK-NEXT: [[RES1:%.*]] = call i64 @bar.specialized.5(i64 3)
; CHECK-NEXT: br label %merge
; CHECK: merge:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
entry:
br i1 %flag, label %plus, label %minus
Expand All @@ -58,11 +58,11 @@ define internal i64 @binop(i64 %x, i64 %y) {
;
; CHECK: define internal i64 @binop.specialized.3
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
; CHECK: define internal i64 @binop.specialized.4
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
entry:
%z = add i64 %x, %y
Expand All @@ -77,15 +77,15 @@ define internal i64 @bar(i64 %n) {
; CHECK: if.else:
; CHECK-NEXT: br label %if.end
; CHECK: if.end:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
; CHECK: define internal i64 @bar.specialized.6
; CHECK-NEXT: entry:
; CHECK-NEXT: br label %if.then
; CHECK: if.then:
; CHECK-NEXT: br label %if.end
; CHECK: if.end:
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
entry:
%cmp = icmp sgt i64 %n, 3
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/2009-01-14-IPSCCP-Invoke.ll
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ UnifiedReturnBlock:

define internal i32 @f() {
; CHECK-LABEL: define internal i32 @f() {
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
ret i32 42
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/apint-ipsccp2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ define internal i101 @bar(i101 %A) {
; CHECK-NEXT: br label %[[T:.*]]
; CHECK: [[T]]:
; CHECK-NEXT: [[B:%.*]] = call i101 @bar(i101 0)
; CHECK-NEXT: ret i101 undef
; CHECK-NEXT: ret i101 poison
;
%x = icmp eq i101 %A, 0
br i1 %x, label %T, label %F
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/arg-count-mismatch.ll
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
define internal i16 @vararg_prop(i16 %p1, ...) {
; CHECK-LABEL: define {{[^@]+}}@vararg_prop
; CHECK-SAME: (i16 [[P1:%.*]], ...) {
; CHECK-NEXT: ret i16 undef
; CHECK-NEXT: ret i16 poison
;
ret i16 %p1
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/indirectbr.ll
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ define internal i32 @indbrtest5(i1 %c) {
; CHECK: target1:
; CHECK-NEXT: br label [[TARGET2]]
; CHECK: target2:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
br i1 %c, label %bb1, label %bb2
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/Transforms/SCCP/ip-constant-ranges.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ define internal i32 @f1(i32 %a, i32 %b) {
; CHECK-LABEL: define {{[^@]+}}@f1
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
%cmp.a = icmp sgt i32 %a, 300
Expand Down Expand Up @@ -81,7 +81,7 @@ define internal i32 @f3(i32 %x) {
; CHECK-LABEL: define {{[^@]+}}@f3
; CHECK-SAME: (i32 [[X:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
%cmp = icmp sgt i32 %x, 300
Expand Down Expand Up @@ -118,7 +118,7 @@ define internal i32 @f4(i32 %x) {
; CHECK-LABEL: define {{[^@]+}}@f4
; CHECK-SAME: (i32 [[X:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
%cmp = icmp sgt i32 %x, 300
Expand Down Expand Up @@ -172,7 +172,7 @@ define internal i1 @test_unreachable_callee(i32 %a) {
; CHECK-LABEL: define {{[^@]+}}@test_unreachable_callee
; CHECK-SAME: (i32 [[A:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i1 undef
; CHECK-NEXT: ret i1 poison
;
entry:
ret i1 true
Expand Down Expand Up @@ -284,7 +284,7 @@ define internal i32 @callee6.1(i32 %i) {
; CHECK-LABEL: define {{[^@]+}}@callee6.1
; CHECK-SAME: (i32 [[I:%.*]]) {
; CHECK-NEXT: [[RES:%.*]] = call i32 @callee6.2(i32 [[I]])
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%res = call i32 @callee6.2(i32 %i)
ret i32 %res
Expand All @@ -295,7 +295,7 @@ define internal i32 @callee6.2(i32 %i) {
; CHECK-SAME: (i32 [[I:%.*]]) {
; CHECK-NEXT: br label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;

%cmp = icmp ne i32 %i, 0
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/ip-ranges-phis.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
define internal i32 @f1(i32 %x) {
; CHECK-LABEL: define {{[^@]+}}@f1
; CHECK-SAME: (i32 [[X:%.*]]) {
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%cmp = icmp sgt i32 %x, 300
%res = select i1 %cmp, i32 1, i32 2
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/ip-ranges-select.ll
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ define internal i32 @callee.1(i32 %arg) {
; CHECK-NEXT: [[SEL:%.*]] = select i1 false, i32 16, i32 [[ARG]]
; CHECK-NEXT: br label [[BB10:%.*]]
; CHECK: bb10:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%c.1 = icmp slt i32 %arg, 0
%sel = select i1 %c.1, i32 16, i32 %arg
Expand Down
26 changes: 13 additions & 13 deletions llvm/test/Transforms/SCCP/ipsccp-basic.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
define internal i32 @test1a(i32 %A) {
; CHECK-LABEL: define internal i32 @test1a
; CHECK-SAME: (i32 [[A:%.*]]) {
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%X = add i32 1, 2
ret i32 %A
Expand All @@ -34,7 +34,7 @@ define internal i32 @test2a(i32 %A) {
; CHECK-NEXT: br label [[T:%.*]]
; CHECK: T:
; CHECK-NEXT: [[B:%.*]] = call i32 @test2a(i32 0)
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%C = icmp eq i32 %A, 0
br i1 %C, label %T, label %F
Expand Down Expand Up @@ -97,7 +97,7 @@ F:

define internal {i64,i64} @test4a() {
; CHECK-LABEL: define internal { i64, i64 } @test4a() {
; CHECK-NEXT: ret { i64, i64 } undef
; CHECK-NEXT: ret { i64, i64 } poison
;
%a = insertvalue {i64,i64} undef, i64 4, 1
%b = insertvalue {i64,i64} %a, i64 5, 0
Expand All @@ -107,13 +107,13 @@ define internal {i64,i64} @test4a() {
define i64 @test4b() personality ptr @__gxx_personality_v0 {
; CHECK-LABEL: define range(i64 0, 6) i64 @test4b() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: [[A:%.*]] = invoke { i64, i64 } @test4a()
; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]]
; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]]
; CHECK: A:
; CHECK-NEXT: [[C:%.*]] = call i64 @test4c(i64 5)
; CHECK-NEXT: ret i64 5
; CHECK: B:
; CHECK-NEXT: [[VAL:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: catch ptr null
; CHECK-NEXT: catch ptr null
; CHECK-NEXT: ret i64 0
;
%a = invoke {i64,i64} @test4a()
Expand All @@ -131,7 +131,7 @@ B:
define internal i64 @test4c(i64 %a) {
; CHECK-LABEL: define internal i64 @test4c
; CHECK-SAME: (i64 [[A:%.*]]) {
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
ret i64 %a
}
Expand All @@ -141,7 +141,7 @@ define internal i64 @test4c(i64 %a) {
; PR4313
define internal {i64,i64} @test5a() {
; CHECK-LABEL: define internal { i64, i64 } @test5a() {
; CHECK-NEXT: ret { i64, i64 } undef
; CHECK-NEXT: ret { i64, i64 } poison
;
%a = insertvalue {i64,i64} undef, i64 4, 1
%b = insertvalue {i64,i64} %a, i64 5, 0
Expand All @@ -151,13 +151,13 @@ define internal {i64,i64} @test5a() {
define i64 @test5b() personality ptr @__gxx_personality_v0 {
; CHECK-LABEL: define range(i64 0, 6) i64 @test5b() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: [[A:%.*]] = invoke { i64, i64 } @test5a()
; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]]
; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]]
; CHECK: A:
; CHECK-NEXT: [[C:%.*]] = call i64 @test5c({ i64, i64 } { i64 5, i64 4 })
; CHECK-NEXT: ret i64 5
; CHECK: B:
; CHECK-NEXT: [[VAL:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: catch ptr null
; CHECK-NEXT: catch ptr null
; CHECK-NEXT: ret i64 0
;
%a = invoke {i64,i64} @test5a()
Expand All @@ -174,7 +174,7 @@ B:
define internal i64 @test5c({i64,i64} %a) {
; CHECK-LABEL: define internal i64 @test5c
; CHECK-SAME: ({ i64, i64 } [[A:%.*]]) {
; CHECK-NEXT: ret i64 undef
; CHECK-NEXT: ret i64 poison
;
%b = extractvalue {i64,i64} %a, 0
ret i64 %b
Expand Down Expand Up @@ -206,7 +206,7 @@ define i64 @test6b() {
define internal %T @test7a(i32 %A) {
; CHECK-LABEL: define internal %T @test7a
; CHECK-SAME: (i32 [[A:%.*]]) {
; CHECK-NEXT: ret [[T:%.*]] undef
; CHECK-NEXT: ret [[T:%.*]] poison
;
%X = add i32 1, %A
%mrv0 = insertvalue %T undef, i32 %X, 0
Expand All @@ -216,7 +216,7 @@ define internal %T @test7a(i32 %A) {

define i32 @test7b() {
; CHECK-LABEL: define i32 @test7b() {
; CHECK-NEXT: [[X:%.*]] = call [[T:%.*]] @test7a(i32 17)
; CHECK-NEXT: [[X:%.*]] = call [[T:%.*]] @[[TEST7A:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]](i32 17)
; CHECK-NEXT: ret i32 36
;
%X = call %T @test7a(i32 17)
Expand All @@ -232,7 +232,7 @@ define internal {} @test8a(i32 %A, ptr %P) {
; CHECK-LABEL: define internal {} @test8a
; CHECK-SAME: (i32 [[A:%.*]], ptr [[P:%.*]]) {
; CHECK-NEXT: store i32 5, ptr [[P]], align 4
; CHECK-NEXT: ret {} undef
; CHECK-NEXT: ret {} poison
;
store i32 %A, ptr %P
ret {} {}
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/SCCP/ipsccp-clear-returned.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ define internal i32 @func_return_undef(i32 returned %arg) {
; CHECK-LABEL: define internal i32 @func_return_undef(
; CHECK-SAME: i32 [[ARG:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
ret i32 %arg
Expand All @@ -44,7 +44,7 @@ define internal i32 @blockaddr_user(i1 %c, i32 returned %d) {
; CHECK: [[TARGET1]]:
; CHECK-NEXT: br label %[[TARGET2]]
; CHECK: [[TARGET2]]:
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
entry:
br i1 %c, label %bb1, label %bb2
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/SCCP/ipsccp-noundef.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,36 @@

define internal noundef i32 @ret_noundef() {
; CHECK-LABEL: define internal i32 @ret_noundef() {
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
ret i32 0
}

define internal dereferenceable(1) ptr @ret_dereferenceable() {
; CHECK-LABEL: define internal ptr @ret_dereferenceable() {
; CHECK-NEXT: ret ptr undef
; CHECK-NEXT: ret ptr poison
;
ret ptr @g
}

define internal dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null() {
; CHECK-LABEL: define internal ptr @ret_dereferenceable_or_null() {
; CHECK-NEXT: ret ptr undef
; CHECK-NEXT: ret ptr poison
;
ret ptr @g
}

; Non-null is fine, because it does not cause immediate UB.
define internal nonnull ptr @ret_nonnull() {
; CHECK-LABEL: define internal nonnull ptr @ret_nonnull() {
; CHECK-NEXT: ret ptr undef
; CHECK-NEXT: ret ptr poison
;
ret ptr @g
}

define internal nonnull ptr @ret_nonnull_noundef() {
; CHECK-LABEL: define internal nonnull ptr @ret_nonnull_noundef() {
; CHECK-NEXT: ret ptr undef
; CHECK-NEXT: ret ptr poison
;
ret ptr @g
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/SCCP/ipsccp-preserve-analysis.ll
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ define internal i32 @f1() readnone {
; IR-NEXT: [[ENTRY:.*:]]
; IR-NEXT: br label %[[BB2:.*]]
; IR: [[BB2]]:
; IR-NEXT: ret i32 undef
; IR-NEXT: ret i32 poison
;
entry:
br i1 false, label %bb1, label %bb2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ define internal i32 @assume_self_user() {
; CHECK-LABEL: define {{[^@]+}}@assume_self_user() {
; CHECK-NEXT: [[OBJSIZE:%.*]] = call i32 @llvm.objectsize.i32.p0(ptr @assume_self_user, i1 false, i1 false, i1 false)
; CHECK-NEXT: store i32 [[OBJSIZE]], ptr @extern, align 4
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%objsize = call i32 @llvm.objectsize.i32.p0(ptr @assume_self_user, i1 false, i1 false, i1 false)
store i32 %objsize, ptr @extern
Expand Down Expand Up @@ -50,7 +50,7 @@ define internal i32 @constexpr_self_user(i32 %arg0) addrspace(1) {
; CHECK-SAME: (i32 [[ARG0:%.*]]) addrspace(1) {
; CHECK-NEXT: [[OBJSIZE:%.*]] = call i32 @llvm.objectsize.i32.p0(ptr addrspacecast (ptr addrspace(1) @constexpr_self_user to ptr), i1 false, i1 false, i1 false)
; CHECK-NEXT: store i32 [[OBJSIZE]], ptr @extern, align 4
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: ret i32 poison
;
%objsize = call i32 @llvm.objectsize.i32.p0(ptr addrspacecast (ptr addrspace(1) @constexpr_self_user to ptr), i1 false, i1 false, i1 false)
store i32 %objsize, ptr @extern
Expand Down
Loading

0 comments on commit 16bb8c1

Please sign in to comment.