164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4@test.data = private unnamed_addr addrspace(2) constant [8 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7], align 45 6define void @test_load(ptr addrspace(1) %out, i64 %x) {7; CHECK-LABEL: @test_load(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr addrspace(2) @test.data, i64 [[X:%.*]]10; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 411; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]12; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 413; CHECK-NEXT: ret void14;15entry:16 %data = alloca [8 x i32], align 417 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)18 %arrayidx = getelementptr inbounds [8 x i32], ptr %data, i64 0, i64 %x19 %0 = load i32, ptr %arrayidx, align 420 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x21 store i32 %0, ptr addrspace(1) %arrayidx1, align 422 ret void23}24 25; Same as previous test, but with gep nusw nuw instead of inbounds.26define void @test_load_gep_nusw_nuw(ptr addrspace(1) %out, i64 %x) {27; CHECK-LABEL: @test_load_gep_nusw_nuw(28; CHECK-NEXT: entry:29; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr nusw nuw i32, ptr addrspace(2) @test.data, i64 [[X:%.*]]30; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 431; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr nusw nuw i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]32; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 433; CHECK-NEXT: ret void34;35entry:36 %data = alloca [8 x i32], align 437 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)38 %arrayidx = getelementptr nusw nuw [8 x i32], ptr %data, i64 0, i64 %x39 %0 = load i32, ptr %arrayidx, align 440 %arrayidx1 = getelementptr nusw nuw i32, ptr addrspace(1) %out, i64 %x41 store i32 %0, ptr addrspace(1) %arrayidx1, align 442 ret void43}44 45define void @test_load_bitcast_chain(ptr addrspace(1) %out, i64 %x) {46; CHECK-LABEL: @test_load_bitcast_chain(47; CHECK-NEXT: entry:48; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr addrspace(2) @test.data, i64 [[X:%.*]]49; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 450; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]51; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 452; CHECK-NEXT: ret void53;54entry:55 %data = alloca [8 x i32], align 456 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)57 %arrayidx = getelementptr inbounds i32, ptr %data, i64 %x58 %0 = load i32, ptr %arrayidx, align 459 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x60 store i32 %0, ptr addrspace(1) %arrayidx1, align 461 ret void62}63 64define void @test_call(ptr addrspace(1) %out, i64 %x) {65; CHECK-LABEL: @test_call(66; CHECK-NEXT: entry:67; CHECK-NEXT: [[DATA:%.*]] = alloca [8 x i32], align 468; CHECK-NEXT: call void @llvm.memcpy.p0.p2.i64(ptr noundef nonnull align 4 dereferenceable(32) [[DATA]], ptr addrspace(2) noundef align 4 dereferenceable(32) @test.data, i64 32, i1 false)69; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[X:%.*]]70; CHECK-NEXT: [[TMP0:%.*]] = call i32 @foo(ptr nonnull [[ARRAYIDX]])71; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]72; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 473; CHECK-NEXT: ret void74;75entry:76 %data = alloca [8 x i32], align 477 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)78 %arrayidx = getelementptr inbounds [8 x i32], ptr %data, i64 0, i64 %x79 %0 = call i32 @foo(ptr %arrayidx)80 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x81 store i32 %0, ptr addrspace(1) %arrayidx1, align 482 ret void83}84 85define void @test_call_no_null_opt(ptr addrspace(1) %out, i64 %x) #0 {86; CHECK-LABEL: @test_call_no_null_opt(87; CHECK-NEXT: entry:88; CHECK-NEXT: [[DATA:%.*]] = alloca [8 x i32], align 489; CHECK-NEXT: call void @llvm.memcpy.p0.p2.i64(ptr noundef nonnull align 4 dereferenceable(32) [[DATA]], ptr addrspace(2) noundef align 4 dereferenceable(32) @test.data, i64 32, i1 false)90; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[X:%.*]]91; CHECK-NEXT: [[TMP0:%.*]] = call i32 @foo(ptr [[ARRAYIDX]])92; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]93; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 494; CHECK-NEXT: ret void95;96entry:97 %data = alloca [8 x i32], align 498 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)99 %arrayidx = getelementptr inbounds [8 x i32], ptr %data, i64 0, i64 %x100 %0 = call i32 @foo(ptr %arrayidx)101 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x102 store i32 %0, ptr addrspace(1) %arrayidx1, align 4103 ret void104}105 106define void @test_load_and_call(ptr addrspace(1) %out, i64 %x, i64 %y) {107; CHECK-LABEL: @test_load_and_call(108; CHECK-NEXT: entry:109; CHECK-NEXT: [[DATA:%.*]] = alloca [8 x i32], align 4110; CHECK-NEXT: call void @llvm.memcpy.p0.p2.i64(ptr noundef nonnull align 4 dereferenceable(32) [[DATA]], ptr addrspace(2) noundef align 4 dereferenceable(32) @test.data, i64 32, i1 false)111; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[X:%.*]]112; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4113; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]114; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 4115; CHECK-NEXT: [[TMP1:%.*]] = call i32 @foo(ptr nonnull [[ARRAYIDX]])116; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT]], i64 [[Y:%.*]]117; CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(1) [[ARRAYIDX2]], align 4118; CHECK-NEXT: ret void119;120entry:121 %data = alloca [8 x i32], align 4122 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)123 %arrayidx = getelementptr inbounds [8 x i32], ptr %data, i64 0, i64 %x124 %0 = load i32, ptr %arrayidx, align 4125 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x126 store i32 %0, ptr addrspace(1) %arrayidx1, align 4127 %1 = call i32 @foo(ptr %arrayidx)128 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %y129 store i32 %1, ptr addrspace(1) %arrayidx2, align 4130 ret void131}132 133define void @test_load_and_call_no_null_opt(ptr addrspace(1) %out, i64 %x, i64 %y) #0 {134; CHECK-LABEL: @test_load_and_call_no_null_opt(135; CHECK-NEXT: entry:136; CHECK-NEXT: [[DATA:%.*]] = alloca [8 x i32], align 4137; CHECK-NEXT: call void @llvm.memcpy.p0.p2.i64(ptr noundef nonnull align 4 dereferenceable(32) [[DATA]], ptr addrspace(2) noundef align 4 dereferenceable(32) @test.data, i64 32, i1 false)138; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[X:%.*]]139; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4140; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT:%.*]], i64 [[X]]141; CHECK-NEXT: store i32 [[TMP0]], ptr addrspace(1) [[ARRAYIDX1]], align 4142; CHECK-NEXT: [[TMP1:%.*]] = call i32 @foo(ptr [[ARRAYIDX]])143; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[OUT]], i64 [[Y:%.*]]144; CHECK-NEXT: store i32 [[TMP1]], ptr addrspace(1) [[ARRAYIDX2]], align 4145; CHECK-NEXT: ret void146;147entry:148 %data = alloca [8 x i32], align 4149 call void @llvm.memcpy.p0.p2.i64(ptr align 4 %data, ptr addrspace(2) align 4 @test.data, i64 32, i1 false)150 %arrayidx = getelementptr inbounds [8 x i32], ptr %data, i64 0, i64 %x151 %0 = load i32, ptr %arrayidx, align 4152 %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %x153 store i32 %0, ptr addrspace(1) %arrayidx1, align 4154 %1 = call i32 @foo(ptr %arrayidx)155 %arrayidx2 = getelementptr inbounds i32, ptr addrspace(1) %out, i64 %y156 store i32 %1, ptr addrspace(1) %arrayidx2, align 4157 ret void158}159 160declare void @llvm.memcpy.p0.p2.i64(ptr nocapture writeonly, ptr addrspace(2) nocapture readonly, i64, i1)161declare i32 @foo(ptr %x)162 163attributes #0 = { null_pointer_is_valid }164