brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.6 KiB · 46bf49d Raw
468 lines · plain
1; "PLAIN" - No optimizations. This tests the default target layout2; constant folder.3; RUN: opt -S -o - < %s | FileCheck --check-prefix=PLAIN %s4 5; "OPT" - Optimizations but no targetdata. This tests default target layout6; folding in the optimizers.7; RUN: opt -S -o - -passes='function(instcombine),globalopt' < %s | FileCheck --check-prefix=OPT %s8 9; "TO" - Optimizations and targetdata. This tests target-dependent10; folding in the optimizers.11; RUN: opt -S -o - -passes='function(instcombine),globalopt' -data-layout="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" < %s | FileCheck --check-prefix=TO %s12 13; "SCEV" - ScalarEvolution with default target layout14; RUN: opt -passes='print<scalar-evolution>' < %s -disable-output 2>&1 | FileCheck --check-prefix=SCEV %s15 16 17; The automatic constant folder in opt does not have targetdata access, so18; it can't fold gep arithmetic, in general. However, the constant folder run19; from instcombine and global opt can use targetdata.20 21; PLAIN: @G8 = global ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -1)22; PLAIN: @G1 = global ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -1)23; PLAIN: @F8 = global ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -2)24; PLAIN: @F1 = global ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -2)25; PLAIN: @H8 = global ptr getelementptr (i8, ptr null, i32 -1)26; PLAIN: @H1 = global ptr getelementptr (i1, ptr null, i32 -1)27; OPT: @G8 = local_unnamed_addr global ptr null28; OPT: @G1 = local_unnamed_addr global ptr null29; OPT: @F8 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)30; OPT: @F1 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)31; OPT: @H8 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)32; OPT: @H1 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)33; TO: @G8 = local_unnamed_addr global ptr null34; TO: @G1 = local_unnamed_addr global ptr null35; TO: @F8 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)36; TO: @F1 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)37; TO: @H8 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)38; TO: @H1 = local_unnamed_addr global ptr inttoptr (i64 -1 to ptr)39 40@G8 = global ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -1)41@G1 = global ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -1)42@F8 = global ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -2)43@F1 = global ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -2)44@H8 = global ptr getelementptr (i8, ptr inttoptr (i32 0 to ptr), i32 -1)45@H1 = global ptr getelementptr (i1, ptr inttoptr (i32 0 to ptr), i32 -1)46 47; The target-independent folder should be able to do some clever48; simplifications on sizeof, alignof, and offsetof expressions. The49; target-dependent folder should fold these down to constants.50 51; PLAIN: @b = constant i64 ptrtoint (ptr getelementptr ({ i1, [13 x double] }, ptr null, i64 0, i32 1) to i64)52; PLAIN: @c = constant i64 ptrtoint (ptr getelementptr ({ double, double, double, double }, ptr null, i64 0, i32 2) to i64)53; PLAIN: @d = constant i64 ptrtoint (ptr getelementptr ([13 x double], ptr null, i64 0, i32 11) to i64)54; PLAIN: @e = constant i64 ptrtoint (ptr getelementptr ({ double, float, double, double }, ptr null, i64 0, i32 2) to i64)55; PLAIN: @f = constant i64 ptrtoint (ptr getelementptr ({ i1, <{ i16, i128 }> }, ptr null, i64 0, i32 1) to i64)56; PLAIN: @g = constant i64 ptrtoint (ptr getelementptr ({ i1, { double, double } }, ptr null, i64 0, i32 1) to i64)57; PLAIN: @h = constant i64 ptrtoint (ptr getelementptr (ptr, ptr null, i64 1) to i64)58; PLAIN: @i = constant i64 ptrtoint (ptr getelementptr ({ i1, ptr }, ptr null, i64 0, i32 1) to i64)59; OPT: @b = local_unnamed_addr constant i64 860; OPT: @c = local_unnamed_addr constant i64 1661; OPT: @d = local_unnamed_addr constant i64 8862; OPT: @e = local_unnamed_addr constant i64 1663; OPT: @f = local_unnamed_addr constant i64 164; OPT: @g = local_unnamed_addr constant i64 865; OPT: @h = local_unnamed_addr constant i64 866; OPT: @i = local_unnamed_addr constant i64 867; TO: @b = local_unnamed_addr constant i64 868; TO: @c = local_unnamed_addr constant i64 1669; TO: @d = local_unnamed_addr constant i64 8870; TO: @e = local_unnamed_addr constant i64 1671; TO: @f = local_unnamed_addr constant i64 172; TO: @g = local_unnamed_addr constant i64 873; TO: @h = local_unnamed_addr constant i64 874; TO: @i = local_unnamed_addr constant i64 875 76@b = constant i64 ptrtoint (ptr getelementptr ({i1, [13 x double]}, ptr null, i64 0, i32 1) to i64)77@c = constant i64 ptrtoint (ptr getelementptr ({double, double, double, double}, ptr null, i64 0, i32 2) to i64)78@d = constant i64 ptrtoint (ptr getelementptr ([13 x double], ptr null, i64 0, i32 11) to i64)79@e = constant i64 ptrtoint (ptr getelementptr ({double, float, double, double}, ptr null, i64 0, i32 2) to i64)80@f = constant i64 ptrtoint (ptr getelementptr ({i1, <{ i16, i128 }>}, ptr null, i64 0, i32 1) to i64)81@g = constant i64 ptrtoint (ptr getelementptr ({i1, {double, double}}, ptr null, i64 0, i32 1) to i64)82@h = constant i64 ptrtoint (ptr getelementptr (ptr, ptr null, i64 1) to i64)83@i = constant i64 ptrtoint (ptr getelementptr ({i1, ptr}, ptr null, i64 0, i32 1) to i64)84 85; The target-dependent folder should cast GEP indices to integer-sized pointers.86 87; PLAIN: @M = constant ptr getelementptr (i64, ptr null, i32 1)88; PLAIN: @N = constant ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1)89; PLAIN: @O = constant ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1)90; OPT: @M = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)91; OPT: @N = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)92; OPT: @O = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)93; TO: @M = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)94; TO: @N = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)95; TO: @O = local_unnamed_addr constant ptr inttoptr (i64 8 to ptr)96 97@M = constant ptr getelementptr (i64, ptr null, i32 1)98@N = constant ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1)99@O = constant ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1)100 101; Fold GEP of a GEP. Very simple cases are folded without targetdata.102 103; PLAIN: @Y = global ptr getelementptr inbounds ([3 x { i32, i32 }], ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 1), i64 1)104; PLAIN: @Z = global ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1)105; OPT: @Y = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 48)106; OPT: @Z = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)107; TO: @Y = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 48)108; TO: @Z = local_unnamed_addr global ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)109 110@ext = external global [3 x { i32, i32 }]111@Y = global ptr getelementptr inbounds ([3 x { i32, i32 }], ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 1), i64 1)112@Z = global ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1)113 114; Duplicate all of the above as function return values rather than115; global initializers.116 117; PLAIN: define ptr @goo8() #0 {118; PLAIN:   %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr119; PLAIN:   ret ptr %t120; PLAIN: }121; PLAIN: define ptr @goo1() #0 {122; PLAIN:   %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr123; PLAIN:   ret ptr %t124; PLAIN: }125; PLAIN: define ptr @foo8() #0 {126; PLAIN:   %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr127; PLAIN:   ret ptr %t128; PLAIN: }129; PLAIN: define ptr @foo1() #0 {130; PLAIN:   %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr131; PLAIN:   ret ptr %t132; PLAIN: }133; PLAIN: define ptr @hoo8() #0 {134; PLAIN:   %t = bitcast ptr getelementptr (i8, ptr null, i32 -1) to ptr135; PLAIN:   ret ptr %t136; PLAIN: }137; PLAIN: define ptr @hoo1() #0 {138; PLAIN:   %t = bitcast ptr getelementptr (i1, ptr null, i32 -1) to ptr139; PLAIN:   ret ptr %t140; PLAIN: }141; OPT: define ptr @goo8() local_unnamed_addr #0 {142; OPT:   ret ptr null143; OPT: }144; OPT: define ptr @goo1() local_unnamed_addr #0 {145; OPT:   ret ptr null146; OPT: }147; OPT: define ptr @foo8() local_unnamed_addr #0 {148; OPT:   ret ptr inttoptr (i64 -1 to ptr)149; OPT: }150; OPT: define ptr @foo1() local_unnamed_addr #0 {151; OPT:   ret ptr inttoptr (i64 -1 to ptr)152; OPT: }153; OPT: define ptr @hoo8() local_unnamed_addr #0 {154; OPT:   ret ptr inttoptr (i64 -1 to ptr)155; OPT: }156; OPT: define ptr @hoo1() local_unnamed_addr #0 {157; OPT:   ret ptr inttoptr (i64 -1 to ptr)158; OPT: }159; TO: define ptr @goo8() local_unnamed_addr #0 {160; TO:   ret ptr null161; TO: }162; TO: define ptr @goo1() local_unnamed_addr #0 {163; TO:   ret ptr null164; TO: }165; TO: define ptr @foo8() local_unnamed_addr #0 {166; TO:   ret ptr inttoptr (i64 -1 to ptr)167; TO: }168; TO: define ptr @foo1() local_unnamed_addr #0 {169; TO:   ret ptr inttoptr (i64 -1 to ptr)170; TO: }171; TO: define ptr @hoo8() local_unnamed_addr #0 {172; TO:   ret ptr inttoptr (i64 -1 to ptr)173; TO: }174; TO: define ptr @hoo1() local_unnamed_addr #0 {175; TO:   ret ptr inttoptr (i64 -1 to ptr)176; TO: }177; SCEV: Classifying expressions for: @goo8178; SCEV:   %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr179; SCEV:   -->  (-1 + inttoptr (i32 1 to ptr))180; SCEV: Classifying expressions for: @goo1181; SCEV:   %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr182; SCEV:   -->  (-1 + inttoptr (i32 1 to ptr))183; SCEV: Classifying expressions for: @foo8184; SCEV:   %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr185; SCEV:   -->  (-2 + inttoptr (i32 1 to ptr))186; SCEV: Classifying expressions for: @foo1187; SCEV:   %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr188; SCEV:   -->  (-2 + inttoptr (i32 1 to ptr))189; SCEV: Classifying expressions for: @hoo8190; SCEV:   -->  (-1 + null)<nuw><nsw> U: [-1,0) S: [-1,0)191; SCEV: Classifying expressions for: @hoo1192; SCEV:   -->  (-1 + null)<nuw><nsw> U: [-1,0) S: [-1,0)193 194define ptr @goo8() nounwind {195  %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr196  ret ptr %t197}198define ptr @goo1() nounwind {199  %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -1) to ptr200  ret ptr %t201}202define ptr @foo8() nounwind {203  %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr204  ret ptr %t205}206define ptr @foo1() nounwind {207  %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 1 to ptr), i32 -2) to ptr208  ret ptr %t209}210define ptr @hoo8() nounwind {211  %t = bitcast ptr getelementptr (i8, ptr inttoptr (i32 0 to ptr), i32 -1) to ptr212  ret ptr %t213}214define ptr @hoo1() nounwind {215  %t = bitcast ptr getelementptr (i1, ptr inttoptr (i32 0 to ptr), i32 -1) to ptr216  ret ptr %t217}218 219; PLAIN: define i64 @fb() #0 {220; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, [13 x double] }, ptr null, i64 0, i32 1) to i64) to i64221; PLAIN:   ret i64 %t222; PLAIN: }223; PLAIN: define i64 @fc() #0 {224; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ double, double, double, double }, ptr null, i64 0, i32 2) to i64) to i64225; PLAIN:   ret i64 %t226; PLAIN: }227; PLAIN: define i64 @fd() #0 {228; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ([13 x double], ptr null, i64 0, i32 11) to i64) to i64229; PLAIN:   ret i64 %t230; PLAIN: }231; PLAIN: define i64 @fe() #0 {232; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ double, float, double, double }, ptr null, i64 0, i32 2) to i64) to i64233; PLAIN:   ret i64 %t234; PLAIN: }235; PLAIN: define i64 @ff() #0 {236; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, <{ i16, i128 }> }, ptr null, i64 0, i32 1) to i64) to i64237; PLAIN:   ret i64 %t238; PLAIN: }239; PLAIN: define i64 @fg() #0 {240; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, { double, double } }, ptr null, i64 0, i32 1) to i64) to i64241; PLAIN:   ret i64 %t242; PLAIN: }243; PLAIN: define i64 @fh() #0 {244; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64) to i64245; PLAIN:   ret i64 %t246; PLAIN: }247; PLAIN: define i64 @fi() #0 {248; PLAIN:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, ptr }, ptr null, i64 0, i32 1) to i64) to i64249; PLAIN:   ret i64 %t250; PLAIN: }251; OPT: define i64 @fb() local_unnamed_addr #0 {252; OPT:   ret i64 8253; OPT: }254; OPT: define i64 @fc() local_unnamed_addr #0 {255; OPT:   ret i64 16256; OPT: }257; OPT: define i64 @fd() local_unnamed_addr #0 {258; OPT:   ret i64 88259; OPT: }260; OPT: define i64 @fe() local_unnamed_addr #0 {261; OPT:   ret i64 16262; OPT: }263; OPT: define i64 @ff() local_unnamed_addr #0 {264; OPT:   ret i64 1265; OPT: }266; OPT: define i64 @fg() local_unnamed_addr #0 {267; OPT:   ret i64 8268; OPT: }269; OPT: define i64 @fh() local_unnamed_addr #0 {270; OPT:   ret i64 8271; OPT: }272; OPT: define i64 @fi() local_unnamed_addr #0 {273; OPT:   ret i64 8274; OPT: }275; TO: define i64 @fb() local_unnamed_addr #0 {276; TO:   ret i64 8277; TO: }278; TO: define i64 @fc() local_unnamed_addr #0 {279; TO:   ret i64 16280; TO: }281; TO: define i64 @fd() local_unnamed_addr #0 {282; TO:   ret i64 88283; TO: }284; TO: define i64 @fe() local_unnamed_addr #0 {285; TO:   ret i64 16286; TO: }287; TO: define i64 @ff() local_unnamed_addr #0 {288; TO:   ret i64 1289; TO: }290; TO: define i64 @fg() local_unnamed_addr #0 {291; TO:   ret i64 8292; TO: }293; TO: define i64 @fh() local_unnamed_addr #0 {294; TO:   ret i64 8295; TO: }296; TO: define i64 @fi() local_unnamed_addr #0 {297; TO:   ret i64 8298; TO: }299; SCEV-LABEL: Classifying expressions for: @fb300; SCEV:  %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, [13 x double] }, ptr null, i64 0, i32 1) to i64) to i64301; SCEV:   -->  8302; SCEV-LABEL: Classifying expressions for: @fc303; SCEV:  %t = bitcast i64 ptrtoint (ptr getelementptr ({ double, double, double, double }, ptr null, i64 0, i32 2) to i64) to i64304; SCEV:   -->  16305; SCEV-LABEL: Classifying expressions for: @fd306; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr ([13 x double], ptr null, i64 0, i32 11) to i64) to i64307; SCEV:   -->  88308; SCEV-LABEL: Classifying expressions for: @fe309; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ double, float, double, double }, ptr null, i64 0, i32 2) to i64) to i64310; SCEV:   -->  16311; SCEV-LABEL: Classifying expressions for: @ff312; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, <{ i16, i128 }> }, ptr null, i64 0, i32 1) to i64) to i64313; SCEV:   -->  1314; SCEV-LABEL: Classifying expressions for: @fg315; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, { double, double } }, ptr null, i64 0, i32 1) to i64) to i64316; SCEV:   -->  8317; SCEV-LABEL: Classifying expressions for: @fh318; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64) to i64319; SCEV:   --> 8320; SCEV-LABEL: Classifying expressions for: @fi321; SCEV:   %t = bitcast i64 ptrtoint (ptr getelementptr ({ i1, ptr }, ptr null, i64 0, i32 1) to i64) to i64322; SCEV:   --> 8323 324define i64 @fb() nounwind {325  %t = bitcast i64 ptrtoint (ptr getelementptr ({i1, [13 x double]}, ptr null, i64 0, i32 1) to i64) to i64326  ret i64 %t327}328define i64 @fc() nounwind {329  %t = bitcast i64 ptrtoint (ptr getelementptr ({double, double, double, double}, ptr null, i64 0, i32 2) to i64) to i64330  ret i64 %t331}332define i64 @fd() nounwind {333  %t = bitcast i64 ptrtoint (ptr getelementptr ([13 x double], ptr null, i64 0, i32 11) to i64) to i64334  ret i64 %t335}336define i64 @fe() nounwind {337  %t = bitcast i64 ptrtoint (ptr getelementptr ({double, float, double, double}, ptr null, i64 0, i32 2) to i64) to i64338  ret i64 %t339}340define i64 @ff() nounwind {341  %t = bitcast i64 ptrtoint (ptr getelementptr ({i1, <{ i16, i128 }>}, ptr null, i64 0, i32 1) to i64) to i64342  ret i64 %t343}344define i64 @fg() nounwind {345  %t = bitcast i64 ptrtoint (ptr getelementptr ({i1, {double, double}}, ptr null, i64 0, i32 1) to i64) to i64346  ret i64 %t347}348define i64 @fh() nounwind {349  %t = bitcast i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64) to i64350  ret i64 %t351}352define i64 @fi() nounwind {353  %t = bitcast i64 ptrtoint (ptr getelementptr ({i1, ptr}, ptr null, i64 0, i32 1) to i64) to i64354  ret i64 %t355}356 357; PLAIN: define ptr @fM() #0 {358; PLAIN:   %t = bitcast ptr getelementptr (i64, ptr null, i32 1) to ptr359; PLAIN:   ret ptr %t360; PLAIN: }361; PLAIN: define ptr @fN() #0 {362; PLAIN:   %t = bitcast ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1) to ptr363; PLAIN:   ret ptr %t364; PLAIN: }365; PLAIN: define ptr @fO() #0 {366; PLAIN:   %t = bitcast ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1) to ptr367; PLAIN:   ret ptr %t368; PLAIN: }369; OPT: define ptr @fM() local_unnamed_addr #0 {370; OPT:   ret ptr inttoptr (i64 8 to ptr)371; OPT: }372; OPT: define ptr @fN() local_unnamed_addr #0 {373; OPT:   ret ptr inttoptr (i64 8 to ptr)374; OPT: }375; OPT: define ptr @fO() local_unnamed_addr #0 {376; OPT:   ret ptr inttoptr (i64 8 to ptr)377; OPT: }378; TO: define ptr @fM() local_unnamed_addr #0 {379; TO:   ret ptr inttoptr (i64 8 to ptr)380; TO: }381; TO: define ptr @fN() local_unnamed_addr #0 {382; TO:   ret ptr inttoptr (i64 8 to ptr)383; TO: }384; TO: define ptr @fO() local_unnamed_addr #0 {385; TO:   ret ptr inttoptr (i64 8 to ptr)386; TO: }387; SCEV: Classifying expressions for: @fM388; SCEV:   %t = bitcast ptr getelementptr (i64, ptr null, i32 1) to ptr389; SCEV:    --> (8 + null)<nuw><nsw> U: [8,9) S: [8,9)390; SCEV: Classifying expressions for: @fN391; SCEV:   %t = bitcast ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1) to ptr392; SCEV:   --> (8 + null)<nuw><nsw> U: [8,9) S: [8,9)393; SCEV: Classifying expressions for: @fO394; SCEV:   %t = bitcast ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1) to ptr395; SCEV:   --> (8 + null)<nuw><nsw> U: [8,9) S: [8,9)396 397define ptr @fM() nounwind {398  %t = bitcast ptr getelementptr (i64, ptr null, i32 1) to ptr399  ret ptr %t400}401define ptr @fN() nounwind {402  %t = bitcast ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1) to ptr403  ret ptr %t404}405define ptr @fO() nounwind {406  %t = bitcast ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1) to ptr407  ret ptr %t408}409 410; PLAIN: define ptr @fZ() #0 {411; PLAIN:   %t = bitcast ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1) to ptr412; PLAIN:   ret ptr %t413; PLAIN: }414; OPT: define ptr @fZ() local_unnamed_addr #0 {415; OPT:   ret ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)416; OPT: }417; TO: define ptr @fZ() local_unnamed_addr #0 {418; TO:   ret ptr getelementptr inbounds nuw (i8, ptr @ext, i64 12)419; TO: }420; SCEV: Classifying expressions for: @fZ421; SCEV:   %t = bitcast ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1) to ptr422; SCEV:   -->  (12 + @ext)423 424define ptr @fZ() nounwind {425  %t = bitcast ptr getelementptr inbounds (i32, ptr getelementptr inbounds ([3 x { i32, i32 }], ptr @ext, i64 0, i64 1, i32 0), i64 1) to ptr426  ret ptr %t427}428 429; PR15262 - Check GEP folding with casts between address spaces.430 431@p0 = global [4 x i8] zeroinitializer, align 1432@p12 = addrspace(12) global [4 x i8] zeroinitializer, align 1433 434define ptr @different_addrspace() nounwind noinline {435; OPT: different_addrspace436  %p = getelementptr inbounds i8, ptr addrspacecast (ptr addrspace(12) @p12 to ptr),437                                  i32 2438  ret ptr %p439; OPT: ret ptr getelementptr inbounds nuw (i8, ptr addrspacecast (ptr addrspace(12) @p12 to ptr), i64 2)440}441 442define ptr @same_addrspace() nounwind noinline {443; OPT: same_addrspace444  %p = getelementptr inbounds i8, ptr @p0, i32 2445  ret ptr %p446; OPT: ret ptr getelementptr inbounds nuw (i8, ptr @p0, i64 2)447}448 449@gv1 = internal global i32 1450@gv2 = internal global [1 x i32] [ i32 2 ]451@gv3 = internal global [1 x i32] [ i32 2 ]452 453define i1 @gv_gep_vs_gv() {454  %cmp = icmp eq ptr @gv2, @gv1455  ret i1 %cmp456}457; OPT: gv_gep_vs_gv458; OPT: ret i1 false459 460define i1 @gv_gep_vs_gv_gep() {461  %cmp = icmp eq ptr @gv2, @gv3462  ret i1 %cmp463}464; OPT: gv_gep_vs_gv_gep465; OPT: ret i1 false466 467; CHECK: attributes #0 = { nounwind }468