1 ; RUN: opt -instcombine -S -o - %s | FileCheck %s 2 ; Tests that we preserve the inrange attribute on indices where possible. 3 4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 5 target triple = "x86_64-unknown-linux-gnu" 6 7 %struct.A = type { i32 (...)** } 8 9 @vt = external global [3 x i8*] 10 11 ; CHECK: define i32 (...)* @f0() 12 define i32 (...)* @f0() { 13 ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 2) to i32 (...)**) 14 %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, inrange i64 0, i64 1) to i32 (...)**), i64 1) 15 ret i32 (...)* %load 16 } 17 18 ; CHECK: define i32 (...)* @f1() 19 define i32 (...)* @f1() { 20 ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, i64 2) to i32 (...)**) 21 %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 1) 22 ret i32 (...)* %load 23 } 24 25 ; CHECK: define i32 (...)* @f2() 26 define i32 (...)* @f2() { 27 ; CHECK-NEXT: load i32 (...)*, i32 (...)** bitcast (i8** getelementptr ([3 x i8*], [3 x i8*]* @vt, i64 1, i64 1) to i32 (...)**) 28 %load = load i32 (...)*, i32 (...)** getelementptr (i32 (...)*, i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @vt, i64 0, inrange i64 1) to i32 (...)**), i64 3) 29 ret i32 (...)* %load 30 } 31