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