225 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine,early-cse -earlycse-debug-hash -S < %s | FileCheck %s3 4define ptr @simplifyNullLaunder() {5; CHECK-LABEL: @simplifyNullLaunder(6; CHECK-NEXT: ret ptr null7;8 %b2 = call ptr @llvm.launder.invariant.group.p0(ptr null)9 ret ptr %b210}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 %b219}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) %b228}29 30define ptr @simplifyUndefLaunder() {31; CHECK-LABEL: @simplifyUndefLaunder(32; CHECK-NEXT: ret ptr undef33;34 %b2 = call ptr @llvm.launder.invariant.group.p0(ptr undef)35 ret ptr %b236}37 38define ptr addrspace(42) @simplifyUndefLaunder2() {39; CHECK-LABEL: @simplifyUndefLaunder2(40; CHECK-NEXT: ret ptr addrspace(42) undef41;42 %b2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) undef)43 ret ptr addrspace(42) %b244}45 46define ptr @simplifyNullStrip() {47; CHECK-LABEL: @simplifyNullStrip(48; CHECK-NEXT: ret ptr null49;50 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr null)51 ret ptr %b252}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 %b261}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) %b270}71 72define ptr @simplifyUndefStrip() {73; CHECK-LABEL: @simplifyUndefStrip(74; CHECK-NEXT: ret ptr undef75;76 %b2 = call ptr @llvm.strip.invariant.group.p0(ptr undef)77 ret ptr %b278}79 80define ptr addrspace(42) @simplifyUndefStrip2() {81; CHECK-LABEL: @simplifyUndefStrip2(82; CHECK-NEXT: ret ptr addrspace(42) undef83;84 %b2 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) undef)85 ret ptr addrspace(42) %b286}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 %a396}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 %a3106}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 true112;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, %b2118 ret i1 %c119}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 %a3130}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) %a3141}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) %a3154}155 156define i1 @icmp_null_launder(ptr %a) {157; CHECK-LABEL: @icmp_null_launder(158; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null159; CHECK-NEXT: ret i1 [[R]]160;161 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)162 %r = icmp eq ptr %a2, null163 ret i1 %r164}165 166define i1 @icmp_null_strip(ptr %a) {167; CHECK-LABEL: @icmp_null_strip(168; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null169; CHECK-NEXT: ret i1 [[R]]170;171 %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)172 %r = icmp eq ptr %a2, null173 ret i1 %r174}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]], null180; CHECK-NEXT: ret i1 [[R]]181;182 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)183 %r = icmp eq ptr %a2, null184 ret i1 %r185}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]], null191; CHECK-NEXT: ret i1 [[R]]192;193 %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)194 %r = icmp eq ptr %a2, null195 ret i1 %r196}197 198; Check that null always becomes the RHS199define i1 @icmp_null_launder_lhs(ptr %a) {200; CHECK-LABEL: @icmp_null_launder_lhs(201; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null202; CHECK-NEXT: ret i1 [[R]]203;204 %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)205 %r = icmp eq ptr null, %a2206 ret i1 %r207}208 209define i1 @icmp_null_launder_bitcasts(ptr %a) {210; CHECK-LABEL: @icmp_null_launder_bitcasts(211; CHECK-NEXT: [[R:%.*]] = icmp eq ptr [[A:%.*]], null212; CHECK-NEXT: ret i1 [[R]]213;214 %a3 = call ptr @llvm.launder.invariant.group.p0(ptr %a)215 %r = icmp eq ptr %a3, null216 ret i1 %r217}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