Mercurial > hg > CbC > CbC_llvm
view test/Transforms/EarlyCSE/conditional.ll @ 100:7d135dc70f03 LLVM 3.9
LLVM 3.9
author | Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 26 Jan 2016 22:53:40 +0900 |
parents | afa8332a0e37 |
children | 1172e4bd9c6f |
line wrap: on
line source
; 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 }