brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · cfec7b8 Raw
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