| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- ; RUN: opt -early-cse -S < %s | FileCheck %s
- ; Can we CSE a known condition to a constant?
- define i1 @test(i8* %p) {
- ; CHECK-LABEL: @test
- entry:
- %cnd1 = icmp eq i8* %p, null
- br i1 %cnd1, label %taken, label %untaken
- taken:
- ; CHECK-LABEL: taken:
- ; CHECK-NEXT: ret i1 true
- %cnd2 = icmp eq i8* %p, null
- ret i1 %cnd2
- untaken:
- ; CHECK-LABEL: untaken:
- ; CHECK-NEXT: ret i1 false
- %cnd3 = icmp eq i8* %p, null
- ret i1 %cnd3
- }
- ; We can CSE the condition, but we *don't* know it's value after the merge
- define i1 @test_neg1(i8* %p) {
- ; CHECK-LABEL: @test_neg1
- entry:
- %cnd1 = icmp eq i8* %p, null
- br i1 %cnd1, label %taken, label %untaken
- taken:
- br label %merge
- untaken:
- br label %merge
- merge:
- ; CHECK-LABEL: merge:
- ; CHECK-NEXT: ret i1 %cnd1
- %cnd3 = icmp eq i8* %p, null
- ret i1 %cnd3
- }
- ; Check specifically for a case where we have a unique predecessor, but
- ; not a single predecessor. We can not know the value of the condition here.
- define i1 @test_neg2(i8* %p) {
- ; CHECK-LABEL: @test_neg2
- entry:
- %cnd1 = icmp eq i8* %p, null
- br i1 %cnd1, label %merge, label %merge
- merge:
- ; CHECK-LABEL: merge:
- ; CHECK-NEXT: ret i1 %cnd1
- %cnd3 = icmp eq i8* %p, null
- ret i1 %cnd3
- }
- ; Replace a use rather than CSE
- define i1 @test2(i8* %p) {
- ; CHECK-LABEL: @test2
- entry:
- %cnd = icmp eq i8* %p, null
- br i1 %cnd, label %taken, label %untaken
- taken:
- ; CHECK-LABEL: taken:
- ; CHECK-NEXT: ret i1 true
- ret i1 %cnd
- untaken:
- ; CHECK-LABEL: untaken:
- ; CHECK-NEXT: ret i1 false
- ret i1 %cnd
- }
- ; Not legal to replace use given it's not dominated by edge
- define i1 @test2_neg1(i8* %p) {
- ; CHECK-LABEL: @test2_neg1
- entry:
- %cnd1 = icmp eq i8* %p, null
- br i1 %cnd1, label %taken, label %untaken
- taken:
- br label %merge
- untaken:
- br label %merge
- merge:
- ; CHECK-LABEL: merge:
- ; CHECK-NEXT: ret i1 %cnd1
- ret i1 %cnd1
- }
- ; Another single predecessor test, but for dominated use
- define i1 @test2_neg2(i8* %p) {
- ; CHECK-LABEL: @test2_neg2
- entry:
- %cnd1 = icmp eq i8* %p, null
- br i1 %cnd1, label %merge, label %merge
- merge:
- ; CHECK-LABEL: merge:
- ; CHECK-NEXT: ret i1 %cnd1
- ret i1 %cnd1
- }
|