1*b19194c0SMartin Sebor; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*b19194c0SMartin Sebor; 3*b19194c0SMartin Sebor; Verify that wcslen calls with a constant argument of a nonintegral type 4*b19194c0SMartin Sebor; of the same size as wchar_t or bigger doesn't cause trouble and is folded 5*b19194c0SMartin Sebor; as expected. 6*b19194c0SMartin Sebor; 7*b19194c0SMartin Sebor; RUN: opt < %s -passes=instcombine -S | FileCheck %s 8*b19194c0SMartin Sebor 9*b19194c0SMartin Sebor!llvm.module.flags = !{!0} 10*b19194c0SMartin Sebor!0 = !{i32 1, !"wchar_size", i32 4} 11*b19194c0SMartin Sebor 12*b19194c0SMartin Sebordeclare i64 @wcslen(ptr) 13*b19194c0SMartin Sebor 14*b19194c0SMartin Sebor@af = constant [2 x float] [float 0x3FF3B2FEC0000000, float 0.0] 15*b19194c0SMartin Sebor 16*b19194c0SMartin Sebor; TODO: Fold wcslen(af) to a constant. 17*b19194c0SMartin Sebor 18*b19194c0SMartin Sebordefine i64 @fold_af() { 19*b19194c0SMartin Sebor; CHECK-LABEL: @fold_af( 20*b19194c0SMartin Sebor; CHECK-NEXT: [[N:%.*]] = call i64 @wcslen(ptr nonnull @af) 21*b19194c0SMartin Sebor; CHECK-NEXT: ret i64 [[N]] 22*b19194c0SMartin Sebor; 23*b19194c0SMartin Sebor %n = call i64 @wcslen(ptr @af) 24*b19194c0SMartin Sebor ret i64 %n 25*b19194c0SMartin Sebor} 26*b19194c0SMartin Sebor 27*b19194c0SMartin Sebor; TODO: Likewise, fold wcslen(as) to a constant. 28*b19194c0SMartin Sebor 29*b19194c0SMartin Sebor%struct.S = type { i32 } 30*b19194c0SMartin Sebor@aS = constant [3 x %struct.S] [%struct.S { i32 2 }, %struct.S { i32 1 }, %struct.S zeroinitializer] 31*b19194c0SMartin Sebor 32*b19194c0SMartin Sebordefine i64 @fold_aS() { 33*b19194c0SMartin Sebor; CHECK-LABEL: @fold_aS( 34*b19194c0SMartin Sebor; CHECK-NEXT: [[N:%.*]] = call i64 @wcslen(ptr nonnull @aS) 35*b19194c0SMartin Sebor; CHECK-NEXT: ret i64 [[N]] 36*b19194c0SMartin Sebor; 37*b19194c0SMartin Sebor %n = call i64 @wcslen(ptr @aS) 38*b19194c0SMartin Sebor ret i64 %n 39*b19194c0SMartin Sebor} 40