brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · e1742e1 Raw
62 lines · plain
1; RUN: opt < %s -passes=instcombine -S | FileCheck %s2target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"3target triple = "x86_64-pc-win32"4 5declare void @use(i32) readonly6 7; We prefer to canonicalize the machine width gep indices early8define void @test(ptr %p, i32 %index) {9; CHECK-LABEL: @test10; CHECK-NEXT: %1 = sext i32 %index to i6411; CHECK-NEXT: %addr = getelementptr i32, ptr %p, i64 %112  %addr = getelementptr i32, ptr %p, i32 %index13  %val = load i32, ptr %addr14  call void @use(i32 %val)15  ret void16}17; If they've already been canonicalized via zext, that's fine18define void @test2(ptr %p, i32 %index) {19; CHECK-LABEL: @test220; CHECK-NEXT: %i = zext i32 %index to i6421; CHECK-NEXT: %addr = getelementptr i32, ptr %p, i64 %i22  %i = zext i32 %index to i6423  %addr = getelementptr i32, ptr %p, i64 %i24  %val = load i32, ptr %addr25  call void @use(i32 %val)26  ret void27}28; If we can use a zext, we prefer that.  This requires29; knowing that the index is positive.30define void @test3(ptr %p, i32 %index) {31; CHECK-LABEL: @test332; CHECK:   zext33; CHECK-NOT: sext34  %addr_begin = getelementptr i32, ptr %p, i64 4035  %addr_fixed = getelementptr i32, ptr %addr_begin, i64 4836  %val_fixed = load i32, ptr %addr_fixed, !range !037  %addr = getelementptr i32, ptr %addr_begin, i32 %val_fixed38  %val = load i32, ptr %addr39  call void @use(i32 %val)40  ret void41}42; Replace sext with zext where possible43define void @test4(ptr %p, i32 %index) {44; CHECK-LABEL: @test445; CHECK:   zext46; CHECK-NOT: sext47  %addr_begin = getelementptr i32, ptr %p, i64 4048  %addr_fixed = getelementptr i32, ptr %addr_begin, i64 4849  %val_fixed = load i32, ptr %addr_fixed, !range !050  %i = sext i32 %val_fixed to i6451  %addr = getelementptr i32, ptr %addr_begin, i64 %i52  %val = load i32, ptr %addr53  call void @use(i32 %val)54  ret void55}56 57;;  !range !058!0 = !{i32 0, i32 2147483647}59 60 61 62