1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instcombine,early-cse -earlycse-debug-hash -S < %s | FileCheck %s 3 4define ptr @simplifyNullLaunder() { 5; CHECK-LABEL: @simplifyNullLaunder( 6; CHECK-NEXT: ret ptr null 7; 8 %b2 = call ptr @llvm.launder.invariant.group.p0(ptr null) 9 ret ptr %b2 10} 11 12define ptr @dontSimplifyNullLaunderNoNullOpt() #0 { 13; CHECK-LABEL: @dontSimplifyNullLaunderNoNullOpt( 14; CHECK-NEXT: [[B2:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr null) 15; CHECK-NEXT: ret ptr [[B2]] 16; 17 %b2 = call ptr @llvm.launder.invariant.group.p0(ptr null) 18 ret ptr %b2 19} 20 21define ptr addrspace(42) @dontsimplifyNullLaunderForDifferentAddrspace() { 22; CHECK-LABEL: @dontsimplifyNullLaunderForDifferentAddrspace( 23; CHECK-NEXT: [[B2:%.*]] = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) null) 24; CHECK-NEXT: ret ptr addrspace(42) [[B2]] 25; 26 %b2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) null) 27 ret ptr addrspace(42) %b2 28} 29 30define ptr @simplifyUndefLaunder() { 31; CHECK-LABEL: @simplifyUndefLaunder( 32; CHECK-NEXT: ret ptr undef 33; 34 %b2 = call ptr @llvm.launder.invariant.group.p0(ptr undef) 35 ret ptr %b2 36} 37 38define ptr addrspace(42) @simplifyUndefLaunder2() { 39; CHECK-LABEL: @simplifyUndefLaunder2( 40; CHECK-NEXT: ret ptr addrspace(42) undef 41; 42 %b2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) undef) 43 ret ptr addrspace(42) %b2 44} 45 46define ptr @simplifyNullStrip() { 47; CHECK-LABEL: @simplifyNullStrip( 48; CHECK-NEXT: ret ptr null 49; 50 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr null) 51 ret ptr %b2 52} 53 54define ptr @dontSimplifyNullStripNonNullOpt() #0 { 55; CHECK-LABEL: @dontSimplifyNullStripNonNullOpt( 56; CHECK-NEXT: [[B2:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr null) 57; CHECK-NEXT: ret ptr [[B2]] 58; 59 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr null) 60 ret ptr %b2 61} 62 63define ptr addrspace(42) @dontsimplifyNullStripForDifferentAddrspace() { 64; CHECK-LABEL: @dontsimplifyNullStripForDifferentAddrspace( 65; CHECK-NEXT: [[B2:%.*]] = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) null) 66; CHECK-NEXT: ret ptr addrspace(42) [[B2]] 67; 68 %b2 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) null) 69 ret ptr addrspace(42) %b2 70} 71 72define ptr @simplifyUndefStrip() { 73; CHECK-LABEL: @simplifyUndefStrip( 74; CHECK-NEXT: ret ptr undef 75; 76 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr undef) 77 ret ptr %b2 78} 79 80define ptr addrspace(42) @simplifyUndefStrip2() { 81; CHECK-LABEL: @simplifyUndefStrip2( 82; CHECK-NEXT: ret ptr addrspace(42) undef 83; 84 %b2 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) undef) 85 ret ptr addrspace(42) %b2 86} 87 88define ptr @simplifyLaunderOfLaunder(ptr %a) { 89; CHECK-LABEL: @simplifyLaunderOfLaunder( 90; CHECK-NEXT: [[A3:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[A:%.*]]) 91; CHECK-NEXT: ret ptr [[A3]] 92; 93 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 94 %a3 = call ptr @llvm.launder.invariant.group.p0(ptr %a2) 95 ret ptr %a3 96} 97 98define ptr @simplifyStripOfLaunder(ptr %a) { 99; CHECK-LABEL: @simplifyStripOfLaunder( 100; CHECK-NEXT: [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]]) 101; CHECK-NEXT: ret ptr [[A3]] 102; 103 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 104 %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2) 105 ret ptr %a3 106} 107 108define i1 @simplifyForCompare(ptr %a) { 109; CHECK-LABEL: @simplifyForCompare( 110; CHECK-NEXT: [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]]) 111; CHECK-NEXT: ret i1 true 112; 113 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 114 115 %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2) 116 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr %a) 117 %c = icmp eq ptr %a3, %b2 118 ret i1 %c 119} 120 121define ptr @skipWithDifferentTypes(ptr %a) { 122; CHECK-LABEL: @skipWithDifferentTypes( 123; CHECK-NEXT: [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]]) 124; CHECK-NEXT: ret ptr [[A3]] 125; 126 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 127 128 %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2) 129 ret ptr %a3 130} 131 132define ptr addrspace(42) @skipWithDifferentTypesAddrspace(ptr addrspace(42) %a) { 133; CHECK-LABEL: @skipWithDifferentTypesAddrspace( 134; CHECK-NEXT: [[A3:%.*]] = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) [[A:%.*]]) 135; CHECK-NEXT: ret ptr addrspace(42) [[A3]] 136; 137 %a2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) %a) 138 139 %a3 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) %a2) 140 ret ptr addrspace(42) %a3 141} 142 143define ptr addrspace(42) @skipWithDifferentTypesDifferentAddrspace(ptr %a) { 144; CHECK-LABEL: @skipWithDifferentTypesDifferentAddrspace( 145; CHECK-NEXT: [[TMP1:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]]) 146; CHECK-NEXT: [[A3:%.*]] = addrspacecast ptr [[TMP1]] to ptr addrspace(42) 147; CHECK-NEXT: ret ptr addrspace(42) [[A3]] 148; 149 %cast = addrspacecast ptr %a to ptr addrspace(42) 150 %a2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) %cast) 151 152 %a3 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) %a2) 153 ret ptr addrspace(42) %a3 154} 155 156define i1 @icmp_null_launder(ptr %a) { 157; CHECK-LABEL: @icmp_null_launder( 158; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null 159; CHECK-NEXT: ret i1 [[R]] 160; 161 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 162 %r = icmp eq ptr %a2, null 163 ret i1 %r 164} 165 166define i1 @icmp_null_strip(ptr %a) { 167; CHECK-LABEL: @icmp_null_strip( 168; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null 169; CHECK-NEXT: ret i1 [[R]] 170; 171 %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a) 172 %r = icmp eq ptr %a2, null 173 ret i1 %r 174} 175 176define i1 @icmp_null_launder_valid_null(ptr %a) #0 { 177; CHECK-LABEL: @icmp_null_launder_valid_null( 178; CHECK-NEXT: [[A2:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[A:%.*]]) 179; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A2]], null 180; CHECK-NEXT: ret i1 [[R]] 181; 182 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 183 %r = icmp eq ptr %a2, null 184 ret i1 %r 185} 186 187define i1 @icmp_null_strip_valid_null(ptr %a) #0 { 188; CHECK-LABEL: @icmp_null_strip_valid_null( 189; CHECK-NEXT: [[A2:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]]) 190; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A2]], null 191; CHECK-NEXT: ret i1 [[R]] 192; 193 %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a) 194 %r = icmp eq ptr %a2, null 195 ret i1 %r 196} 197 198; Check that null always becomes the RHS 199define i1 @icmp_null_launder_lhs(ptr %a) { 200; CHECK-LABEL: @icmp_null_launder_lhs( 201; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null 202; CHECK-NEXT: ret i1 [[R]] 203; 204 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 205 %r = icmp eq ptr null, %a2 206 ret i1 %r 207} 208 209define i1 @icmp_null_launder_bitcasts(ptr %a) { 210; CHECK-LABEL: @icmp_null_launder_bitcasts( 211; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null 212; CHECK-NEXT: ret i1 [[R]] 213; 214 %a3 = call ptr @llvm.launder.invariant.group.p0(ptr %a) 215 %r = icmp eq ptr %a3, null 216 ret i1 %r 217} 218 219declare ptr @llvm.launder.invariant.group.p0(ptr) 220declare ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42)) 221declare ptr @llvm.strip.invariant.group.p0(ptr) 222declare ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42)) 223 224attributes #0 = { null_pointer_is_valid } 225