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