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