Skip to content

Commit 6eec7f5

Browse files
committed
Revert changes and replace undef with poison
1 parent fff79ff commit 6eec7f5

File tree

3 files changed

+35
-42
lines changed

3 files changed

+35
-42
lines changed

llvm/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -passes=sccp -S | FileCheck %s
33

4-
define i32 @foo(i1 %arg) {
4+
; Branch on poison is UB, so the T block is never executed, and we can return
5+
; undef (IPSCCP would replace the block with unreachable).
6+
7+
define i32 @foo() {
58
; CHECK-LABEL: @foo(
6-
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[T:%.*]], label [[T]]
7-
; CHECK: T:
8-
; CHECK-NEXT: ret i32 1
9+
; CHECK-NEXT: unreachable
910
;
10-
br i1 %arg, label %T, label %T
11+
br i1 poison, label %T, label %T
1112
T:
1213
%X = add i32 0, 1
1314
ret i32 %X

llvm/test/Transforms/SCCP/return-zapped.ll

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,37 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
22
; RUN: opt < %s -S -passes=ipsccp | FileCheck %s
33

4-
define void @test1(i1 %arg) {
5-
; CHECK-LABEL: define {{[^@]+}}@test1
6-
; CHECK-SAME: (i1 [[ARG:%.*]]) {
4+
; testf() performs an unconditional branch on poison, as such the testf() return
5+
; value used in test1() will remain "unknown" and the following branch on it
6+
; replaced by unreachable. This is fine, as the call to testf() will already
7+
; trigger undefined behavior.
8+
define void @test1() {
9+
; CHECK-LABEL: define {{[^@]+}}@test1() {
710
; CHECK-NEXT: entry:
811
; CHECK-NEXT: br label [[IF_THEN:%.*]]
912
; CHECK: if.then:
10-
; CHECK-NEXT: [[CALL:%.*]] = call i1 @testf(i1 [[ARG]])
11-
; CHECK-NEXT: br label [[IF_END:%.*]]
12-
; CHECK: if.end:
13-
; CHECK-NEXT: ret void
13+
; CHECK-NEXT: [[CALL:%.*]] = call i1 @testf()
14+
; CHECK-NEXT: unreachable
1415
;
1516
entry:
1617
br label %if.then
1718
if.then: ; preds = %entry, %if.then
1819
%foo = phi i32 [ 0, %entry], [ %next, %if.then]
1920
%next = add i32 %foo, 1
20-
%call = call i1 @testf(i1 %arg)
21+
%call = call i1 @testf()
2122
br i1 %call, label %if.end, label %if.then
2223

2324
if.end: ; preds = %if.then, %entry
2425
ret void
2526
}
2627

27-
define internal i1 @testf(i1 %arg) {
28-
; CHECK-LABEL: define {{[^@]+}}@testf
29-
; CHECK-SAME: (i1 [[ARG:%.*]]) {
28+
define internal i1 @testf() {
29+
; CHECK-LABEL: define {{[^@]+}}@testf() {
3030
; CHECK-NEXT: entry:
31-
; CHECK-NEXT: br i1 [[ARG]], label [[IF_THEN1:%.*]], label [[IF_END3:%.*]]
32-
; CHECK: if.then1:
33-
; CHECK-NEXT: br label [[IF_END3]]
34-
; CHECK: if.end3:
35-
; CHECK-NEXT: ret i1 true
31+
; CHECK-NEXT: unreachable
3632
;
3733
entry:
38-
br i1 %arg, label %if.then1, label %if.end3
34+
br i1 poison, label %if.then1, label %if.end3
3935

4036
if.then1: ; preds = %if.end
4137
br label %if.end3
@@ -51,7 +47,7 @@ define i1 @test2() {
5147
; CHECK-NEXT: br label [[IF_END:%.*]]
5248
; CHECK: if.end:
5349
; CHECK-NEXT: [[CALL2:%.*]] = call i1 @testf()
54-
; CHECK-NEXT: ret i1 [[CALL2]]
50+
; CHECK-NEXT: ret i1 undef
5551
;
5652
entry:
5753
br label %if.end

llvm/test/Transforms/SCCP/solve-after-each-resolving-undefs-for-function.ll

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
33

4-
define internal i32 @testf(i1 %c, i1 %arg) {
5-
; CHECK-LABEL: define internal range(i32 10, 12) i32 @testf(
6-
; CHECK-SAME: i1 [[C:%.*]], i1 [[ARG:%.*]]) {
4+
;
5+
define internal i32 @testf(i1 %c) {
6+
; CHECK-LABEL: define internal i32 @testf(
7+
; CHECK-SAME: i1 [[C:%.*]]) {
78
; CHECK-NEXT: [[ENTRY:.*:]]
89
; CHECK-NEXT: br i1 [[C]], label %[[IF_COND:.*]], label %[[IF_END:.*]]
910
; CHECK: [[IF_COND]]:
10-
; CHECK-NEXT: br i1 [[ARG]], label %[[IF_THEN:.*]], label %[[IF_END]]
11-
; CHECK: [[IF_THEN]]:
12-
; CHECK-NEXT: ret i32 11
11+
; CHECK-NEXT: unreachable
1312
; CHECK: [[IF_END]]:
14-
; CHECK-NEXT: ret i32 10
13+
; CHECK-NEXT: ret i32 poison
1514
;
1615
entry:
1716
br i1 %c, label %if.cond, label %if.end
1817

1918
if.cond:
20-
br i1 %arg, label %if.then, label %if.end
19+
br i1 poison, label %if.then, label %if.end
2120

2221
if.then: ; preds = %entry, %if.then
2322
ret i32 11
@@ -27,25 +26,22 @@ if.end: ; preds = %if.then1, %entry
2726
}
2827

2928
;
30-
define internal i32 @test1(i1 %c, i1 %arg) {
31-
; CHECK-LABEL: define internal range(i32 0, 100) i32 @test1(
32-
; CHECK-SAME: i1 [[C:%.*]], i1 [[ARG:%.*]]) {
29+
define internal i32 @test1(i1 %c) {
30+
; CHECK-LABEL: define internal i32 @test1(
31+
; CHECK-SAME: i1 [[C:%.*]]) {
3332
; CHECK-NEXT: [[ENTRY:.*:]]
3433
; CHECK-NEXT: br label %[[IF_THEN:.*]]
3534
; CHECK: [[IF_THEN]]:
36-
; CHECK-NEXT: [[CALL:%.*]] = call i32 @testf(i1 [[C]], i1 [[ARG]])
37-
; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[CALL]], 10
38-
; CHECK-NEXT: br i1 [[RES]], label %[[RET1:.*]], label %[[RET2:.*]]
35+
; CHECK-NEXT: [[CALL:%.*]] = call i32 @testf(i1 [[C]])
36+
; CHECK-NEXT: br label %[[RET1:.*]]
3937
; CHECK: [[RET1]]:
40-
; CHECK-NEXT: ret i32 99
41-
; CHECK: [[RET2]]:
42-
; CHECK-NEXT: ret i32 0
38+
; CHECK-NEXT: ret i32 poison
4339
;
4440
entry:
4541
br label %if.then
4642

4743
if.then: ; preds = %entry, %if.then
48-
%call = call i32 @testf(i1 %c, i1 %arg)
44+
%call = call i32 @testf(i1 %c)
4945
%res = icmp eq i32 %call, 10
5046
br i1 %res, label %ret1, label %ret2
5147

@@ -61,7 +57,7 @@ define i32 @main(i1 %c) {
6157
; CHECK-LABEL: define i32 @main(
6258
; CHECK-SAME: i1 [[C:%.*]]) {
6359
; CHECK-NEXT: [[RES:%.*]] = call i32 @test1(i1 [[C]])
64-
; CHECK-NEXT: ret i32 [[RES]]
60+
; CHECK-NEXT: ret i32 99
6561
;
6662
%res = call i32 @test1(i1 %c)
6763
ret i32 %res

0 commit comments

Comments
 (0)