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