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