1d8b22243SMartin Sebor; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2d8b22243SMartin Sebor; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3d8b22243SMartin Sebor; 4d8b22243SMartin Sebor; Verify that the result of strchr calls used in equality expressions 5d8b22243SMartin Sebor; with either the first argument or null are optimally folded. 6d8b22243SMartin Sebor 7*4ab40ecaSBjorn Petterssondeclare ptr @strchr(ptr, i32) 8d8b22243SMartin Sebor 9d8b22243SMartin Sebor 10d8b22243SMartin Sebor; Fold strchr(s, c) == s to *s == c. 11d8b22243SMartin Sebor 12*4ab40ecaSBjorn Petterssondefine i1 @fold_strchr_s_c_eq_s(ptr %s, i32 %c) { 13d8b22243SMartin Sebor; CHECK-LABEL: @fold_strchr_s_c_eq_s( 14*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[S:%.*]], align 1 15516915beSMartin Sebor; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[C:%.*]] to i8 16516915beSMartin Sebor; CHECK-NEXT: [[CHAR0CMP:%.*]] = icmp eq i8 [[TMP1]], [[TMP2]] 17516915beSMartin Sebor; CHECK-NEXT: ret i1 [[CHAR0CMP]] 18d8b22243SMartin Sebor; 19*4ab40ecaSBjorn Pettersson %p = call ptr @strchr(ptr %s, i32 %c) 20*4ab40ecaSBjorn Pettersson %cmp = icmp eq ptr %p, %s 21d8b22243SMartin Sebor ret i1 %cmp 22d8b22243SMartin Sebor} 23d8b22243SMartin Sebor 24d8b22243SMartin Sebor 25d8b22243SMartin Sebor; Fold strchr(s, c) != s to *s != c. 26d8b22243SMartin Sebor 27*4ab40ecaSBjorn Petterssondefine i1 @fold_strchr_s_c_neq_s(ptr %s, i32 %c) { 28d8b22243SMartin Sebor; CHECK-LABEL: @fold_strchr_s_c_neq_s( 29*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[S:%.*]], align 1 30516915beSMartin Sebor; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[C:%.*]] to i8 31516915beSMartin Sebor; CHECK-NEXT: [[CHAR0CMP:%.*]] = icmp ne i8 [[TMP1]], [[TMP2]] 32516915beSMartin Sebor; CHECK-NEXT: ret i1 [[CHAR0CMP]] 33d8b22243SMartin Sebor; 34*4ab40ecaSBjorn Pettersson %p = call ptr @strchr(ptr %s, i32 %c) 35*4ab40ecaSBjorn Pettersson %cmp = icmp ne ptr %p, %s 36d8b22243SMartin Sebor ret i1 %cmp 37d8b22243SMartin Sebor} 38d8b22243SMartin Sebor 39d8b22243SMartin Sebor 40d8b22243SMartin Sebor; Fold strchr(s, '\0') == null to false. (A string must be nul-terminated, 41d8b22243SMartin Sebor; otherwise the call would read past the end of the array.) 42d8b22243SMartin Sebor 43*4ab40ecaSBjorn Petterssondefine i1 @fold_strchr_s_nul_eqz(ptr %s) { 44d8b22243SMartin Sebor; CHECK-LABEL: @fold_strchr_s_nul_eqz( 45516915beSMartin Sebor; CHECK-NEXT: ret i1 false 46d8b22243SMartin Sebor; 47*4ab40ecaSBjorn Pettersson %p = call ptr @strchr(ptr %s, i32 0) 48*4ab40ecaSBjorn Pettersson %cmp = icmp eq ptr %p, null 49d8b22243SMartin Sebor ret i1 %cmp 50d8b22243SMartin Sebor} 51d8b22243SMartin Sebor 52d8b22243SMartin Sebor 53d8b22243SMartin Sebor; Fold strchr(s, '\0') != null to true. 54d8b22243SMartin Sebor 55*4ab40ecaSBjorn Petterssondefine i1 @fold_strchr_s_nul_nez(ptr %s) { 56d8b22243SMartin Sebor; CHECK-LABEL: @fold_strchr_s_nul_nez( 57516915beSMartin Sebor; CHECK-NEXT: ret i1 true 58d8b22243SMartin Sebor; 59*4ab40ecaSBjorn Pettersson %p = call ptr @strchr(ptr %s, i32 0) 60*4ab40ecaSBjorn Pettersson %cmp = icmp ne ptr %p, null 61d8b22243SMartin Sebor ret i1 %cmp 62d8b22243SMartin Sebor} 63d8b22243SMartin Sebor 64d8b22243SMartin Sebor 65d8b22243SMartin Sebor@a5 = constant [5 x i8] c"12345"; 66d8b22243SMartin Sebor 67d8b22243SMartin Sebor; Fold strchr(a5, c) == a5 to *a5 == c. 68d8b22243SMartin Sebor 69d8b22243SMartin Sebordefine i1 @fold_strchr_a_c_eq_a(i32 %c) { 70d8b22243SMartin Sebor; CHECK-LABEL: @fold_strchr_a_c_eq_a( 71516915beSMartin Sebor; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i8 72516915beSMartin Sebor; CHECK-NEXT: [[CHAR0CMP:%.*]] = icmp eq i8 [[TMP1]], 49 73516915beSMartin Sebor; CHECK-NEXT: ret i1 [[CHAR0CMP]] 74d8b22243SMartin Sebor; 75*4ab40ecaSBjorn Pettersson %q = call ptr @strchr(ptr @a5, i32 %c) 76*4ab40ecaSBjorn Pettersson %cmp = icmp eq ptr %q, @a5 77d8b22243SMartin Sebor ret i1 %cmp 78d8b22243SMartin Sebor} 79