[llvm-objdump/MachoDump] Make code much more concise.
[oota-llvm.git] / test / Transforms / InstCombine / gep-sext.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2 target 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"
3 target triple = "x86_64-pc-win32"
4
5 declare void @use(i32) readonly
6
7 ; We prefer to canonicalize the machine width gep indices early
8 define void @test(i32* %p, i32 %index) {
9 ; CHECK-LABEL: @test
10 ; CHECK-NEXT: %1 = sext i32 %index to i64
11 ; CHECK-NEXT: %addr = getelementptr i32, i32* %p, i64 %1
12   %addr = getelementptr i32, i32* %p, i32 %index
13   %val = load i32, i32* %addr
14   call void @use(i32 %val)
15   ret void
16 }
17 ; If they've already been canonicalized via zext, that's fine
18 define void @test2(i32* %p, i32 %index) {
19 ; CHECK-LABEL: @test2
20 ; CHECK-NEXT: %i = zext i32 %index to i64
21 ; CHECK-NEXT: %addr = getelementptr i32, i32* %p, i64 %i
22   %i = zext i32 %index to i64
23   %addr = getelementptr i32, i32* %p, i64 %i
24   %val = load i32, i32* %addr
25   call void @use(i32 %val)
26   ret void
27 }
28 ; If we can use a zext, we prefer that.  This requires
29 ; knowing that the index is positive.
30 define void @test3(i32* %p, i32 %index) {
31 ; CHECK-LABEL: @test3
32 ; CHECK:   zext
33 ; CHECK-NOT: sext
34   %addr_begin = getelementptr i32, i32* %p, i64 40
35   %addr_fixed = getelementptr i32, i32* %addr_begin, i64 48
36   %val_fixed = load i32, i32* %addr_fixed, !range !0
37   %addr = getelementptr i32, i32* %addr_begin, i32 %val_fixed
38   %val = load i32, i32* %addr
39   call void @use(i32 %val)
40   ret void
41 }
42 ; Replace sext with zext where possible
43 define void @test4(i32* %p, i32 %index) {
44 ; CHECK-LABEL: @test4
45 ; CHECK:   zext
46 ; CHECK-NOT: sext
47   %addr_begin = getelementptr i32, i32* %p, i64 40
48   %addr_fixed = getelementptr i32, i32* %addr_begin, i64 48
49   %val_fixed = load i32, i32* %addr_fixed, !range !0
50   %i = sext i32 %val_fixed to i64
51   %addr = getelementptr i32, i32* %addr_begin, i64 %i
52   %val = load i32, i32* %addr
53   call void @use(i32 %val)
54   ret void
55 }
56
57 ;;  !range !0
58 !0 = !{i32 0, i32 2147483647}
59
60
61