Home | History | Annotate | Download | only in ConstantFolding
      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