1c014454fSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2c014454fSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3c014454fSFlorian Hahn 4c014454fSFlorian Hahndefine i1 @test_second_or_condition_implied_by_first(i8 %x) { 5c014454fSFlorian Hahn; CHECK-LABEL: @test_second_or_condition_implied_by_first( 6c014454fSFlorian Hahn; CHECK-NEXT: entry: 7c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 8c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5 918170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 true, [[T_1]] 10c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 11c014454fSFlorian Hahn; CHECK: then: 12c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 13c014454fSFlorian Hahn; CHECK: else: 14c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 15c014454fSFlorian Hahn; 16c014454fSFlorian Hahnentry: 17c014454fSFlorian Hahn %c.1 = icmp ule i8 %x, 10 18c014454fSFlorian Hahn %t.1 = icmp ugt i8 %x, 5 19c014454fSFlorian Hahn %or = or i1 %c.1, %t.1 20c014454fSFlorian Hahn br i1 %or, label %then, label %else 21c014454fSFlorian Hahn 22c014454fSFlorian Hahnthen: 23c014454fSFlorian Hahn ret i1 0 24c014454fSFlorian Hahn 25c014454fSFlorian Hahnelse: 26c014454fSFlorian Hahn ret i1 1 27c014454fSFlorian Hahn} 28c014454fSFlorian Hahn 29c014454fSFlorian Hahndefine i1 @test_first_or_condition_implied_by_second_ops(i8 %x) { 30c014454fSFlorian Hahn; CHECK-LABEL: @test_first_or_condition_implied_by_second_ops( 31c014454fSFlorian Hahn; CHECK-NEXT: entry: 32c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 33c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5 3418170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[T_1]], true 35c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 36c014454fSFlorian Hahn; CHECK: then: 37c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 38c014454fSFlorian Hahn; CHECK: else: 39c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 40c014454fSFlorian Hahn; 41c014454fSFlorian Hahnentry: 42c014454fSFlorian Hahn %c.1 = icmp ule i8 %x, 10 43c014454fSFlorian Hahn %t.1 = icmp ugt i8 %x, 5 44c014454fSFlorian Hahn %or = or i1 %t.1, %c.1 45c014454fSFlorian Hahn br i1 %or, label %then, label %else 46c014454fSFlorian Hahn 47c014454fSFlorian Hahnthen: 48c014454fSFlorian Hahn ret i1 0 49c014454fSFlorian Hahn 50c014454fSFlorian Hahnelse: 51c014454fSFlorian Hahn ret i1 1 52c014454fSFlorian Hahn} 53c014454fSFlorian Hahn 54c014454fSFlorian Hahndefine i1 @test_second_or_condition_implied_by_first_select_form(i8 %x) { 55c014454fSFlorian Hahn; CHECK-LABEL: @test_second_or_condition_implied_by_first_select_form( 56c014454fSFlorian Hahn; CHECK-NEXT: entry: 57c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 58c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5 59c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = select i1 [[C_1]], i1 false, i1 [[T_1]] 60c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 61c014454fSFlorian Hahn; CHECK: then: 62c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 63c014454fSFlorian Hahn; CHECK: else: 64c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 65c014454fSFlorian Hahn; 66c014454fSFlorian Hahnentry: 67c014454fSFlorian Hahn %c.1 = icmp ule i8 %x, 10 68c014454fSFlorian Hahn %t.1 = icmp ugt i8 %x, 5 69c014454fSFlorian Hahn %or = select i1 %c.1, i1 false, i1 %t.1 70c014454fSFlorian Hahn br i1 %or, label %then, label %else 71c014454fSFlorian Hahn 72c014454fSFlorian Hahnthen: 73c014454fSFlorian Hahn ret i1 0 74c014454fSFlorian Hahn 75c014454fSFlorian Hahnelse: 76c014454fSFlorian Hahn ret i1 1 77c014454fSFlorian Hahn} 78c014454fSFlorian Hahn 79c014454fSFlorian Hahndefine i1 @test_first_or_condition_implied_by_second_select_form(i8 %x) { 80c014454fSFlorian Hahn; CHECK-LABEL: @test_first_or_condition_implied_by_second_select_form( 81c014454fSFlorian Hahn; CHECK-NEXT: entry: 82c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 83c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5 84c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = select i1 [[T_1]], i1 false, i1 [[C_1]] 85c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 86c014454fSFlorian Hahn; CHECK: then: 87c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 88c014454fSFlorian Hahn; CHECK: else: 89c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 90c014454fSFlorian Hahn; 91c014454fSFlorian Hahnentry: 92c014454fSFlorian Hahn %c.1 = icmp ule i8 %x, 10 93c014454fSFlorian Hahn %t.1 = icmp ugt i8 %x, 5 94c014454fSFlorian Hahn %or = select i1 %t.1, i1 false, i1 %c.1 95c014454fSFlorian Hahn br i1 %or, label %then, label %else 96c014454fSFlorian Hahn 97c014454fSFlorian Hahnthen: 98c014454fSFlorian Hahn ret i1 0 99c014454fSFlorian Hahn 100c014454fSFlorian Hahnelse: 101c014454fSFlorian Hahn ret i1 1 102c014454fSFlorian Hahn} 103c014454fSFlorian Hahn 104c014454fSFlorian Hahndefine i1 @test_same_cond_for_or(i8 %x) { 105c014454fSFlorian Hahn; CHECK-LABEL: @test_same_cond_for_or( 106c014454fSFlorian Hahn; CHECK-NEXT: entry: 107c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10 10818170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[C_1]] 109c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 110c014454fSFlorian Hahn; CHECK: then: 111c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 112c014454fSFlorian Hahn; CHECK: else: 113c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 114c014454fSFlorian Hahn; 115c014454fSFlorian Hahnentry: 116c014454fSFlorian Hahn %c.1 = icmp ugt i8 %x, 10 117c014454fSFlorian Hahn %or = or i1 %c.1, %c.1 118c014454fSFlorian Hahn br i1 %or, label %then, label %else 119c014454fSFlorian Hahn 120c014454fSFlorian Hahnthen: 121c014454fSFlorian Hahn ret i1 0 122c014454fSFlorian Hahn 123c014454fSFlorian Hahnelse: 124c014454fSFlorian Hahn ret i1 1 125c014454fSFlorian Hahn} 126c014454fSFlorian Hahn 127c014454fSFlorian Hahndefine i1 @test_same_cond_for_or_select_form(i8 %x) { 128c014454fSFlorian Hahn; CHECK-LABEL: @test_same_cond_for_or_select_form( 129c014454fSFlorian Hahn; CHECK-NEXT: entry: 130c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10 131c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = select i1 [[C_1]], i1 false, i1 [[C_1]] 132c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 133c014454fSFlorian Hahn; CHECK: then: 134c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 135c014454fSFlorian Hahn; CHECK: else: 136c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 137c014454fSFlorian Hahn; 138c014454fSFlorian Hahnentry: 139c014454fSFlorian Hahn %c.1 = icmp ugt i8 %x, 10 140c014454fSFlorian Hahn %or = select i1 %c.1, i1 false, i1 %c.1 141c014454fSFlorian Hahn br i1 %or, label %then, label %else 142c014454fSFlorian Hahn 143c014454fSFlorian Hahnthen: 144c014454fSFlorian Hahn ret i1 0 145c014454fSFlorian Hahn 146c014454fSFlorian Hahnelse: 147c014454fSFlorian Hahn ret i1 1 148c014454fSFlorian Hahn} 149c014454fSFlorian Hahn 150c014454fSFlorian Hahndefine i1 @test_second_or_condition_not_implied_by_first(i8 %x) { 151c014454fSFlorian Hahn; CHECK-LABEL: @test_second_or_condition_not_implied_by_first( 152c014454fSFlorian Hahn; CHECK-NEXT: entry: 153c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10 154c014454fSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 5 15518170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_2]], false 156c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 157c014454fSFlorian Hahn; CHECK: then: 158c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 159c014454fSFlorian Hahn; CHECK: else: 160c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 161c014454fSFlorian Hahn; 162c014454fSFlorian Hahnentry: 163c014454fSFlorian Hahn %c.1 = icmp ugt i8 %x, 10 164c014454fSFlorian Hahn %c.2 = icmp ugt i8 %x, 5 165c014454fSFlorian Hahn %or = or i1 %c.2, %c.1 166c014454fSFlorian Hahn br i1 %or, label %then, label %else 167c014454fSFlorian Hahn 168c014454fSFlorian Hahnthen: 169c014454fSFlorian Hahn ret i1 0 170c014454fSFlorian Hahn 171c014454fSFlorian Hahnelse: 172c014454fSFlorian Hahn ret i1 1 173c014454fSFlorian Hahn} 174c014454fSFlorian Hahn 175c014454fSFlorian Hahndefine i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) { 176c014454fSFlorian Hahn; CHECK-LABEL: @test_remove_variables( 177c014454fSFlorian Hahn; CHECK-NEXT: entry: 178c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN_1:%.*]], label [[EXIT:%.*]] 179c014454fSFlorian Hahn; CHECK: then.1: 180c014454fSFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C:%.*]], align 8 181c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]] 182c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]] 183c014454fSFlorian Hahn; CHECK: then.2: 184c014454fSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0 185*fbcf8a8cSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 true, [[C_3]] 186c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[OR]] 187c014454fSFlorian Hahn; CHECK: else.2: 188c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 189c014454fSFlorian Hahn; CHECK: exit: 190c014454fSFlorian Hahn; CHECK-NEXT: ret i1 true 191c014454fSFlorian Hahn; 192c014454fSFlorian Hahnentry: 193c014454fSFlorian Hahn br i1 %c, label %then.1, label %exit 194c014454fSFlorian Hahn 195c014454fSFlorian Hahnthen.1: 196c014454fSFlorian Hahn %0 = load ptr, ptr %C, align 8 197c014454fSFlorian Hahn %c.1 = icmp ult ptr %0, %A 198c014454fSFlorian Hahn br i1 %c.1, label %then.2, label %else.2 199c014454fSFlorian Hahn 200c014454fSFlorian Hahnthen.2: 201c014454fSFlorian Hahn %c.2 = icmp ne ptr %A, null 202c014454fSFlorian Hahn %c.3 = icmp sgt i64 %B, 0 203c014454fSFlorian Hahn %or = or i1 %c.2, %c.3 204c014454fSFlorian Hahn ret i1 %or 205c014454fSFlorian Hahn 206c014454fSFlorian Hahnelse.2: 207c014454fSFlorian Hahn ret i1 0 208c014454fSFlorian Hahn 209c014454fSFlorian Hahnexit: 210c014454fSFlorian Hahn %t = icmp eq ptr null, null 211c014454fSFlorian Hahn ret i1 %t 212c014454fSFlorian Hahn} 213c014454fSFlorian Hahn 214c014454fSFlorian Hahndefine i1 @test_or_op_0_simplified(i32 %v) { 215c014454fSFlorian Hahn; CHECK-LABEL: @test_or_op_0_simplified( 216c014454fSFlorian Hahn; CHECK-NEXT: entry: 217c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i32 [[V:%.*]], 0 218c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[C_1]] 219c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[OR]] 220c014454fSFlorian Hahn; 221c014454fSFlorian Hahnentry: 222c014454fSFlorian Hahn %c.1 = icmp sgt i32 %v, 0 223c014454fSFlorian Hahn %t.1 = icmp sgt i32 0, 0 224c014454fSFlorian Hahn %or = or i1 %t.1, %c.1 225c014454fSFlorian Hahn ret i1 %or 226c014454fSFlorian Hahn} 227c014454fSFlorian Hahn 228c014454fSFlorian Hahndefine i1 @test_or_op_1_simplified(i32 %v) { 229c014454fSFlorian Hahn; CHECK-LABEL: @test_or_op_1_simplified( 230c014454fSFlorian Hahn; CHECK-NEXT: entry: 231c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i32 [[V:%.*]], 0 232c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_1]], false 233c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[OR]] 234c014454fSFlorian Hahn; 235c014454fSFlorian Hahnentry: 236c014454fSFlorian Hahn %c.1 = icmp sgt i32 %v, 0 237c014454fSFlorian Hahn %t.1 = icmp sgt i32 0, 0 238c014454fSFlorian Hahn %or = or i1 %c.1, %t.1 239c014454fSFlorian Hahn ret i1 %or 240c014454fSFlorian Hahn} 241c014454fSFlorian Hahn 242c014454fSFlorian Hahndefine i1 @test_or_used_in_false_branch(i8 %x) { 243c014454fSFlorian Hahn; CHECK-LABEL: @test_or_used_in_false_branch( 244c014454fSFlorian Hahn; CHECK-NEXT: entry: 245c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10 246c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], 5 24718170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_1]], false 248c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 249c014454fSFlorian Hahn; CHECK: then: 250c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 251c014454fSFlorian Hahn; CHECK: else: 252c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 253c014454fSFlorian Hahn; 254c014454fSFlorian Hahn 255c014454fSFlorian Hahnentry: 256c014454fSFlorian Hahn %c.1 = icmp ule i8 %x, 10 257c014454fSFlorian Hahn %t.1 = icmp ule i8 %x, 5 258c014454fSFlorian Hahn %or = or i1 %c.1, %t.1 259c014454fSFlorian Hahn br i1 %or, label %then, label %else 260c014454fSFlorian Hahn 261c014454fSFlorian Hahnthen: 262c014454fSFlorian Hahn ret i1 %t.1 263c014454fSFlorian Hahn 264c014454fSFlorian Hahnelse: 265c014454fSFlorian Hahn ret i1 %t.1 266c014454fSFlorian Hahn} 267c014454fSFlorian Hahn 268c014454fSFlorian Hahndefine i1 @test_or_used_in_false_branch2(i8 %x) { 269c014454fSFlorian Hahn; CHECK-LABEL: @test_or_used_in_false_branch2( 270c014454fSFlorian Hahn; CHECK-NEXT: entry: 271c014454fSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10 272c014454fSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5 27318170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[T_1]] 274c014454fSFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 275c014454fSFlorian Hahn; CHECK: then: 276c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 277c014454fSFlorian Hahn; CHECK: else: 278c014454fSFlorian Hahn; CHECK-NEXT: ret i1 false 279c014454fSFlorian Hahn; 280c014454fSFlorian Hahn 281c014454fSFlorian Hahnentry: 282c014454fSFlorian Hahn %c.1 = icmp ugt i8 %x, 10 283c014454fSFlorian Hahn %t.1 = icmp ugt i8 %x, 5 284c014454fSFlorian Hahn %or = or i1 %c.1, %t.1 285c014454fSFlorian Hahn br i1 %or, label %then, label %else 286c014454fSFlorian Hahn 287c014454fSFlorian Hahnthen: 288c014454fSFlorian Hahn ret i1 %t.1 289c014454fSFlorian Hahn 290c014454fSFlorian Hahnelse: 291c014454fSFlorian Hahn ret i1 %t.1 292c014454fSFlorian Hahn} 293c014454fSFlorian Hahn 294c014454fSFlorian Hahndefine i1 @select_or_set_operand(ptr noundef %a, ptr noundef %b) { 295c014454fSFlorian Hahn; CHECK-LABEL: @select_or_set_operand( 296c014454fSFlorian Hahn; CHECK-NEXT: entry: 297c014454fSFlorian Hahn; CHECK-NEXT: [[CMP_EQ:%.*]] = icmp eq ptr [[A:%.*]], [[B:%.*]] 298c014454fSFlorian Hahn; CHECK-NEXT: [[INCDEC_PTR12_I:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 1 299c014454fSFlorian Hahn; CHECK-NEXT: [[CMP_EQ_1:%.*]] = icmp eq ptr [[INCDEC_PTR12_I]], [[B]] 300c014454fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = select i1 [[CMP_EQ]], i1 true, i1 [[CMP_EQ_1]] 301c014454fSFlorian Hahn; CHECK-NEXT: ret i1 [[OR]] 302c014454fSFlorian Hahn; 303c014454fSFlorian Hahnentry: 304c014454fSFlorian Hahn %cmp.eq = icmp eq ptr %a, %b 305c014454fSFlorian Hahn %incdec.ptr12.i = getelementptr inbounds i32, ptr %a, i64 1 306c014454fSFlorian Hahn %cmp.eq.1 = icmp eq ptr %incdec.ptr12.i, %b 307c014454fSFlorian Hahn %or = select i1 %cmp.eq, i1 true, i1 %cmp.eq.1 308c014454fSFlorian Hahn ret i1 %or 309c014454fSFlorian Hahn} 310