xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/X86/delete-assume-dead-code.ll (revision f1ec0d12bb0843f0deab83ef2b5cf1339cbc4f0b)
152cc97a0SBenjamin Kramer; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*f1ec0d12SNick Anderson; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S -mtriple=x86_64-linux < %s | FileCheck %s
352cc97a0SBenjamin Kramer
4d9e51e75SMatt Arsenaultdefine i32 @test1(ptr %d) nounwind {
552cc97a0SBenjamin Kramer; CHECK-LABEL: @test1(
652cc97a0SBenjamin Kramer; CHECK-NEXT:  entry:
7d9e51e75SMatt Arsenault; CHECK-NEXT:    [[L:%.*]] = load i8, ptr [[D:%.*]], align 1
852cc97a0SBenjamin Kramer; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i8 [[L]], 0
952cc97a0SBenjamin Kramer; CHECK-NEXT:    [[CONV:%.*]] = zext i1 [[TMP0]] to i32
1052cc97a0SBenjamin Kramer; CHECK-NEXT:    ret i32 [[CONV]]
1152cc97a0SBenjamin Kramer;
1252cc97a0SBenjamin Kramerentry:
13d9e51e75SMatt Arsenault  %l = load i8, ptr %d
1452cc97a0SBenjamin Kramer  %cmp = icmp eq i8 %l, 0
1552cc97a0SBenjamin Kramer  br i1 %cmp, label %exit, label %if.end
1652cc97a0SBenjamin Kramer
1752cc97a0SBenjamin Kramerif.end:
18d9e51e75SMatt Arsenault  %gep = getelementptr i8, ptr %d, i32 42
19d9e51e75SMatt Arsenault  %call = call i64 @foo(ptr %gep) nounwind readonly willreturn
2052cc97a0SBenjamin Kramer  %cmp2 = icmp ne i64 %call, 0
2152cc97a0SBenjamin Kramer  call void @llvm.assume(i1 %cmp2)
2252cc97a0SBenjamin Kramer  br label %exit
2352cc97a0SBenjamin Kramer
2452cc97a0SBenjamin Kramerexit:
2552cc97a0SBenjamin Kramer  %conv = zext i1 %cmp to i32
2652cc97a0SBenjamin Kramer  ret i32 %conv
2752cc97a0SBenjamin Kramer}
2852cc97a0SBenjamin Kramer
29d57ed844SSerguei Katkovdefine i32 @test2(i32 %N) nounwind {
30d57ed844SSerguei Katkov; CHECK-LABEL: @test2(
31d57ed844SSerguei Katkov; CHECK-NEXT:  entry:
32d57ed844SSerguei Katkov; CHECK-NEXT:    br label [[HEADER:%.*]]
33d57ed844SSerguei Katkov; CHECK:       header:
34d57ed844SSerguei Katkov; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[HEADER]] ]
35d57ed844SSerguei Katkov; CHECK-NEXT:    [[IV_INC]] = add i32 [[IV]], 1
36d57ed844SSerguei Katkov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
37d57ed844SSerguei Katkov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[HEADER]]
38d57ed844SSerguei Katkov; CHECK:       exit:
39d57ed844SSerguei Katkov; CHECK-NEXT:    ret i32 [[IV]]
40d57ed844SSerguei Katkov;
41d57ed844SSerguei Katkoventry:
42d57ed844SSerguei Katkov  br label %header
43d57ed844SSerguei Katkov
44d57ed844SSerguei Katkovheader:
45d57ed844SSerguei Katkov  %iv = phi i32 [0, %entry], [%iv.inc, %header]
46d57ed844SSerguei Katkov  %iv2 = phi i32 [0, %entry], [%iv2.inc, %header]
47d57ed844SSerguei Katkov  %iv.inc = add i32 %iv, 1
48d57ed844SSerguei Katkov  %iv2.inc = add i32 %iv2, 1
49d57ed844SSerguei Katkov  %cmp = icmp eq i32 %iv, %N
50d119c386SSerguei Katkov  %cmp2 = icmp sle i32 %iv2, %N
51d57ed844SSerguei Katkov  call void @llvm.assume(i1 %cmp2)
52d57ed844SSerguei Katkov  br i1 %cmp, label %exit, label %header
53d57ed844SSerguei Katkov
54d57ed844SSerguei Katkovexit:
55d57ed844SSerguei Katkov  ret i32 %iv
56d57ed844SSerguei Katkov}
57d57ed844SSerguei Katkov
58d57ed844SSerguei Katkovdefine i32 @test3(i32 %N) nounwind {
59d57ed844SSerguei Katkov; CHECK-LABEL: @test3(
60d57ed844SSerguei Katkov; CHECK-NEXT:  entry:
61d57ed844SSerguei Katkov; CHECK-NEXT:    br label [[HEADER:%.*]]
62d57ed844SSerguei Katkov; CHECK:       header:
63d57ed844SSerguei Katkov; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[HEADER]] ]
64d57ed844SSerguei Katkov; CHECK-NEXT:    [[IV_INC]] = add i32 [[IV]], 1
65d57ed844SSerguei Katkov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
66d57ed844SSerguei Katkov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[HEADER]]
67d57ed844SSerguei Katkov; CHECK:       exit:
68d57ed844SSerguei Katkov; CHECK-NEXT:    ret i32 [[IV]]
69d57ed844SSerguei Katkov;
70d57ed844SSerguei Katkoventry:
71d57ed844SSerguei Katkov  br label %header
72d57ed844SSerguei Katkov
73d57ed844SSerguei Katkovheader:
74d57ed844SSerguei Katkov  %iv = phi i32 [0, %entry], [%iv.inc, %header]
75d57ed844SSerguei Katkov  %iv2 = phi i32 [0, %entry], [%iv2.inc, %header]
76d57ed844SSerguei Katkov  %iv.inc = add i32 %iv, 1
77d57ed844SSerguei Katkov  %iv2.inc = add i32 %iv2, 1
78d57ed844SSerguei Katkov  %cmp = icmp eq i32 %iv, %N
79d119c386SSerguei Katkov  %cmp2 = icmp sle i32 %iv2.inc, %N
80d57ed844SSerguei Katkov  call void @llvm.assume(i1 %cmp2)
81d57ed844SSerguei Katkov  br i1 %cmp, label %exit, label %header
82d57ed844SSerguei Katkov
83d57ed844SSerguei Katkovexit:
84d57ed844SSerguei Katkov  ret i32 %iv
85d57ed844SSerguei Katkov}
86d57ed844SSerguei Katkov
87d119c386SSerguei Katkov; Two assumes case.
88d119c386SSerguei Katkovdefine i32 @test4(i32 %N) nounwind {
89d119c386SSerguei Katkov; CHECK-LABEL: @test4(
90d119c386SSerguei Katkov; CHECK-NEXT:  entry:
91d119c386SSerguei Katkov; CHECK-NEXT:    br label [[HEADER:%.*]]
92d119c386SSerguei Katkov; CHECK:       header:
93d119c386SSerguei Katkov; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[HEADER]] ]
94d119c386SSerguei Katkov; CHECK-NEXT:    [[IV_INC]] = add i32 [[IV]], 1
95d119c386SSerguei Katkov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
96d119c386SSerguei Katkov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[HEADER]]
97d119c386SSerguei Katkov; CHECK:       exit:
98d119c386SSerguei Katkov; CHECK-NEXT:    ret i32 [[IV]]
99d119c386SSerguei Katkov;
100d119c386SSerguei Katkoventry:
101d119c386SSerguei Katkov  br label %header
102d119c386SSerguei Katkov
103d119c386SSerguei Katkovheader:
104d119c386SSerguei Katkov  %iv = phi i32 [0, %entry], [%iv.inc, %header]
105d119c386SSerguei Katkov  %iv2 = phi i32 [0, %entry], [%iv2.inc, %header]
106d119c386SSerguei Katkov  %iv.inc = add i32 %iv, 1
107d119c386SSerguei Katkov  %iv2.inc = add i32 %iv2, 1
108d119c386SSerguei Katkov  %cmp = icmp eq i32 %iv, %N
109d119c386SSerguei Katkov  %cmp2 = icmp sle i32 %iv2.inc, %N
110d119c386SSerguei Katkov  call void @llvm.assume(i1 %cmp2)
111d119c386SSerguei Katkov  %cmp3 = icmp sge i32 %iv2.inc, 0
112d119c386SSerguei Katkov  call void @llvm.assume(i1 %cmp3)
113d119c386SSerguei Katkov  br i1 %cmp, label %exit, label %header
114d119c386SSerguei Katkov
115d119c386SSerguei Katkovexit:
116d119c386SSerguei Katkov  ret i32 %iv
117d119c386SSerguei Katkov}
118d119c386SSerguei Katkov
119d119c386SSerguei Katkov; phi is used in assume and in compare.
120d119c386SSerguei Katkovdefine i32 @test5(i32 %N, i32 %M) nounwind {
121d119c386SSerguei Katkov; CHECK-LABEL: @test5(
122d119c386SSerguei Katkov; CHECK-NEXT:  entry:
123d119c386SSerguei Katkov; CHECK-NEXT:    br label [[HEADER:%.*]]
124d119c386SSerguei Katkov; CHECK:       header:
125d119c386SSerguei Katkov; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[HEADER]] ]
126d119c386SSerguei Katkov; CHECK-NEXT:    [[IV2:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[IV2_INC:%.*]], [[HEADER]] ]
127d119c386SSerguei Katkov; CHECK-NEXT:    [[IV_INC]] = add i32 [[IV]], 1
128d119c386SSerguei Katkov; CHECK-NEXT:    [[IV2_INC]] = add i32 [[IV2]], 1
129d119c386SSerguei Katkov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
130d119c386SSerguei Katkov; CHECK-NEXT:    [[CMP3:%.*]] = icmp sge i32 [[IV2_INC]], [[M:%.*]]
131d119c386SSerguei Katkov; CHECK-NEXT:    [[CMP4:%.*]] = and i1 [[CMP]], [[CMP3]]
132d119c386SSerguei Katkov; CHECK-NEXT:    br i1 [[CMP4]], label [[EXIT:%.*]], label [[HEADER]]
133d119c386SSerguei Katkov; CHECK:       exit:
134d119c386SSerguei Katkov; CHECK-NEXT:    ret i32 [[IV]]
135d119c386SSerguei Katkov;
136d119c386SSerguei Katkoventry:
137d119c386SSerguei Katkov  br label %header
138d119c386SSerguei Katkov
139d119c386SSerguei Katkovheader:
140d119c386SSerguei Katkov  %iv = phi i32 [0, %entry], [%iv.inc, %header]
141d119c386SSerguei Katkov  %iv2 = phi i32 [0, %entry], [%iv2.inc, %header]
142d119c386SSerguei Katkov  %iv.inc = add i32 %iv, 1
143d119c386SSerguei Katkov  %iv2.inc = add i32 %iv2, 1
144d119c386SSerguei Katkov  %cmp = icmp eq i32 %iv, %N
145d119c386SSerguei Katkov  %cmp2 = icmp sle i32 %iv2.inc, %N
146d119c386SSerguei Katkov  call void @llvm.assume(i1 %cmp2)
147d119c386SSerguei Katkov  %cmp3 = icmp sge i32 %iv2.inc, %M
148d119c386SSerguei Katkov  %cmp4 = and i1 %cmp, %cmp3
149d119c386SSerguei Katkov  br i1 %cmp4, label %exit, label %header
150d119c386SSerguei Katkov
151d119c386SSerguei Katkovexit:
152d119c386SSerguei Katkov  ret i32 %iv
153d119c386SSerguei Katkov}
154d119c386SSerguei Katkov
155d9e51e75SMatt Arsenaultdeclare i64 @foo(ptr) nounwind readonly willreturn
15652cc97a0SBenjamin Kramerdeclare void @llvm.assume(i1 noundef) nounwind willreturn
157