1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s 3 4define noundef i32 @test_ret_noundef(i1 %cond) { 5; CHECK-LABEL: @test_ret_noundef( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: ret i32 1 8; 9entry: 10 br i1 %cond, label %bb1, label %bb2 11 12bb1: 13 br label %bb2 14 15bb2: 16 %r = phi i32 [ undef, %entry ], [ 1, %bb1 ] 17 ret i32 %r 18} 19 20define i32 @test_ret(i1 %cond) { 21; CHECK-LABEL: @test_ret( 22; CHECK-NEXT: entry: 23; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], i32 1, i32 undef 24; CHECK-NEXT: ret i32 [[SPEC_SELECT]] 25; 26entry: 27 br i1 %cond, label %bb1, label %bb2 28 29bb1: 30 br label %bb2 31 32bb2: 33 %r = phi i32 [ undef, %entry ], [ 1, %bb1 ] 34 ret i32 %r 35} 36 37define nonnull noundef ptr @test_ret_ptr_nonnull_noundef(i1 %cond, ptr %x) { 38; CHECK-LABEL: @test_ret_ptr_nonnull_noundef( 39; CHECK-NEXT: entry: 40; CHECK-NEXT: call void @llvm.assume(i1 [[COND:%.*]]) 41; CHECK-NEXT: ret ptr [[X:%.*]] 42; 43entry: 44 br i1 %cond, label %bb1, label %bb2 45 46bb1: 47 br label %bb2 48 49bb2: 50 %r = phi ptr [ null, %entry ], [ %x, %bb1 ] 51 ret ptr %r 52} 53 54define nonnull noundef ptr @test_ret_ptr_nonnull_noundef_gep_nonzero(i1 %cond, ptr %x) { 55; CHECK-LABEL: @test_ret_ptr_nonnull_noundef_gep_nonzero( 56; CHECK-NEXT: entry: 57; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null 58; CHECK-NEXT: [[GEP:%.*]] = getelementptr ptr, ptr [[SPEC_SELECT]], i64 12 59; CHECK-NEXT: ret ptr [[GEP]] 60; 61entry: 62 br i1 %cond, label %bb1, label %bb2 63 64bb1: 65 br label %bb2 66 67bb2: 68 %phi = phi ptr [ null, %entry ], [ %x, %bb1 ] 69 %gep = getelementptr ptr, ptr %phi, i64 12 70 ret ptr %gep 71} 72 73define nonnull noundef ptr @test_ret_ptr_nonnull_noundef_gep_inbounds_nonzero(i1 %cond, ptr %x) { 74; CHECK-LABEL: @test_ret_ptr_nonnull_noundef_gep_inbounds_nonzero( 75; CHECK-NEXT: entry: 76; CHECK-NEXT: call void @llvm.assume(i1 [[COND:%.*]]) 77; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds ptr, ptr [[X:%.*]], i64 12 78; CHECK-NEXT: ret ptr [[GEP]] 79; 80entry: 81 br i1 %cond, label %bb1, label %bb2 82 83bb1: 84 br label %bb2 85 86bb2: 87 %phi = phi ptr [ null, %entry ], [ %x, %bb1 ] 88 %gep = getelementptr inbounds ptr, ptr %phi, i64 12 89 ret ptr %gep 90} 91 92define nonnull ptr @test_ret_ptr_nonnull(i1 %cond, ptr %x) { 93; CHECK-LABEL: @test_ret_ptr_nonnull( 94; CHECK-NEXT: entry: 95; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null 96; CHECK-NEXT: ret ptr [[SPEC_SELECT]] 97; 98entry: 99 br i1 %cond, label %bb1, label %bb2 100 101bb1: 102 br label %bb2 103 104bb2: 105 %r = phi ptr [ null, %entry ], [ %x, %bb1 ] 106 ret ptr %r 107} 108 109define noundef ptr @test_ret_ptr_noundef(i1 %cond, ptr %x) { 110; CHECK-LABEL: @test_ret_ptr_noundef( 111; CHECK-NEXT: entry: 112; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null 113; CHECK-NEXT: ret ptr [[SPEC_SELECT]] 114; 115entry: 116 br i1 %cond, label %bb1, label %bb2 117 118bb1: 119 br label %bb2 120 121bb2: 122 %r = phi ptr [ null, %entry ], [ %x, %bb1 ] 123 ret ptr %r 124} 125 126define ptr @test_ret_ptr(i1 %cond, ptr %x) { 127; CHECK-LABEL: @test_ret_ptr( 128; CHECK-NEXT: entry: 129; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND:%.*]], ptr [[X:%.*]], ptr null 130; CHECK-NEXT: ret ptr [[SPEC_SELECT]] 131; 132entry: 133 br i1 %cond, label %bb1, label %bb2 134 135bb1: 136 br label %bb2 137 138bb2: 139 %r = phi ptr [ null, %entry ], [ %x, %bb1 ] 140 ret ptr %r 141} 142