brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 9c04240 Raw
184 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that strnlen calls with conditional expressions involving constant3; string arguments and constant bounds are folded correctly.4;5; RUN: opt < %s -passes=instcombine -S | FileCheck %s6 7declare i64 @strnlen(ptr, i64)8 9@s3 = constant [4 x i8] c"123\00"10@s5 = constant [6 x i8] c"12345\00"11@s5_3 = constant [10 x i8] c"12345\00678\00"12@s6 = constant [7 x i8] c"123456\00"13@s7 = constant [8 x i8] c"1234567\00"14 15 16; Fold strnlen (C ? s3 : s5, 0) to 0.17 18define i64 @fold_strnlen_s3_s5_0(i1 %C) {19; CHECK-LABEL: @fold_strnlen_s3_s5_0(20; CHECK-NEXT:    ret i64 021;22  %ptr = select i1 %C, ptr @s3, ptr @s623 24  %len = call i64 @strnlen(ptr %ptr, i64 0)25  ret i64 %len26}27 28 29; Fold strnlen (C ? s3 : s5, 1) to 1.30 31define i64 @fold_strnlen_s3_s5_1(i1 %C) {32; CHECK-LABEL: @fold_strnlen_s3_s5_1(33; CHECK-NEXT:    ret i64 134;35  %ptr = select i1 %C, ptr @s3, ptr @s636 37  %len = call i64 @strnlen(ptr %ptr, i64 1)38  ret i64 %len39}40 41; FIXME: Constants should be allowed for this optimization.42define i64 @fold_strnlen_s3_s5_1_asan(i1 %C) sanitize_address {43; CHECK-LABEL: @fold_strnlen_s3_s5_1_asan(44; CHECK-NEXT:    [[PTR:%.*]] = select i1 [[C:%.*]], ptr @s3, ptr @s645; CHECK-NEXT:    [[STRNLEN_CHAR0:%.*]] = load i8, ptr [[PTR]], align 146; CHECK-NEXT:    [[STRNLEN_CHAR0CMP:%.*]] = icmp ne i8 [[STRNLEN_CHAR0]], 047; CHECK-NEXT:    [[LEN:%.*]] = zext i1 [[STRNLEN_CHAR0CMP]] to i6448; CHECK-NEXT:    ret i64 [[LEN]]49;50  %ptr = select i1 %C, ptr @s3, ptr @s651 52  %len = call i64 @strnlen(ptr %ptr, i64 1)53  ret i64 %len54}55 56 57; Fold strnlen (C ? s3 : s5, 3) to 3.58 59define i64 @fold_strnlen_s3_s5_3(i1 %C) {60; CHECK-LABEL: @fold_strnlen_s3_s5_3(61; CHECK-NEXT:    [[PTR:%.*]] = select i1 [[C:%.*]], ptr @s3, ptr @s662; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 3)63; CHECK-NEXT:    ret i64 [[LEN]]64;65  %ptr = select i1 %C, ptr @s3, ptr @s666 67  %len = call i64 @strnlen(ptr %ptr, i64 3)68  ret i64 %len69}70 71 72; Fold strnlen (C ? s3 : s5, 4) to C ? 3 : 4.73 74define i64 @fold_strnlen_s3_s5_4(i1 %C) {75; CHECK-LABEL: @fold_strnlen_s3_s5_4(76; CHECK-NEXT:    [[PTR:%.*]] = select i1 [[C:%.*]], ptr @s3, ptr @s677; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 4)78; CHECK-NEXT:    ret i64 [[LEN]]79;80  %ptr = select i1 %C, ptr @s3, ptr @s681 82  %len = call i64 @strnlen(ptr %ptr, i64 4)83  ret i64 %len84}85 86 87; Fold strnlen (C ? s3 : s5, 5) to C ? 3 : 5.88 89define i64 @fold_strnlen_s3_s5_5(i1 %C) {90; CHECK-LABEL: @fold_strnlen_s3_s5_5(91; CHECK-NEXT:    [[PTR:%.*]] = select i1 [[C:%.*]], ptr @s3, ptr @s692; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 5)93; CHECK-NEXT:    ret i64 [[LEN]]94;95  %ptr = select i1 %C, ptr @s3, ptr @s696 97  %len = call i64 @strnlen(ptr %ptr, i64 5)98  ret i64 %len99}100 101 102; Fold strnlen (C ? s3 : s5, 6) to C ? 3 : 5.103 104define i64 @fold_strnlen_s5_6(i1 %C) {105; CHECK-LABEL: @fold_strnlen_s5_6(106; CHECK-NEXT:    [[PTR:%.*]] = select i1 [[C:%.*]], ptr @s5, ptr @s6107; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 6)108; CHECK-NEXT:    ret i64 [[LEN]]109;110 111  %ptr = select i1 %C, ptr @s5, ptr @s6112 113  %len = call i64 @strnlen(ptr %ptr, i64 6)114  ret i64 %len115}116 117 118; Fold strnlen(E, N) with E being two conditional expressions:119;   strlen (x == 3 ? s3 : x == 5 ? s5 : s7, 4) to x == 3 ? 3 : 4.120 121define i64 @fold_strnlen_s3_s5_s7_4(i32 %X) {122; CHECK-LABEL: @fold_strnlen_s3_s5_s7_4(123; CHECK-NEXT:    [[X_EQ_3:%.*]] = icmp eq i32 [[X:%.*]], 3124; CHECK-NEXT:    [[X_EQ_5:%.*]] = icmp eq i32 [[X]], 5125; CHECK-NEXT:    [[SEL_X_EQ_5:%.*]] = select i1 [[X_EQ_5]], ptr @s5, ptr @s7126; CHECK-NEXT:    [[SEL_X_EQ_3:%.*]] = select i1 [[X_EQ_3]], ptr @s3, ptr [[SEL_X_EQ_5]]127; CHECK-NEXT:    [[LEN:%.*]] = tail call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[SEL_X_EQ_3]], i64 4)128; CHECK-NEXT:    ret i64 [[LEN]]129;130 131  %x_eq_3 = icmp eq i32 %X, 3132  %x_eq_5 = icmp eq i32 %X, 5133  %sel_x_eq_5 = select i1 %x_eq_5, ptr @s5, ptr @s7134  %sel_x_eq_3 = select i1 %x_eq_3, ptr @s3, ptr %sel_x_eq_5135  %len = tail call i64 @strnlen(ptr %sel_x_eq_3, i64 4)136  ret i64 %len137}138 139 140; As above, fold strnlen(E, N) with E being two conditional expressions141; but with N == 6:142;   strlen (x == 3 ? s3 : x == 5 ? s5 : s7, 6) to x == 3 ? 3 : x == 5 ? 5 : 6.143 144define i64 @fold_strnlen_s3_s5_s7_6(i32 %X) {145; CHECK-LABEL: @fold_strnlen_s3_s5_s7_6(146; CHECK-NEXT:    [[X_EQ_3:%.*]] = icmp eq i32 [[X:%.*]], 3147; CHECK-NEXT:    [[X_EQ_5:%.*]] = icmp eq i32 [[X]], 5148; CHECK-NEXT:    [[SEL_X_EQ_5:%.*]] = select i1 [[X_EQ_5]], ptr @s5, ptr @s7149; CHECK-NEXT:    [[SEL_X_EQ_3:%.*]] = select i1 [[X_EQ_3]], ptr @s3, ptr [[SEL_X_EQ_5]]150; CHECK-NEXT:    [[LEN:%.*]] = tail call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[SEL_X_EQ_3]], i64 6)151; CHECK-NEXT:    ret i64 [[LEN]]152;153 154  %x_eq_3 = icmp eq i32 %X, 3155  %x_eq_5 = icmp eq i32 %X, 5156  %sel_x_eq_5 = select i1 %x_eq_5, ptr @s5, ptr @s7157  %sel_x_eq_3 = select i1 %x_eq_3, ptr @s3, ptr %sel_x_eq_5158  %len = tail call i64 @strnlen(ptr %sel_x_eq_3, i64 6)159  ret i64 %len160}161 162 163; And again, fold strnlen(E, N) with E being two conditional expressions164; but with N == 8:165;   strlen (x == 3 ? s3 : x == 5 ? s5 : s7, 8) to x == 3 ? 3 : x == 5 ? 5 : 7.166 167define i64 @fold_strnlen_s3_s5_s7_8(i32 %X) {168; CHECK-LABEL: @fold_strnlen_s3_s5_s7_8(169; CHECK-NEXT:    [[X_EQ_3:%.*]] = icmp eq i32 [[X:%.*]], 3170; CHECK-NEXT:    [[X_EQ_5:%.*]] = icmp eq i32 [[X]], 5171; CHECK-NEXT:    [[SEL_X_EQ_5:%.*]] = select i1 [[X_EQ_5]], ptr @s5, ptr @s7172; CHECK-NEXT:    [[SEL_X_EQ_3:%.*]] = select i1 [[X_EQ_3]], ptr @s3, ptr [[SEL_X_EQ_5]]173; CHECK-NEXT:    [[LEN:%.*]] = tail call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[SEL_X_EQ_3]], i64 8)174; CHECK-NEXT:    ret i64 [[LEN]]175;176 177  %x_eq_3 = icmp eq i32 %X, 3178  %x_eq_5 = icmp eq i32 %X, 5179  %sel_x_eq_5 = select i1 %x_eq_5, ptr @s5, ptr @s7180  %sel_x_eq_3 = select i1 %x_eq_3, ptr @s3, ptr %sel_x_eq_5181  %len = tail call i64 @strnlen(ptr %sel_x_eq_3, i64 8)182  ret i64 %len183}184